1a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko// Copyright 2015 The Chromium OS Authors. All rights reserved.
2a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
3a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko// found in the LICENSE file.
4a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
59ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/streams/memory_stream.h>
6a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
7a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <algorithm>
8a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <limits>
9b57c2eebc4050087576f55e02deb47b0839fb467Bertrand SIMONNET#include <numeric>
10a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <string>
11a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <vector>
12a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
139ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko#include <brillo/streams/stream_errors.h>
14a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <gmock/gmock.h>
15a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko#include <gtest/gtest.h>
16a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
17a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkousing testing::DoAll;
18a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkousing testing::Return;
19a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkousing testing::SetArgPointee;
20a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkousing testing::_;
21a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
229ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
23a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
24a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkonamespace {
25a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
269ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkoint ReadByte(Stream* stream, brillo::ErrorPtr* error) {
27a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  uint8_t byte = 0;
28a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  return stream->ReadAllBlocking(&byte, sizeof(byte), error) ? byte : -1;
29a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
30a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
31a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkoclass MockMemoryContainer : public data_container::DataContainerInterface {
32a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko public:
33a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MockMemoryContainer() = default;
34a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
35a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MOCK_METHOD5(Read, bool(void*, size_t, size_t, size_t*, ErrorPtr*));
36a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MOCK_METHOD5(Write, bool(const void*, size_t, size_t, size_t*, ErrorPtr*));
37a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MOCK_METHOD2(Resize, bool(size_t, ErrorPtr*));
38a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MOCK_CONST_METHOD0(GetSize, size_t());
39a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MOCK_CONST_METHOD0(IsReadOnly, bool());
40a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
41a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko private:
42a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  DISALLOW_COPY_AND_ASSIGN(MockMemoryContainer);
43a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko};
44a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
45a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}  // anonymous namespace
46a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
47a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenkoclass MemoryStreamTest : public testing::Test {
48a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko public:
49a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  void SetUp() override {
50a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    std::unique_ptr<MockMemoryContainer> container{new MockMemoryContainer{}};
51a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    stream_.reset(new MemoryStream{std::move(container), 0});
52a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  }
53a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
54a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  MockMemoryContainer& container_mock() {
55a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    return *static_cast<MockMemoryContainer*>(stream_->container_.get());
56a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  }
57a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
58a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  inline static void* IntToPtr(int addr) {
59a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    return reinterpret_cast<void*>(addr);
60a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  }
61a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
62a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  inline static const void* IntToConstPtr(int addr) {
63a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    return reinterpret_cast<const void*>(addr);
64a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  }
65a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
66a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::unique_ptr<MemoryStream> stream_;
67a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  // Dummy buffer pointer values to make sure that input pointer values
68a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  // are delegated to the stream interface without a change.
69a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  void* const test_read_buffer_ = IntToPtr(12345);
70a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  const void* const test_write_buffer_ = IntToConstPtr(67890);
71a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  // We limit the size of memory streams to be the maximum size of either of
72a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  // size_t (on 32 bit platforms) or the size of signed 64 bit integer.
73a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  const size_t kSizeMax =
74a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko      std::min<uint64_t>(std::numeric_limits<size_t>::max(),
75a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                         std::numeric_limits<int64_t>::max());
76a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko};
77a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
78a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, CanRead) {
79a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->CanRead());
80a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
81a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
82a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, CanWrite) {
83a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), IsReadOnly())
84a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(true))
85a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(false));
86a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
87a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(stream_->CanWrite());
88a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->CanWrite());
89a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
90a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
91a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, CanSeek) {
92a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->CanSeek());
93a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
94a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
95a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, GetSize) {
96a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), GetSize())
97a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(0))
98a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(1234))
99a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(kSizeMax));
100a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
101a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream_->GetSize());
102a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(1234, stream_->GetSize());
103a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(kSizeMax, stream_->GetSize());
104a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
105a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
106a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, SetSizeBlocking) {
107a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Resize(0, _)).WillOnce(Return(true));
108a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
109a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  ErrorPtr error;
110a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->SetSizeBlocking(0, &error));
111a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(nullptr, error.get());
112a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
113a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Resize(kSizeMax, nullptr))
114a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(Return(true));
115a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
116a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->SetSizeBlocking(kSizeMax, nullptr));
117a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
118a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
119a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, SeekAndGetPosition) {
120a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream_->GetPosition());
121a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
122a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), GetSize()).WillRepeatedly(Return(200));
123a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
124a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  ErrorPtr error;
125a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  uint64_t new_pos = 0;
126a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->Seek(2, Stream::Whence::FROM_BEGIN, &new_pos, &error));
127a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(nullptr, error.get());
128a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(2, new_pos);
129a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(2, stream_->GetPosition());
130a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->Seek(2, Stream::Whence::FROM_CURRENT, &new_pos, &error));
131a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(nullptr, error.get());
132a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, new_pos);
133a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream_->GetPosition());
134a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
135a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->Seek(-2, Stream::Whence::FROM_END, nullptr, nullptr));
136a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(198, stream_->GetPosition());
137a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
138a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), GetSize()).WillOnce(Return(kSizeMax));
139a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->Seek(0, Stream::Whence::FROM_END, nullptr, nullptr));
140a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(kSizeMax, stream_->GetPosition());
141a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
142a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
143a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, ReadNonBlocking) {
144a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  size_t read = 0;
145a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  bool eos = false;
146a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
147a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Read(test_read_buffer_, 10, 0, _, nullptr))
148a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(5), Return(true)));
149a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
150a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->ReadNonBlocking(test_read_buffer_, 10, &read, &eos,
151a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                       nullptr));
152a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, read);
153a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, stream_->GetPosition());
154a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(eos);
155a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
156a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Read(test_read_buffer_, 100, 5, _, nullptr))
157a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(100), Return(true)));
158a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
159a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->ReadNonBlocking(test_read_buffer_, 100, &read, &eos,
160a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                       nullptr));
161a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(100, read);
162a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(105, stream_->GetPosition());
163a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(eos);
164a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
165a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Read(test_read_buffer_, 10, 105, _, nullptr))
166a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(0), Return(true)));
167a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
168a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->ReadNonBlocking(test_read_buffer_, 10, &read, &eos,
169a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                       nullptr));
170a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, read);
171a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(105, stream_->GetPosition());
172a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(eos);
173a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
174a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
175a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST_F(MemoryStreamTest, WriteNonBlocking) {
176a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  size_t written = 0;
177a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
178a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Write(test_write_buffer_, 10, 0, _, nullptr))
179a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(5), Return(true)));
180a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
181a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->WriteNonBlocking(test_write_buffer_, 10, &written,
182a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                        nullptr));
183a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, written);
184a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, stream_->GetPosition());
185a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
186a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Write(test_write_buffer_, 100, 5, _, nullptr))
187a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(100), Return(true)));
188a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
189a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->WriteNonBlocking(test_write_buffer_, 100, &written,
190a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                        nullptr));
191a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(100, written);
192a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(105, stream_->GetPosition());
193a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
194a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_CALL(container_mock(), Write(test_write_buffer_, 10, 105, _, nullptr))
195a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko    .WillOnce(DoAll(SetArgPointee<3>(10), Return(true)));
196a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
197a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream_->WriteNonBlocking(test_write_buffer_, 10, &written,
198a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko                                        nullptr));
199a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(115, stream_->GetPosition());
200a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
201a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
202a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko//////////////////////////////////////////////////////////////////////////////
203a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko// Factory method tests.
204a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenBinary) {
205a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  char buffer[] = {1, 2, 3};
206a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenRef(buffer, sizeof(buffer), nullptr);
207a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  buffer[0] = 5;
208a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, stream->GetSize());
209a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, ReadByte(stream.get(), nullptr));
210a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(2, ReadByte(stream.get(), nullptr));
211a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, ReadByte(stream.get(), nullptr));
2129ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko  brillo::ErrorPtr error;
213a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), &error));
214a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(errors::stream::kPartialData, error->GetCode());
215a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ("Reading past the end of stream", error->GetMessage());
216a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
217a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
218a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenBinaryCopy) {
219a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  char buffer[] = {1, 2, 3};
220a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenCopyOf(buffer, sizeof(buffer), nullptr);
221a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  buffer[0] = 5;
222a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, stream->GetSize());
223a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(1, ReadByte(stream.get(), nullptr));
224a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(2, ReadByte(stream.get(), nullptr));
225a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, ReadByte(stream.get(), nullptr));
2269ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko  brillo::ErrorPtr error;
227a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), &error));
228a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(errors::stream::kPartialData, error->GetCode());
229a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ("Reading past the end of stream", error->GetMessage());
230a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
231a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
232a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenString) {
233a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::string str("abcd");
234a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenRef(str, nullptr);
235a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  str[0] = 'A';
236a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
237a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('A', ReadByte(stream.get(), nullptr));
238a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
239a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
240a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
241a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), nullptr));
242a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
243a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
244a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenStringCopy) {
245a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::string str("abcd");
246a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenCopyOf(str, nullptr);
247a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  str[0] = 'A';
248a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
249a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('a', ReadByte(stream.get(), nullptr));
250a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
251a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
252a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
253a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), nullptr));
254a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
255a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
256a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenCharBuf) {
257a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  char str[] = "abcd";
258a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenRef(str, nullptr);
259a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  str[0] = 'A';
260a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
261a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('A', ReadByte(stream.get(), nullptr));
262a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
263a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
264a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
265a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), nullptr));
266a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
267a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
268a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenCharBufCopy) {
269a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  char str[] = "abcd";
270a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenCopyOf(str, nullptr);
271a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  str[0] = 'A';
272a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
273a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('a', ReadByte(stream.get(), nullptr));
274a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
275a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
276a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
277a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(-1, ReadByte(stream.get(), nullptr));
278a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
279a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
280a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenVector) {
281a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::vector<char> data = {'a', 'b', 'c', 'd'};
282a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenRef(data, nullptr);
283a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  data[0] = 'A';
284a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
285a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
286a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetRemainingSize());
287a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('A', ReadByte(stream.get(), nullptr));
288a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
289a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
290a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
291a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetPosition());
292a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
293a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetRemainingSize());
294a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
295a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
296a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, OpenVectorCopy) {
297a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::vector<uint8_t> data = {'a', 'b', 'c', 'd'};
298a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::OpenCopyOf(data, nullptr);
299a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  data[0] = 'A';
300a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
301a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
302a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetRemainingSize());
303a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('a', ReadByte(stream.get(), nullptr));
304a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('b', ReadByte(stream.get(), nullptr));
305a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('c', ReadByte(stream.get(), nullptr));
306a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ('d', ReadByte(stream.get(), nullptr));
307a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetPosition());
308a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(4, stream->GetSize());
309a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetRemainingSize());
310a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
311a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
312a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, CreateVector) {
313a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::vector<uint8_t> buffer;
314a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::CreateRef(&buffer, nullptr);
315a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(buffer.empty());
316a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
317a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetSize());
318a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
319a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
320a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  buffer.resize(5);
321a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::iota(buffer.begin(), buffer.end(), 0);
322a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  stream = MemoryStream::CreateRef(&buffer, nullptr);
323a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
324a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
325a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, stream->GetSize());
326a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
327a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
328a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  stream = MemoryStream::CreateRefForAppend(&buffer, nullptr);
329a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
330a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, stream->GetPosition());
331a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(5, stream->GetSize());
332a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->WriteAllBlocking("abcde", 5, nullptr));
333a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
334a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(10, stream->GetPosition());
335a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(10, stream->GetSize());
336a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->SetPosition(0, nullptr));
337a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
338a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(10, stream->GetSize());
339a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
340a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
341a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(10, buffer.size());
342a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ((std::vector<uint8_t>{0, 1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e'}),
343a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko            buffer);
344a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
345a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  stream = MemoryStream::OpenRef(buffer, nullptr);
346a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
347a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
348a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(10, stream->GetSize());
349a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
350a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
351a6e481952f653d9171b6829fb082ba2d9bb3d477Alex VakulenkoTEST(MemoryStream, CreateString) {
352a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  std::string buffer;
353a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  StreamPtr stream = MemoryStream::CreateRef(&buffer, nullptr);
354a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(buffer.empty());
355a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
356a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetSize());
357a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
358a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
359a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  buffer = "abc";
360a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  stream = MemoryStream::CreateRef(&buffer, nullptr);
361a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
362a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
363a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, stream->GetSize());
364a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
365a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
366a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  stream = MemoryStream::CreateRefForAppend(&buffer, nullptr);
367a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
368a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, stream->GetPosition());
369a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(3, stream->GetSize());
370a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->WriteAllBlocking("d_1234", 6, nullptr));
371a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_FALSE(buffer.empty());
372a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(9, stream->GetPosition());
373a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(9, stream->GetSize());
374a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->SetPosition(0, nullptr));
375a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(0, stream->GetPosition());
376a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(9, stream->GetSize());
377a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_TRUE(stream->CloseBlocking(nullptr));
378a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ(9, buffer.size());
379a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko  EXPECT_EQ("abcd_1234", buffer);
380a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko}
381a6e481952f653d9171b6829fb082ba2d9bb3d477Alex Vakulenko
3829ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
383