|
54 | 54 | import java.io.IOException; |
55 | 55 | import java.io.InputStream; |
56 | 56 | import java.net.SocketAddress; |
| 57 | +import java.util.ArrayList; |
| 58 | +import java.util.List; |
57 | 59 | import java.util.concurrent.TimeUnit; |
| 60 | +import java.util.logging.Handler; |
| 61 | +import java.util.logging.Level; |
| 62 | +import java.util.logging.LogRecord; |
| 63 | +import java.util.logging.Logger; |
58 | 64 | import org.junit.Before; |
59 | 65 | import org.junit.Rule; |
60 | 66 | import org.junit.Test; |
@@ -527,6 +533,138 @@ public void resetOnReadyThreshold() { |
527 | 533 | assertNull(options.clearOnReadyThreshold().getOnReadyThreshold()); |
528 | 534 | } |
529 | 535 |
|
| 536 | + @Test |
| 537 | + public void inboundHeadersReceived_warnsWhenServerDoesNotAdvertiseAcceptEncoding() { |
| 538 | + // Set up log capture |
| 539 | + Logger logger = Logger.getLogger(AbstractClientStream.class.getName()); |
| 540 | + Level originalLevel = logger.getLevel(); |
| 541 | + List<LogRecord> logs = new ArrayList<>(); |
| 542 | + Handler handler = new Handler() { |
| 543 | + @Override |
| 544 | + public void publish(LogRecord record) { |
| 545 | + logs.add(record); |
| 546 | + } |
| 547 | + |
| 548 | + @Override |
| 549 | + public void flush() {} |
| 550 | + |
| 551 | + @Override |
| 552 | + public void close() {} |
| 553 | + }; |
| 554 | + logger.addHandler(handler); |
| 555 | + logger.setLevel(Level.FINE); |
| 556 | + |
| 557 | + try { |
| 558 | + AbstractClientStream stream = |
| 559 | + new BaseAbstractClientStream(allocator, statsTraceCtx, transportTracer); |
| 560 | + stream.start(mockListener); |
| 561 | + |
| 562 | + // Simulate that client sent gzip-compressed messages |
| 563 | + stream.transportState().setSentMessageEncoding("gzip"); |
| 564 | + |
| 565 | + // Server responds without grpc-accept-encoding header |
| 566 | + Metadata headers = new Metadata(); |
| 567 | + stream.transportState().inboundHeadersReceived(headers); |
| 568 | + |
| 569 | + // Verify warning was logged |
| 570 | + verify(mockListener).headersRead(headers); |
| 571 | + assertThat(logs).hasSize(1); |
| 572 | + LogRecord record = logs.get(0); |
| 573 | + assertThat(record.getLevel()).isEqualTo(Level.FINE); |
| 574 | + assertThat(record.getMessage()).contains("grpc-accept-encoding"); |
| 575 | + // The parameter {0} contains the encoding |
| 576 | + assertThat(record.getParameters()).asList().contains("gzip"); |
| 577 | + } finally { |
| 578 | + logger.removeHandler(handler); |
| 579 | + logger.setLevel(originalLevel); |
| 580 | + } |
| 581 | + } |
| 582 | + |
| 583 | + @Test |
| 584 | + public void inboundHeadersReceived_noWarningWhenServerAdvertisesAcceptEncoding() { |
| 585 | + // Set up log capture |
| 586 | + Logger logger = Logger.getLogger(AbstractClientStream.class.getName()); |
| 587 | + Level originalLevel = logger.getLevel(); |
| 588 | + List<LogRecord> logs = new ArrayList<>(); |
| 589 | + Handler handler = new Handler() { |
| 590 | + @Override |
| 591 | + public void publish(LogRecord record) { |
| 592 | + logs.add(record); |
| 593 | + } |
| 594 | + |
| 595 | + @Override |
| 596 | + public void flush() {} |
| 597 | + |
| 598 | + @Override |
| 599 | + public void close() {} |
| 600 | + }; |
| 601 | + logger.addHandler(handler); |
| 602 | + logger.setLevel(Level.FINE); |
| 603 | + |
| 604 | + try { |
| 605 | + AbstractClientStream stream = |
| 606 | + new BaseAbstractClientStream(allocator, statsTraceCtx, transportTracer); |
| 607 | + stream.start(mockListener); |
| 608 | + |
| 609 | + // Simulate that client sent gzip-compressed messages |
| 610 | + stream.transportState().setSentMessageEncoding("gzip"); |
| 611 | + |
| 612 | + // Server responds with grpc-accept-encoding header |
| 613 | + Metadata headers = new Metadata(); |
| 614 | + headers.put(GrpcUtil.MESSAGE_ACCEPT_ENCODING_KEY, "gzip".getBytes(java.nio.charset.StandardCharsets.US_ASCII)); |
| 615 | + stream.transportState().inboundHeadersReceived(headers); |
| 616 | + |
| 617 | + // Verify no warning was logged |
| 618 | + verify(mockListener).headersRead(headers); |
| 619 | + assertThat(logs).isEmpty(); |
| 620 | + } finally { |
| 621 | + logger.removeHandler(handler); |
| 622 | + logger.setLevel(originalLevel); |
| 623 | + } |
| 624 | + } |
| 625 | + |
| 626 | + @Test |
| 627 | + public void inboundHeadersReceived_noWarningWhenClientDidNotUseCompression() { |
| 628 | + // Set up log capture |
| 629 | + Logger logger = Logger.getLogger(AbstractClientStream.class.getName()); |
| 630 | + Level originalLevel = logger.getLevel(); |
| 631 | + List<LogRecord> logs = new ArrayList<>(); |
| 632 | + Handler handler = new Handler() { |
| 633 | + @Override |
| 634 | + public void publish(LogRecord record) { |
| 635 | + logs.add(record); |
| 636 | + } |
| 637 | + |
| 638 | + @Override |
| 639 | + public void flush() {} |
| 640 | + |
| 641 | + @Override |
| 642 | + public void close() {} |
| 643 | + }; |
| 644 | + logger.addHandler(handler); |
| 645 | + logger.setLevel(Level.FINE); |
| 646 | + |
| 647 | + try { |
| 648 | + AbstractClientStream stream = |
| 649 | + new BaseAbstractClientStream(allocator, statsTraceCtx, transportTracer); |
| 650 | + stream.start(mockListener); |
| 651 | + |
| 652 | + // Client did not set any encoding (using identity/no compression) |
| 653 | + // sentMessageEncoding is null by default |
| 654 | + |
| 655 | + // Server responds without grpc-accept-encoding header |
| 656 | + Metadata headers = new Metadata(); |
| 657 | + stream.transportState().inboundHeadersReceived(headers); |
| 658 | + |
| 659 | + // Verify no warning was logged (client didn't use compression) |
| 660 | + verify(mockListener).headersRead(headers); |
| 661 | + assertThat(logs).isEmpty(); |
| 662 | + } finally { |
| 663 | + logger.removeHandler(handler); |
| 664 | + logger.setLevel(originalLevel); |
| 665 | + } |
| 666 | + } |
| 667 | + |
530 | 668 | /** |
531 | 669 | * No-op base class for testing. |
532 | 670 | */ |
|
0 commit comments