Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Side by Side Diff: components/cronet/android/test/javatests/src/org/chromium/net/CronetUrlRequestTest.java

Issue 2292113002: Fix CronetUrlRequestTest#testFailures flake (Closed)
Patch Set: fix affected tests Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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.os.StrictMode; 8 import android.os.StrictMode;
9 import android.test.MoreAsserts; 9 import android.test.MoreAsserts;
10 import android.test.suitebuilder.annotation.SmallTest; 10 import android.test.suitebuilder.annotation.SmallTest;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 super.tearDown(); 55 super.tearDown();
56 } 56 }
57 57
58 private TestUrlRequestCallback startAndWaitForComplete(String url) throws Ex ception { 58 private TestUrlRequestCallback startAndWaitForComplete(String url) throws Ex ception {
59 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 59 TestUrlRequestCallback callback = new TestUrlRequestCallback();
60 // Create request. 60 // Create request.
61 UrlRequest.Builder builder = new UrlRequest.Builder( 61 UrlRequest.Builder builder = new UrlRequest.Builder(
62 url, callback, callback.getExecutor(), mTestFramework.mCronetEng ine); 62 url, callback, callback.getExecutor(), mTestFramework.mCronetEng ine);
63 UrlRequest urlRequest = builder.build(); 63 UrlRequest urlRequest = builder.build();
64 urlRequest.start(); 64 urlRequest.start();
65 callback.blockForDone(); 65 callback.blockForDone();
kapishnikov 2016/08/31 18:10:27 Should we also wait for the executor to finish all
xunjieli 2016/08/31 20:03:07 Done. I think it makes sense to wait for a bit and
66 assertTrue(urlRequest.isDone()); 66 assertTrue(urlRequest.isDone());
67 return callback; 67 return callback;
68 } 68 }
69 69
70 private void checkResponseInfo(UrlResponseInfo responseInfo, String expected Url, 70 private void checkResponseInfo(UrlResponseInfo responseInfo, String expected Url,
71 int expectedHttpStatusCode, String expectedHttpStatusText) { 71 int expectedHttpStatusCode, String expectedHttpStatusText) {
72 assertEquals(expectedUrl, responseInfo.getUrl()); 72 assertEquals(expectedUrl, responseInfo.getUrl());
73 assertEquals( 73 assertEquals(
74 expectedUrl, responseInfo.getUrlChain().get(responseInfo.getUrlC hain().size() - 1)); 74 expectedUrl, responseInfo.getUrlChain().get(responseInfo.getUrlC hain().size() - 1));
75 assertEquals(expectedHttpStatusCode, responseInfo.getHttpStatusCode()); 75 assertEquals(expectedHttpStatusCode, responseInfo.getHttpStatusCode());
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 public void testMockStartAsyncError() throws Exception { 620 public void testMockStartAsyncError() throws Exception {
621 final int arbitraryNetError = -3; 621 final int arbitraryNetError = -3;
622 TestUrlRequestCallback callback = 622 TestUrlRequestCallback callback =
623 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure( 623 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure(
624 FailurePhase.START, arbitraryNetError)); 624 FailurePhase.START, arbitraryNetError));
625 assertNull(callback.mResponseInfo); 625 assertNull(callback.mResponseInfo);
626 assertNotNull(callback.mError); 626 assertNotNull(callback.mError);
627 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de()); 627 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de());
628 assertEquals(0, callback.mRedirectCount); 628 assertEquals(0, callback.mRedirectCount);
629 assertTrue(callback.mOnErrorCalled); 629 assertTrue(callback.mOnErrorCalled);
630 assertEquals(callback.mResponseStep, ResponseStep.NOTHING); 630 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
631 } 631 }
632 632
633 @SmallTest 633 @SmallTest
634 @Feature({"Cronet"}) 634 @Feature({"Cronet"})
635 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory 635 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory
636 public void testMockReadDataSyncError() throws Exception { 636 public void testMockReadDataSyncError() throws Exception {
637 final int arbitraryNetError = -4; 637 final int arbitraryNetError = -4;
638 TestUrlRequestCallback callback = 638 TestUrlRequestCallback callback =
639 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure( 639 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure(
640 FailurePhase.READ_SYNC, arbitraryNetError)); 640 FailurePhase.READ_SYNC, arbitraryNetError));
641 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 641 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
642 assertEquals(0, callback.mResponseInfo.getReceivedBytesCount()); 642 assertEquals(0, callback.mResponseInfo.getReceivedBytesCount());
643 assertNotNull(callback.mError); 643 assertNotNull(callback.mError);
644 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de()); 644 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de());
645 assertEquals(0, callback.mRedirectCount); 645 assertEquals(0, callback.mRedirectCount);
646 assertTrue(callback.mOnErrorCalled); 646 assertTrue(callback.mOnErrorCalled);
647 assertEquals(callback.mResponseStep, ResponseStep.ON_RESPONSE_STARTED); 647 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
648 } 648 }
649 649
650 @SmallTest 650 @SmallTest
651 @Feature({"Cronet"}) 651 @Feature({"Cronet"})
652 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory 652 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory
653 public void testMockReadDataAsyncError() throws Exception { 653 public void testMockReadDataAsyncError() throws Exception {
654 final int arbitraryNetError = -5; 654 final int arbitraryNetError = -5;
655 TestUrlRequestCallback callback = 655 TestUrlRequestCallback callback =
656 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure( 656 startAndWaitForComplete(MockUrlRequestJobFactory.getMockUrlWithF ailure(
657 FailurePhase.READ_ASYNC, arbitraryNetError)); 657 FailurePhase.READ_ASYNC, arbitraryNetError));
658 assertEquals(200, callback.mResponseInfo.getHttpStatusCode()); 658 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
659 assertEquals(0, callback.mResponseInfo.getReceivedBytesCount()); 659 assertEquals(0, callback.mResponseInfo.getReceivedBytesCount());
660 assertNotNull(callback.mError); 660 assertNotNull(callback.mError);
661 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de()); 661 assertEquals(arbitraryNetError, callback.mError.getCronetInternalErrorCo de());
662 assertEquals(0, callback.mRedirectCount); 662 assertEquals(0, callback.mRedirectCount);
663 assertTrue(callback.mOnErrorCalled); 663 assertTrue(callback.mOnErrorCalled);
664 assertEquals(callback.mResponseStep, ResponseStep.ON_RESPONSE_STARTED); 664 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
665 } 665 }
666 666
667 /** 667 /**
668 * Tests that request continues when client certificate is requested. 668 * Tests that request continues when client certificate is requested.
669 */ 669 */
670 @SmallTest 670 @SmallTest
671 @Feature({"Cronet"}) 671 @Feature({"Cronet"})
672 @OnlyRunNativeCronet 672 @OnlyRunNativeCronet
673 public void testMockClientCertificateRequested() throws Exception { 673 public void testMockClientCertificateRequested() throws Exception {
674 TestUrlRequestCallback callback = startAndWaitForComplete( 674 TestUrlRequestCallback callback = startAndWaitForComplete(
(...skipping 14 matching lines...) Expand all
689 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory 689 @OnlyRunNativeCronet // Java impl doesn't support MockUrlRequestJobFactory
690 public void testMockSSLCertificateError() throws Exception { 690 public void testMockSSLCertificateError() throws Exception {
691 TestUrlRequestCallback callback = startAndWaitForComplete( 691 TestUrlRequestCallback callback = startAndWaitForComplete(
692 MockUrlRequestJobFactory.getMockUrlForSSLCertificateError()); 692 MockUrlRequestJobFactory.getMockUrlForSSLCertificateError());
693 assertNull(callback.mResponseInfo); 693 assertNull(callback.mResponseInfo);
694 assertNotNull(callback.mError); 694 assertNotNull(callback.mError);
695 assertTrue(callback.mOnErrorCalled); 695 assertTrue(callback.mOnErrorCalled);
696 assertEquals(-201, callback.mError.getCronetInternalErrorCode()); 696 assertEquals(-201, callback.mError.getCronetInternalErrorCode());
697 assertEquals("Exception in CronetUrlRequest: net::ERR_CERT_DATE_INVALID" , 697 assertEquals("Exception in CronetUrlRequest: net::ERR_CERT_DATE_INVALID" ,
698 callback.mError.getMessage()); 698 callback.mError.getMessage());
699 assertEquals(callback.mResponseStep, ResponseStep.NOTHING); 699 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
700 } 700 }
701 701
702 /** 702 /**
703 * Checks that the buffer is updated correctly, when starting at an offset. 703 * Checks that the buffer is updated correctly, when starting at an offset.
704 */ 704 */
705 @SmallTest 705 @SmallTest
706 @Feature({"Cronet"}) 706 @Feature({"Cronet"})
707 public void testSimpleGetBufferUpdates() throws Exception { 707 public void testSimpleGetBufferUpdates() throws Exception {
708 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 708 TestUrlRequestCallback callback = new TestUrlRequestCallback();
709 callback.setAutoAdvance(false); 709 callback.setAutoAdvance(false);
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 boolean expectResponseInfo, boolean expectError) { 1563 boolean expectResponseInfo, boolean expectError) {
1564 if (Log.isLoggable("TESTING", Log.VERBOSE)) { 1564 if (Log.isLoggable("TESTING", Log.VERBOSE)) {
1565 Log.v("TESTING", "Testing " + failureType + " during " + failureStep ); 1565 Log.v("TESTING", "Testing " + failureType + " during " + failureStep );
1566 } 1566 }
1567 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 1567 TestUrlRequestCallback callback = new TestUrlRequestCallback();
1568 callback.setFailure(failureType, failureStep); 1568 callback.setFailure(failureType, failureStep);
1569 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.get RedirectURL(), 1569 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.get RedirectURL(),
1570 callback, callback.getExecutor(), mTestFramework.mCronetEngine); 1570 callback, callback.getExecutor(), mTestFramework.mCronetEngine);
1571 UrlRequest urlRequest = builder.build(); 1571 UrlRequest urlRequest = builder.build();
1572 urlRequest.start(); 1572 urlRequest.start();
1573 callback.blockForDone(); 1573 callback.blockForDone();
kapishnikov 2016/08/31 18:10:27 Same here. Is it possible that callback.blockForDo
xunjieli 2016/08/31 20:03:07 Done.
1574 assertEquals(1, callback.mRedirectCount); 1574 assertEquals(1, callback.mRedirectCount);
1575 assertEquals(callback.mResponseStep, failureStep); 1575 if (failureType == FailureType.CANCEL_SYNC || failureType == FailureType .CANCEL_ASYNC) {
1576 assertEquals(ResponseStep.ON_CANCELED, callback.mResponseStep);
1577 } else if (failureType == FailureType.THROW_SYNC) {
1578 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
1579 }
1576 assertTrue(urlRequest.isDone()); 1580 assertTrue(urlRequest.isDone());
1577 assertEquals(expectResponseInfo, callback.mResponseInfo != null); 1581 assertEquals(expectResponseInfo, callback.mResponseInfo != null);
1578 assertEquals(expectError, callback.mError != null); 1582 assertEquals(expectError, callback.mError != null);
1579 assertEquals(expectError, callback.mOnErrorCalled); 1583 assertEquals(expectError, callback.mOnErrorCalled);
1580 assertEquals(failureType == FailureType.CANCEL_SYNC 1584 assertEquals(failureType == FailureType.CANCEL_SYNC
1581 || failureType == FailureType.CANCEL_ASYNC 1585 || failureType == FailureType.CANCEL_ASYNC
1582 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE , 1586 || failureType == FailureType.CANCEL_ASYNC_WITHOUT_PAUSE ,
1583 callback.mOnCanceledCalled); 1587 callback.mOnCanceledCalled);
1584 } 1588 }
1585 1589
(...skipping 23 matching lines...) Expand all
1609 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED, 1613 throwOrCancel(FailureType.CANCEL_ASYNC, ResponseStep.ON_READ_COMPLETED,
1610 true, false); 1614 true, false);
1611 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RE AD_COMPLETED, 1615 throwOrCancel(FailureType.CANCEL_ASYNC_WITHOUT_PAUSE, ResponseStep.ON_RE AD_COMPLETED,
1612 true, false); 1616 true, false);
1613 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLETED, 1617 throwOrCancel(FailureType.THROW_SYNC, ResponseStep.ON_READ_COMPLETED,
1614 true, true); 1618 true, true);
1615 } 1619 }
1616 1620
1617 @SmallTest 1621 @SmallTest
1618 @Feature({"Cronet"}) 1622 @Feature({"Cronet"})
1619 public void testThrowON_SUCCEEDED() { 1623 public void testThrowOrCancelInOnSucceeded() {
1620 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 1624 FailureType[] testTypes = new FailureType[] {
1621 callback.setFailure(FailureType.THROW_SYNC, ResponseStep.ON_SUCCEEDED); 1625 FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CAN CEL_ASYNC};
1622 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.get RedirectURL(), 1626 for (FailureType type : testTypes) {
1623 callback, callback.getExecutor(), mTestFramework.mCronetEngine); 1627 TestUrlRequestCallback callback = new TestUrlRequestCallback();
1624 UrlRequest urlRequest = builder.build(); 1628 callback.setFailure(type, ResponseStep.ON_SUCCEEDED);
1625 urlRequest.start(); 1629 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer .getEchoMethodURL(),
1626 callback.blockForDone(); 1630 callback, callback.getExecutor(), mTestFramework.mCronetEngi ne);
1627 assertEquals(1, callback.mRedirectCount); 1631 UrlRequest urlRequest = builder.build();
1628 assertEquals(callback.mResponseStep, ResponseStep.ON_SUCCEEDED); 1632 urlRequest.start();
1629 assertTrue(urlRequest.isDone()); 1633 callback.blockForDone();
1630 assertNotNull(callback.mResponseInfo); 1634 // Wait for all posted tasks to be executed to ensure there is no ex ception thrown.
1631 assertNull(callback.mError); 1635 callback.shutdownExecutor();
kapishnikov 2016/08/31 18:10:27 Should we call awaitTermination() after shutdownEx
xunjieli 2016/08/31 20:03:07 Done. Good idea!
1632 assertFalse(callback.mOnErrorCalled); 1636 assertNull(callback.mError);
1637 assertEquals(ResponseStep.ON_SUCCEEDED, callback.mResponseStep);
1638 assertTrue(urlRequest.isDone());
1639 assertNotNull(callback.mResponseInfo);
1640 assertFalse(callback.mOnErrorCalled);
1641 assertEquals(200, callback.mResponseInfo.getHttpStatusCode());
1642 assertEquals("GET", callback.mResponseAsString);
1643 }
1633 } 1644 }
1634 1645
1635 @SmallTest 1646 @SmallTest
1647 @Feature({"Cronet"})
1648 public void testThrowOrCancelInOnFailed() {
1649 FailureType[] testTypes = new FailureType[] {
1650 FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CAN CEL_ASYNC};
1651 for (FailureType type : testTypes) {
1652 String url = NativeTestServer.getEchoBodyURL();
1653 // Shut down NativeTestServer so request will fail.
1654 NativeTestServer.shutdownNativeTestServer();
1655 TestUrlRequestCallback callback = new TestUrlRequestCallback();
1656 callback.setFailure(type, ResponseStep.ON_FAILED);
1657 UrlRequest.Builder builder = new UrlRequest.Builder(
1658 url, callback, callback.getExecutor(), mTestFramework.mCrone tEngine);
1659 UrlRequest urlRequest = builder.build();
1660 urlRequest.start();
1661 callback.blockForDone();
1662 // Wait for all posted tasks to be executed to ensure there is no ex ception thrown.
1663 callback.shutdownExecutor();
kapishnikov 2016/08/31 18:10:27 Same: awaitTermination()
xunjieli 2016/08/31 20:03:07 Done.
1664 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
1665 assertTrue(callback.mOnErrorCalled);
1666 assertNotNull(callback.mError);
1667 assertTrue(urlRequest.isDone());
1668 // Start NativeTestServer again to run the test for a second time.
1669 assertTrue(NativeTestServer.startNativeTestServer(getContext()));
1670 }
1671 }
1672
1673 @SmallTest
1674 @Feature({"Cronet"})
1675 public void testThrowOrCancelInOnCanceled() {
1676 FailureType[] testTypes = new FailureType[] {
1677 FailureType.THROW_SYNC, FailureType.CANCEL_SYNC, FailureType.CAN CEL_ASYNC};
1678 for (FailureType type : testTypes) {
1679 TestUrlRequestCallback callback = new TestUrlRequestCallback() {
1680 @Override
1681 public void onResponseStarted(UrlRequest request, UrlResponseInf o info) {
1682 super.onResponseStarted(request, info);
1683 request.cancel();
1684 }
1685 };
1686 callback.setFailure(type, ResponseStep.ON_CANCELED);
1687 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer .getEchoBodyURL(),
1688 callback, callback.getExecutor(), mTestFramework.mCronetEngi ne);
1689 UrlRequest urlRequest = builder.build();
1690 urlRequest.start();
1691 callback.blockForDone();
1692 // Wait for all posted tasks to be executed to ensure there is no ex ception thrown.
1693 callback.shutdownExecutor();
kapishnikov 2016/08/31 18:10:27 Same: awaitTermination()
xunjieli 2016/08/31 20:03:07 Done.
1694 assertEquals(ResponseStep.ON_CANCELED, callback.mResponseStep);
1695 assertTrue(urlRequest.isDone());
1696 assertNotNull(callback.mResponseInfo);
1697 assertNull(callback.mError);
1698 assertTrue(callback.mOnCanceledCalled);
1699 }
1700 }
1701
1702 @SmallTest
1636 @Feature({"Cronet"}) 1703 @Feature({"Cronet"})
1637 @OnlyRunNativeCronet // No destroyed callback for tests 1704 @OnlyRunNativeCronet // No destroyed callback for tests
1638 public void testExecutorShutdown() { 1705 public void testExecutorShutdown() {
1639 TestUrlRequestCallback callback = new TestUrlRequestCallback(); 1706 TestUrlRequestCallback callback = new TestUrlRequestCallback();
1640 1707
1641 callback.setAutoAdvance(false); 1708 callback.setAutoAdvance(false);
1642 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.get EchoBodyURL(), 1709 UrlRequest.Builder builder = new UrlRequest.Builder(NativeTestServer.get EchoBodyURL(),
1643 callback, callback.getExecutor(), mTestFramework.mCronetEngine); 1710 callback, callback.getExecutor(), mTestFramework.mCronetEngine);
1644 CronetUrlRequest urlRequest = (CronetUrlRequest) builder.build(); 1711 CronetUrlRequest urlRequest = (CronetUrlRequest) builder.build();
1645 urlRequest.start(); 1712 urlRequest.start();
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 TestUrlRequestCallback callback = startAndWaitForComplete( 1897 TestUrlRequestCallback callback = startAndWaitForComplete(
1831 MockUrlRequestJobFactory.getMockUrlWithFailure(FailurePhase.STAR T, netError)); 1898 MockUrlRequestJobFactory.getMockUrlWithFailure(FailurePhase.STAR T, netError));
1832 assertNull(callback.mResponseInfo); 1899 assertNull(callback.mResponseInfo);
1833 assertNotNull(callback.mError); 1900 assertNotNull(callback.mError);
1834 assertEquals(netError, callback.mError.getCronetInternalErrorCode()); 1901 assertEquals(netError, callback.mError.getCronetInternalErrorCode());
1835 assertEquals(errorCode, callback.mError.getErrorCode()); 1902 assertEquals(errorCode, callback.mError.getErrorCode());
1836 assertEquals( 1903 assertEquals(
1837 "Exception in CronetUrlRequest: net::ERR_" + name, callback.mErr or.getMessage()); 1904 "Exception in CronetUrlRequest: net::ERR_" + name, callback.mErr or.getMessage());
1838 assertEquals(0, callback.mRedirectCount); 1905 assertEquals(0, callback.mRedirectCount);
1839 assertTrue(callback.mOnErrorCalled); 1906 assertTrue(callback.mOnErrorCalled);
1840 assertEquals(callback.mResponseStep, ResponseStep.NOTHING); 1907 assertEquals(ResponseStep.ON_FAILED, callback.mResponseStep);
1841 } 1908 }
1842 1909
1843 // Returns the contents of byteBuffer, from its position() to its limit(), 1910 // Returns the contents of byteBuffer, from its position() to its limit(),
1844 // as a String. Does not modify byteBuffer's position(). 1911 // as a String. Does not modify byteBuffer's position().
1845 private String bufferContentsToString(ByteBuffer byteBuffer, int start, int end) { 1912 private String bufferContentsToString(ByteBuffer byteBuffer, int start, int end) {
1846 // Use a duplicate to avoid modifying byteBuffer. 1913 // Use a duplicate to avoid modifying byteBuffer.
1847 ByteBuffer duplicate = byteBuffer.duplicate(); 1914 ByteBuffer duplicate = byteBuffer.duplicate();
1848 duplicate.position(start); 1915 duplicate.position(start);
1849 duplicate.limit(end); 1916 duplicate.limit(end);
1850 byte[] contents = new byte[duplicate.remaining()]; 1917 byte[] contents = new byte[duplicate.remaining()];
1851 duplicate.get(contents); 1918 duplicate.get(contents);
1852 return new String(contents); 1919 return new String(contents);
1853 } 1920 }
1854 } 1921 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698