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