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 17using android_webview::InputStream; 18using android_webview::InputStreamImpl; 19using base::android::AttachCurrentThread; 20using base::android::ScopedJavaLocalRef; 21using net::IOBuffer; 22using testing::DoAll; 23using testing::Ge; 24using testing::InSequence; 25using testing::Lt; 26using testing::Ne; 27using testing::NotNull; 28using testing::Return; 29using testing::SetArgPointee; 30using testing::Test; 31using testing::_; 32 33class 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 63TEST_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 77TEST_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 84TEST_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 91TEST_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 98TEST_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 109TEST_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 116TEST_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 123TEST_F(InputStreamTest, DoesNotCrashWhenExceptionThrown) { 124 ScopedJavaLocalRef<jobject> throw_jstream = 125 Java_InputStreamUnittest_getThrowingStream(env_); 126 EXPECT_FALSE(throw_jstream.is_null()); 127 128 scoped_ptr<InputStream> input_stream(new InputStreamImpl(throw_jstream)); 129 130 int64_t bytes_skipped; 131 EXPECT_FALSE(input_stream->Skip(10, &bytes_skipped)); 132 133 int bytes_available; 134 EXPECT_FALSE(input_stream->BytesAvailable(&bytes_available)); 135 136 137 const int bytes_requested = 10; 138 int bytes_read = 0; 139 scoped_refptr<IOBuffer> buffer = new IOBuffer(bytes_requested); 140 EXPECT_FALSE(input_stream->Read(buffer.get(), bytes_requested, &bytes_read)); 141 EXPECT_EQ(0, bytes_read); 142 143 // This closes the stream. 144 input_stream.reset(NULL); 145} 146