From 2fd5b206ff9d981ff63265678a60735781b0c0d8 Mon Sep 17 00:00:00 2001 From: Chris Schechter Date: Mon, 24 Feb 2020 17:11:11 -0800 Subject: [PATCH] okhttp: unit testing sending initialWindowSize in settings --- .../io/grpc/okhttp/OkHttpClientTransport.java | 28 ++++++++++------- .../okhttp/OkHttpClientTransportTest.java | 30 +++++++++++++++++++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java index bde9b010543c..8bfd50a2c2f4 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java @@ -605,16 +605,7 @@ sslSocketFactory, hostnameVerifier, sock, getOverridenHost(), getOverridenPort() }); // Schedule to send connection preface & settings before any other write. try { - synchronized (lock) { - frameWriter.connectionPreface(); - Settings settings = new Settings(); - OkHttpSettingsUtil.set(settings, OkHttpSettingsUtil.INITIAL_WINDOW_SIZE, initialWindowSize); - frameWriter.settings(settings); - if (initialWindowSize > DEFAULT_WINDOW_SIZE) { - frameWriter.windowUpdate( - Utils.CONNECTION_STREAM_ID, initialWindowSize - DEFAULT_WINDOW_SIZE); - } - } + sendConnectionPrefaceAndSettings(); } finally { latch.countDown(); } @@ -634,6 +625,23 @@ public void run() { return null; } + /** + * Should only be called once when the transport is first established. + */ + @VisibleForTesting + void sendConnectionPrefaceAndSettings() { + synchronized (lock) { + frameWriter.connectionPreface(); + Settings settings = new Settings(); + OkHttpSettingsUtil.set(settings, OkHttpSettingsUtil.INITIAL_WINDOW_SIZE, initialWindowSize); + frameWriter.settings(settings); + if (initialWindowSize > DEFAULT_WINDOW_SIZE) { + frameWriter.windowUpdate( + Utils.CONNECTION_STREAM_ID, initialWindowSize - DEFAULT_WINDOW_SIZE); + } + } + } + private Socket createHttpProxySocket(InetSocketAddress address, InetSocketAddress proxyAddress, String proxyUsername, String proxyPassword) throws StatusException { try { diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index 3b4b9bcfdf7a..091105efdd25 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -404,6 +404,36 @@ public void maxMessageSizeShouldBeEnforced() throws Exception { shutdownAndVerify(); } + @Test + public void includeInitialWindowSizeInFirstSettings() throws Exception { + int initialWindowSize = 65535; + startTransport( + DEFAULT_START_STREAM_ID, null, true, DEFAULT_MAX_MESSAGE_SIZE, initialWindowSize, null); + clientTransport.sendConnectionPrefaceAndSettings(); + + ArgumentCaptor settings = ArgumentCaptor.forClass(Settings.class); + verify(frameWriter, timeout(TIME_OUT_MS)).settings(settings.capture()); + assertEquals(65535, settings.getValue().get(7)); + } + + /** + * A "large" window size is anything over 65535 (the starting size for any connection-level + * flow control value). + */ + @Test + public void includeInitialWindowSizeInFirstSettings_largeWindowSize() throws Exception { + int initialWindowSize = 75535; // 65535 + 10000 + startTransport( + DEFAULT_START_STREAM_ID, null, true, DEFAULT_MAX_MESSAGE_SIZE, initialWindowSize, null); + clientTransport.sendConnectionPrefaceAndSettings(); + + ArgumentCaptor settings = ArgumentCaptor.forClass(Settings.class); + verify(frameWriter, timeout(TIME_OUT_MS)).settings(settings.capture()); + assertEquals(75535, settings.getValue().get(7)); + + verify(frameWriter, timeout(TIME_OUT_MS)).windowUpdate(0, 10000); + } + /** * When nextFrame throws IOException, the transport should be aborted. */