1 // Copyright 2012 The Chromium Authors
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 "net/base/upload_bytes_element_reader.h"
6
7 #include <memory>
8
9 #include "net/base/completion_once_callback.h"
10 #include "net/base/io_buffer.h"
11 #include "net/base/net_errors.h"
12 #include "net/test/gtest_util.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "testing/platform_test.h"
16
17 using net::test::IsOk;
18
19 namespace net {
20
21 class UploadBytesElementReaderTest : public PlatformTest {
22 protected:
SetUp()23 void SetUp() override {
24 bytes_.assign({'1', '2', '3', 'a', 'b', 'c'});
25 reader_ =
26 std::make_unique<UploadBytesElementReader>(&bytes_[0], bytes_.size());
27 ASSERT_THAT(reader_->Init(CompletionOnceCallback()), IsOk());
28 EXPECT_EQ(bytes_.size(), reader_->GetContentLength());
29 EXPECT_EQ(bytes_.size(), reader_->BytesRemaining());
30 EXPECT_TRUE(reader_->IsInMemory());
31 }
32
33 std::vector<char> bytes_;
34 std::unique_ptr<UploadElementReader> reader_;
35 };
36
TEST_F(UploadBytesElementReaderTest,ReadPartially)37 TEST_F(UploadBytesElementReaderTest, ReadPartially) {
38 const size_t kHalfSize = bytes_.size() / 2;
39 std::vector<char> buf(kHalfSize);
40 scoped_refptr<IOBuffer> wrapped_buffer =
41 base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
42 EXPECT_EQ(static_cast<int>(buf.size()),
43 reader_->Read(wrapped_buffer.get(), buf.size(),
44 CompletionOnceCallback()));
45 EXPECT_EQ(bytes_.size() - buf.size(), reader_->BytesRemaining());
46 bytes_.resize(kHalfSize); // Resize to compare.
47 EXPECT_EQ(bytes_, buf);
48 }
49
TEST_F(UploadBytesElementReaderTest,ReadAll)50 TEST_F(UploadBytesElementReaderTest, ReadAll) {
51 std::vector<char> buf(bytes_.size());
52 scoped_refptr<IOBuffer> wrapped_buffer =
53 base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
54 EXPECT_EQ(static_cast<int>(buf.size()),
55 reader_->Read(wrapped_buffer.get(), buf.size(),
56 CompletionOnceCallback()));
57 EXPECT_EQ(0U, reader_->BytesRemaining());
58 EXPECT_EQ(bytes_, buf);
59 // Try to read again.
60 EXPECT_EQ(0, reader_->Read(wrapped_buffer.get(), buf.size(),
61 CompletionOnceCallback()));
62 }
63
TEST_F(UploadBytesElementReaderTest,ReadTooMuch)64 TEST_F(UploadBytesElementReaderTest, ReadTooMuch) {
65 const size_t kTooLargeSize = bytes_.size() * 2;
66 std::vector<char> buf(kTooLargeSize);
67 scoped_refptr<IOBuffer> wrapped_buffer =
68 base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
69 EXPECT_EQ(static_cast<int>(bytes_.size()),
70 reader_->Read(wrapped_buffer.get(), buf.size(),
71 CompletionOnceCallback()));
72 EXPECT_EQ(0U, reader_->BytesRemaining());
73 buf.resize(bytes_.size()); // Resize to compare.
74 EXPECT_EQ(bytes_, buf);
75 }
76
TEST_F(UploadBytesElementReaderTest,MultipleInit)77 TEST_F(UploadBytesElementReaderTest, MultipleInit) {
78 std::vector<char> buf(bytes_.size());
79 scoped_refptr<IOBuffer> wrapped_buffer =
80 base::MakeRefCounted<WrappedIOBuffer>(buf.data(), buf.size());
81
82 // Read all.
83 EXPECT_EQ(static_cast<int>(buf.size()),
84 reader_->Read(wrapped_buffer.get(), buf.size(),
85 CompletionOnceCallback()));
86 EXPECT_EQ(0U, reader_->BytesRemaining());
87 EXPECT_EQ(bytes_, buf);
88
89 // Call Init() again to reset the state.
90 ASSERT_THAT(reader_->Init(CompletionOnceCallback()), IsOk());
91 EXPECT_EQ(bytes_.size(), reader_->GetContentLength());
92 EXPECT_EQ(bytes_.size(), reader_->BytesRemaining());
93
94 // Read again.
95 EXPECT_EQ(static_cast<int>(buf.size()),
96 reader_->Read(wrapped_buffer.get(), buf.size(),
97 CompletionOnceCallback()));
98 EXPECT_EQ(0U, reader_->BytesRemaining());
99 EXPECT_EQ(bytes_, buf);
100 }
101
102 } // namespace net
103