1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "android_webview/native/input_stream_impl.h" 6 #include "base/android/jni_android.h" 7 #include "base/android/scoped_java_ref.h" 8 #include "base/memory/scoped_ptr.h" 9 #include "jni/InputStreamUnittest_jni.h" 10 #include "net/base/io_buffer.h" 11 #include "net/base/net_errors.h" 12 #include "net/http/http_byte_range.h" 13 14 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gtest/include/gtest/gtest.h" 16 17 using android_webview::InputStream; 18 using android_webview::InputStreamImpl; 19 using base::android::AttachCurrentThread; 20 using base::android::ScopedJavaLocalRef; 21 using net::IOBuffer; 22 using testing::DoAll; 23 using testing::Ge; 24 using testing::InSequence; 25 using testing::Lt; 26 using testing::Ne; 27 using testing::NotNull; 28 using testing::Return; 29 using testing::SetArgPointee; 30 using testing::Test; 31 using testing::_; 32 33 class InputStreamTest : public Test { 34 public: 35 InputStreamTest() { 36 } 37 protected: 38 virtual void SetUp() { 39 env_ = AttachCurrentThread(); 40 ASSERT_THAT(env_, NotNull()); 41 ASSERT_TRUE(android_webview::RegisterInputStream(env_)); 42 ASSERT_TRUE(RegisterNativesImpl(env_)); 43 } 44 45 scoped_refptr<IOBuffer> DoReadCountedStreamTest(int stream_size, 46 int bytes_requested, 47 int* bytes_read) { 48 ScopedJavaLocalRef<jobject> counting_jstream = 49 Java_InputStreamUnittest_getCountingStream(env_, stream_size); 50 EXPECT_FALSE(counting_jstream.is_null()); 51 52 scoped_ptr<InputStream> input_stream( 53 new InputStreamImpl(counting_jstream)); 54 scoped_refptr<IOBuffer> buffer = new IOBuffer(bytes_requested); 55 56 EXPECT_TRUE(input_stream->Read(buffer.get(), bytes_requested, bytes_read)); 57 return buffer; 58 } 59 60 JNIEnv* env_; 61 }; 62 63 TEST_F(InputStreamTest, ReadEmptyStream) { 64 ScopedJavaLocalRef<jobject> empty_jstream = 65 Java_InputStreamUnittest_getEmptyStream(env_); 66 EXPECT_FALSE(empty_jstream.is_null()); 67 68 scoped_ptr<InputStream> input_stream(new InputStreamImpl(empty_jstream)); 69 const int bytes_requested = 10; 70 int bytes_read = 0; 71 scoped_refptr<IOBuffer> buffer = new IOBuffer(bytes_requested); 72 73 EXPECT_TRUE(input_stream->Read(buffer.get(), bytes_requested, &bytes_read)); 74 EXPECT_EQ(0, bytes_read); 75 } 76 77 TEST_F(InputStreamTest, ReadStreamPartial) { 78 const int bytes_requested = 128; 79 int bytes_read = 0; 80 DoReadCountedStreamTest(bytes_requested * 2, bytes_requested, &bytes_read); 81 EXPECT_EQ(bytes_requested, bytes_read); 82 } 83 84 TEST_F(InputStreamTest, ReadStreamCompletely) { 85 const int bytes_requested = 42; 86 int bytes_read = 0; 87 DoReadCountedStreamTest(bytes_requested, bytes_requested, &bytes_read); 88 EXPECT_EQ(bytes_requested, bytes_read); 89 } 90 91 TEST_F(InputStreamTest, TryReadMoreThanBuffer) { 92 const int buffer_size = 3 * InputStreamImpl::kBufferSize; 93 int bytes_read = 0; 94 DoReadCountedStreamTest(buffer_size, buffer_size * 2, &bytes_read); 95 EXPECT_EQ(buffer_size, bytes_read); 96 } 97 98 TEST_F(InputStreamTest, CheckContentsReadCorrectly) { 99 const int bytes_requested = 256; 100 int bytes_read = 0; 101 scoped_refptr<IOBuffer> buffer = 102 DoReadCountedStreamTest(bytes_requested, bytes_requested, &bytes_read); 103 EXPECT_EQ(bytes_requested, bytes_read); 104 for (int i = 0; i < bytes_requested; ++i) { 105 EXPECT_EQ(i, (unsigned char)buffer->data()[i]); 106 } 107 } 108 109 TEST_F(InputStreamTest, ReadLargeStreamPartial) { 110 const int bytes_requested = 3 * InputStreamImpl::kBufferSize; 111 int bytes_read = 0; 112 DoReadCountedStreamTest(bytes_requested + 32, bytes_requested, &bytes_read); 113 EXPECT_EQ(bytes_requested, bytes_read); 114 } 115 116 TEST_F(InputStreamTest, ReadLargeStreamCompletely) { 117 const int bytes_requested = 3 * InputStreamImpl::kBufferSize; 118 int bytes_read = 0; 119 DoReadCountedStreamTest(bytes_requested, bytes_requested, &bytes_read); 120 EXPECT_EQ(bytes_requested, bytes_read); 121 } 122