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