| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.net; | 5 package org.chromium.net; |
| 6 | 6 |
| 7 import android.os.ConditionVariable; | 7 import android.os.ConditionVariable; |
| 8 import android.test.suitebuilder.annotation.SmallTest; | 8 import android.test.suitebuilder.annotation.SmallTest; |
| 9 | 9 |
| 10 import org.chromium.base.test.util.DisabledTest; | 10 import org.chromium.base.test.util.DisabledTest; |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 assertEquals("Test String1234567890woot!", callback.mResponseAsString); | 229 assertEquals("Test String1234567890woot!", callback.mResponseAsString); |
| 230 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo
").get(0)); | 230 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo
").get(0)); |
| 231 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty"
).get(0)); | 231 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty"
).get(0)); |
| 232 assertEquals( | 232 assertEquals( |
| 233 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten
t-type").get(0)); | 233 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten
t-type").get(0)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 @SmallTest | 236 @SmallTest |
| 237 @Feature({"Cronet"}) | 237 @Feature({"Cronet"}) |
| 238 @OnlyRunNativeCronet | 238 @OnlyRunNativeCronet |
| 239 public void testSimplePostWithFlush() throws Exception { |
| 240 String url = Http2TestServer.getEchoStreamUrl(); |
| 241 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); |
| 242 callback.addWriteData("Test String".getBytes(), false); |
| 243 callback.addWriteData("1234567890".getBytes(), false); |
| 244 callback.addWriteData("woot!".getBytes(), true); |
| 245 BidirectionalStream stream = new BidirectionalStream |
| 246 .Builder(url, callback, callback.ge
tExecutor(), |
| 247 mTestFramework.mCronetEngin
e) |
| 248 .disableAutoFlush(true) |
| 249 .addHeader("foo", "bar") |
| 250 .addHeader("empty", "") |
| 251 .addHeader("Content-Type", "zebra") |
| 252 .build(); |
| 253 stream.start(); |
| 254 callback.blockForDone(); |
| 255 assertTrue(stream.isDone()); |
| 256 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 257 assertEquals("Test String1234567890woot!", callback.mResponseAsString); |
| 258 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo
").get(0)); |
| 259 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty"
).get(0)); |
| 260 assertEquals( |
| 261 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten
t-type").get(0)); |
| 262 } |
| 263 |
| 264 @SmallTest |
| 265 @Feature({"Cronet"}) |
| 266 @OnlyRunNativeCronet |
| 267 public void testSimplePostWithFlushTwice() throws Exception { |
| 268 String url = Http2TestServer.getEchoStreamUrl(); |
| 269 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); |
| 270 callback.addWriteData("Test String".getBytes(), false); |
| 271 callback.addWriteData("1234567890".getBytes(), false); |
| 272 callback.addWriteData("woot!".getBytes(), true); |
| 273 callback.addWriteData("Test String".getBytes(), false); |
| 274 callback.addWriteData("1234567890".getBytes(), false); |
| 275 callback.addWriteData("woot!".getBytes(), true); |
| 276 BidirectionalStream stream = new BidirectionalStream |
| 277 .Builder(url, callback, callback.ge
tExecutor(), |
| 278 mTestFramework.mCronetEngin
e) |
| 279 .disableAutoFlush(true) |
| 280 .addHeader("foo", "bar") |
| 281 .addHeader("empty", "") |
| 282 .addHeader("Content-Type", "zebra") |
| 283 .build(); |
| 284 stream.start(); |
| 285 callback.blockForDone(); |
| 286 assertTrue(stream.isDone()); |
| 287 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 288 assertEquals( |
| 289 "Test String1234567890woot!Test String1234567890woot!", callback
.mResponseAsString); |
| 290 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo
").get(0)); |
| 291 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty"
).get(0)); |
| 292 assertEquals( |
| 293 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten
t-type").get(0)); |
| 294 } |
| 295 |
| 296 @SmallTest |
| 297 @Feature({"Cronet"}) |
| 298 @OnlyRunNativeCronet |
| 299 // Tests that it is legal to call flush() when previous nativeWritevData has |
| 300 // yet to complete. |
| 301 public void testSimplePostWithFlushBeforePreviousWriteCompleted() throws Exc
eption { |
| 302 String url = Http2TestServer.getEchoStreamUrl(); |
| 303 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback() { |
| 304 @Override |
| 305 public void onStreamReady(BidirectionalStream stream) { |
| 306 super.onStreamReady(stream); |
| 307 // Write a second time before the previous nativeWritevData has
completed. |
| 308 startNextWrite(stream); |
| 309 assertEquals(0, numPendingWrites()); |
| 310 } |
| 311 }; |
| 312 callback.addWriteData("Test String".getBytes(), false); |
| 313 callback.addWriteData("1234567890".getBytes(), false); |
| 314 callback.addWriteData("woot!".getBytes(), true); |
| 315 callback.addWriteData("Test String".getBytes(), false); |
| 316 callback.addWriteData("1234567890".getBytes(), false); |
| 317 callback.addWriteData("woot!".getBytes(), true); |
| 318 BidirectionalStream stream = new BidirectionalStream |
| 319 .Builder(url, callback, callback.ge
tExecutor(), |
| 320 mTestFramework.mCronetEngin
e) |
| 321 .disableAutoFlush(true) |
| 322 .addHeader("foo", "bar") |
| 323 .addHeader("empty", "") |
| 324 .addHeader("Content-Type", "zebra") |
| 325 .build(); |
| 326 stream.start(); |
| 327 callback.blockForDone(); |
| 328 assertTrue(stream.isDone()); |
| 329 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 330 assertEquals( |
| 331 "Test String1234567890woot!Test String1234567890woot!", callback
.mResponseAsString); |
| 332 assertEquals("bar", callback.mResponseInfo.getAllHeaders().get("echo-foo
").get(0)); |
| 333 assertEquals("", callback.mResponseInfo.getAllHeaders().get("echo-empty"
).get(0)); |
| 334 assertEquals( |
| 335 "zebra", callback.mResponseInfo.getAllHeaders().get("echo-conten
t-type").get(0)); |
| 336 } |
| 337 |
| 338 @SmallTest |
| 339 @Feature({"Cronet"}) |
| 340 @OnlyRunNativeCronet |
| 239 public void testSimplePut() throws Exception { | 341 public void testSimplePut() throws Exception { |
| 240 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); | 342 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); |
| 241 callback.addWriteData("Put This Data!".getBytes()); | 343 callback.addWriteData("Put This Data!".getBytes()); |
| 242 String methodName = "PUT"; | 344 String methodName = "PUT"; |
| 243 BidirectionalStream.Builder builder = | 345 BidirectionalStream.Builder builder = |
| 244 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(),
callback, | 346 new BidirectionalStream.Builder(Http2TestServer.getServerUrl(),
callback, |
| 245 callback.getExecutor(), mTestFramework.mCronetEngine); | 347 callback.getExecutor(), mTestFramework.mCronetEngine); |
| 246 builder.setHttpMethod(methodName); | 348 builder.setHttpMethod(methodName); |
| 247 builder.build().start(); | 349 builder.build().start(); |
| 248 callback.blockForDone(); | 350 callback.blockForDone(); |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 476 assertEquals("", callback.mResponseAsString); | 578 assertEquals("", callback.mResponseAsString); |
| 477 } | 579 } |
| 478 | 580 |
| 479 @SmallTest | 581 @SmallTest |
| 480 @Feature({"Cronet"}) | 582 @Feature({"Cronet"}) |
| 481 @OnlyRunNativeCronet | 583 @OnlyRunNativeCronet |
| 482 public void testDoubleWrite() throws Exception { | 584 public void testDoubleWrite() throws Exception { |
| 483 String url = Http2TestServer.getEchoStreamUrl(); | 585 String url = Http2TestServer.getEchoStreamUrl(); |
| 484 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback() { | 586 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback() { |
| 485 @Override | 587 @Override |
| 486 public void onRequestHeadersSent(BidirectionalStream stream) { | 588 public void onStreamReady(BidirectionalStream stream) { |
| 589 // super class will call Write() once. |
| 590 super.onStreamReady(stream); |
| 591 // Call Write() again. |
| 487 startNextWrite(stream); | 592 startNextWrite(stream); |
| 488 try { | 593 // Make sure there is no pending write. |
| 489 // Second write from callback invoked on single-threaded exe
cutor throws | 594 assertEquals(0, numPendingWrites()); |
| 490 // an exception because first write is still pending until i
ts completion | |
| 491 // is handled on executor. | |
| 492 ByteBuffer writeBuffer = ByteBuffer.allocateDirect(5); | |
| 493 writeBuffer.put("abc".getBytes()); | |
| 494 writeBuffer.flip(); | |
| 495 stream.write(writeBuffer, false); | |
| 496 fail("Exception is not thrown."); | |
| 497 } catch (Exception e) { | |
| 498 assertEquals("Unexpected write attempt.", e.getMessage()); | |
| 499 } | |
| 500 } | 595 } |
| 501 }; | 596 }; |
| 502 callback.addWriteData("1".getBytes()); | 597 callback.addWriteData("1".getBytes()); |
| 503 callback.addWriteData("2".getBytes()); | 598 callback.addWriteData("2".getBytes()); |
| 504 // Create stream. | 599 // Create stream. |
| 505 BidirectionalStream stream = new BidirectionalStream | 600 BidirectionalStream stream = new BidirectionalStream |
| 506 .Builder(url, callback, callback.ge
tExecutor(), | 601 .Builder(url, callback, callback.ge
tExecutor(), |
| 507 mTestFramework.mCronetEngin
e) | 602 mTestFramework.mCronetEngin
e) |
| 508 .build(); | 603 .build(); |
| 509 stream.start(); | 604 stream.start(); |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 callback.addWriteData(writeData.getBytes()); | 692 callback.addWriteData(writeData.getBytes()); |
| 598 stringData.append(writeData); | 693 stringData.append(writeData); |
| 599 } | 694 } |
| 600 // Create stream. | 695 // Create stream. |
| 601 BidirectionalStream stream = new BidirectionalStream | 696 BidirectionalStream stream = new BidirectionalStream |
| 602 .Builder(url, callback, callback.ge
tExecutor(), | 697 .Builder(url, callback, callback.ge
tExecutor(), |
| 603 mTestFramework.mCronetEngin
e) | 698 mTestFramework.mCronetEngin
e) |
| 604 .build(); | 699 .build(); |
| 605 stream.start(); | 700 stream.start(); |
| 606 // Write first. | 701 // Write first. |
| 607 callback.waitForNextWriteStep(); | 702 callback.waitForNextWriteStep(); // onStreamReady |
| 608 for (String expected : testData) { | 703 for (String expected : testData) { |
| 609 // Write next chunk of test data. | 704 // Write next chunk of test data. |
| 610 callback.startNextWrite(stream); | 705 callback.startNextWrite(stream); |
| 611 callback.waitForNextWriteStep(); | 706 callback.waitForNextWriteStep(); // onWriteCompleted |
| 612 } | 707 } |
| 613 | 708 |
| 614 // Wait for read step, but don't read yet. | 709 // Wait for read step, but don't read yet. |
| 615 callback.waitForNextReadStep(); | 710 callback.waitForNextReadStep(); // onResponseHeadersReceived |
| 616 assertEquals("", callback.mResponseAsString); | 711 assertEquals("", callback.mResponseAsString); |
| 617 // Read back. | 712 // Read back. |
| 618 callback.startNextRead(stream); | 713 callback.startNextRead(stream); |
| 619 callback.waitForNextReadStep(); | 714 callback.waitForNextReadStep(); // onReadCompleted |
| 620 // Verify that some part of proper response is read. | 715 // Verify that some part of proper response is read. |
| 621 assertTrue(callback.mResponseAsString.startsWith(testData[0])); | 716 assertTrue(callback.mResponseAsString.startsWith(testData[0])); |
| 622 assertTrue(stringData.toString().startsWith(callback.mResponseAsString))
; | 717 assertTrue(stringData.toString().startsWith(callback.mResponseAsString))
; |
| 623 // Read the rest of the response. | 718 // Read the rest of the response. |
| 624 callback.setAutoAdvance(true); | 719 callback.setAutoAdvance(true); |
| 625 callback.startNextRead(stream); | 720 callback.startNextRead(stream); |
| 626 callback.blockForDone(); | 721 callback.blockForDone(); |
| 627 assertTrue(stream.isDone()); | 722 assertTrue(stream.isDone()); |
| 628 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); | 723 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); |
| 629 assertEquals(stringData.toString(), callback.mResponseAsString); | 724 assertEquals(stringData.toString(), callback.mResponseAsString); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); | 911 TestBidirectionalStreamCallback callback = new TestBidirectionalStreamCa
llback(); |
| 817 callback.setFailure(failureType, failureStep); | 912 callback.setFailure(failureType, failureStep); |
| 818 BidirectionalStream.Builder builder = | 913 BidirectionalStream.Builder builder = |
| 819 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl
(), callback, | 914 new BidirectionalStream.Builder(Http2TestServer.getEchoMethodUrl
(), callback, |
| 820 callback.getExecutor(), mTestFramework.mCronetEngine); | 915 callback.getExecutor(), mTestFramework.mCronetEngine); |
| 821 BidirectionalStream stream = builder.setHttpMethod("GET").build(); | 916 BidirectionalStream stream = builder.setHttpMethod("GET").build(); |
| 822 stream.start(); | 917 stream.start(); |
| 823 callback.blockForDone(); | 918 callback.blockForDone(); |
| 824 // assertEquals(callback.mResponseStep, failureStep); | 919 // assertEquals(callback.mResponseStep, failureStep); |
| 825 assertTrue(stream.isDone()); | 920 assertTrue(stream.isDone()); |
| 826 // Cancellation when request headers are sent does not guarantee that | 921 // Cancellation when stream is ready does not guarantee that |
| 827 // mResponseInfo is null because there might be a | 922 // mResponseInfo is null because there might be a |
| 828 // onResponseHeadersReceived already queued in the executor. | 923 // onResponseHeadersReceived already queued in the executor. |
| 829 // See crbug.com/594432. | 924 // See crbug.com/594432. |
| 830 if (failureStep != ResponseStep.ON_REQUEST_HEADERS_SENT) { | 925 if (failureStep != ResponseStep.ON_STREAM_READY) { |
| 831 assertNotNull(callback.mResponseInfo); | 926 assertNotNull(callback.mResponseInfo); |
| 832 } | 927 } |
| 833 assertEquals(expectError, callback.mError != null); | 928 assertEquals(expectError, callback.mError != null); |
| 834 assertEquals(expectError, callback.mOnErrorCalled); | 929 assertEquals(expectError, callback.mOnErrorCalled); |
| 835 assertEquals(failureType == FailureType.CANCEL_SYNC | 930 assertEquals(failureType == FailureType.CANCEL_SYNC |
| 836 || failureType == FailureType.CANCEL_ASYNC | 931 || failureType == FailureType.CANCEL_ASYNC |
| 837 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE
, | 932 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE
, |
| 838 callback.mOnCanceledCalled); | 933 callback.mOnCanceledCalled); |
| 839 } | 934 } |
| 840 | 935 |
| 841 @SmallTest | 936 @SmallTest |
| 842 @Feature({"Cronet"}) | 937 @Feature({"Cronet"}) |
| 843 @OnlyRunNativeCronet | 938 @OnlyRunNativeCronet |
| 844 public void testFailures() throws Exception { | 939 public void testFailures() throws Exception { |
| 845 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_REQUEST_HEADERS_S
ENT, false); | 940 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_STREAM_READY, fal
se); |
| 846 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_REQUEST_HEADERS_
SENT, false); | 941 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_STREAM_READY, fa
lse); |
| 847 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RE
QUEST_HEADERS_SENT, | 942 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_ST
REAM_READY, false); |
| 848 false); | 943 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_STREAM_READY, true
); |
| 849 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_REQUEST_HEADERS_SE
NT, true); | |
| 850 | 944 |
| 851 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED,
false); | 945 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_RESPONSE_STARTED,
false); |
| 852 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED
, false); | 946 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_RESPONSE_STARTED
, false); |
| 853 throwOrCancel( | 947 throwOrCancel( |
| 854 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE
_STARTED, false); | 948 FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RESPONSE
_STARTED, false); |
| 855 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED,
true); | 949 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_RESPONSE_STARTED,
true); |
| 856 | 950 |
| 857 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f
alse); | 951 throwOrCancel(FailureType.CANCEL_SYNC, ResponseStep.ON_READ_COMPLETED, f
alse); |
| 858 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED,
false); | 952 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED,
false); |
| 859 throwOrCancel( | 953 throwOrCancel( |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1050 private static String bufferContentsToString(ByteBuffer byteBuffer, int star
t, int end) { | 1144 private static String bufferContentsToString(ByteBuffer byteBuffer, int star
t, int end) { |
| 1051 // Use a duplicate to avoid modifying byteBuffer. | 1145 // Use a duplicate to avoid modifying byteBuffer. |
| 1052 ByteBuffer duplicate = byteBuffer.duplicate(); | 1146 ByteBuffer duplicate = byteBuffer.duplicate(); |
| 1053 duplicate.position(start); | 1147 duplicate.position(start); |
| 1054 duplicate.limit(end); | 1148 duplicate.limit(end); |
| 1055 byte[] contents = new byte[duplicate.remaining()]; | 1149 byte[] contents = new byte[duplicate.remaining()]; |
| 1056 duplicate.get(contents); | 1150 duplicate.get(contents); |
| 1057 return new String(contents); | 1151 return new String(contents); |
| 1058 } | 1152 } |
| 1059 } | 1153 } |
| OLD | NEW |