blob: e5ff2f139b1a159b42c8544df50c63fd7a08251d [file] [log] [blame]
David Rogers96922572020-08-04 10:24:57 -07001// Copyright 2020 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14
15#include "pw_blob_store/blob_store.h"
16
17#include <array>
18#include <cstddef>
19#include <cstring>
20#include <span>
21
22#include "gtest/gtest.h"
23#include "pw_kvs/crc16_checksum.h"
24#include "pw_kvs/fake_flash_memory.h"
25#include "pw_kvs/flash_memory.h"
26#include "pw_kvs/test_key_value_store.h"
27#include "pw_log/log.h"
28#include "pw_random/xor_shift.h"
29
30namespace pw::blob_store {
31namespace {
32
33class BlobStoreTest : public ::testing::Test {
34 protected:
35 BlobStoreTest() : flash_(kFlashAlignment), partition_(&flash_) {}
36
37 void InitFlashTo(std::span<const std::byte> contents) {
38 partition_.Erase();
39 std::memcpy(flash_.buffer().data(), contents.data(), contents.size());
40 }
41
David Rogers22f7b3e2020-10-07 23:58:11 -070042 void InitSourceBufferToRandom(uint64_t seed,
43 size_t init_size_bytes = kBlobDataSize) {
44 ASSERT_LE(init_size_bytes, source_buffer_.size());
David Rogers96922572020-08-04 10:24:57 -070045 random::XorShiftStarRng64 rng(seed);
David Rogers22f7b3e2020-10-07 23:58:11 -070046
47 std::memset(source_buffer_.data(),
48 static_cast<int>(flash_.erased_memory_content()),
49 source_buffer_.size());
50 rng.Get(std::span(source_buffer_).first(init_size_bytes));
David Rogers5aa32ab2020-09-08 14:39:24 -070051 }
52
David Rogers22f7b3e2020-10-07 23:58:11 -070053 void InitSourceBufferToFill(char fill,
54 size_t fill_size_bytes = kBlobDataSize) {
55 ASSERT_LE(fill_size_bytes, source_buffer_.size());
56 std::memset(source_buffer_.data(),
57 static_cast<int>(flash_.erased_memory_content()),
58 source_buffer_.size());
59 std::memset(source_buffer_.data(), fill, fill_size_bytes);
David Rogers96922572020-08-04 10:24:57 -070060 }
61
62 // Fill the source buffer with random pattern based on given seed, written to
63 // BlobStore in specified chunk size.
David Rogers22f7b3e2020-10-07 23:58:11 -070064 void WriteTestBlock(size_t write_size_bytes = kBlobDataSize) {
65 ASSERT_LE(write_size_bytes, source_buffer_.size());
David Rogers96922572020-08-04 10:24:57 -070066 constexpr size_t kBufferSize = 256;
67 kvs::ChecksumCrc16 checksum;
68
David Rogers22f7b3e2020-10-07 23:58:11 -070069 ConstByteSpan write_data =
70 std::span(source_buffer_).first(write_size_bytes);
71
David Rogers96922572020-08-04 10:24:57 -070072 char name[16] = {};
David Rogers10395842020-09-16 15:39:35 -070073 snprintf(name, sizeof(name), "TestBlobBlock");
David Rogers96922572020-08-04 10:24:57 -070074
75 BlobStoreBuffer<kBufferSize> blob(
David Rogers1f08acb2020-11-17 23:11:58 -080076 name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080077 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers96922572020-08-04 10:24:57 -070078
79 BlobStore::BlobWriter writer(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080080 EXPECT_EQ(OkStatus(), writer.Open());
81 ASSERT_EQ(OkStatus(), writer.Write(write_data));
82 EXPECT_EQ(OkStatus(), writer.Close());
David Rogers96922572020-08-04 10:24:57 -070083
84 // Use reader to check for valid data.
David Rogers10395842020-09-16 15:39:35 -070085 BlobStore::BlobReader reader(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080086 ASSERT_EQ(OkStatus(), reader.Open());
David Rogers0fadf442020-09-18 10:38:15 -070087 Result<ConstByteSpan> result = reader.GetMemoryMappedBlob();
David Rogers96922572020-08-04 10:24:57 -070088 ASSERT_TRUE(result.ok());
David Rogers22f7b3e2020-10-07 23:58:11 -070089 EXPECT_EQ(write_size_bytes, result.value().size_bytes());
David Rogers84e0dec2020-11-24 14:33:18 -080090 VerifyFlash(result.value().first(write_size_bytes));
91 VerifyFlash(flash_.buffer().first(write_size_bytes));
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -080092 EXPECT_EQ(OkStatus(), reader.Close());
David Rogers96922572020-08-04 10:24:57 -070093 }
94
David Rogers10395842020-09-16 15:39:35 -070095 // Open a new blob instance and read the blob using the given read chunk size.
96 void ChunkReadTest(size_t read_chunk_size) {
97 kvs::ChecksumCrc16 checksum;
98
99 VerifyFlash(flash_.buffer());
100
101 char name[16] = "TestBlobBlock";
David Rogers1f08acb2020-11-17 23:11:58 -0800102 constexpr size_t kBufferSize = 16;
103 BlobStoreBuffer<kBufferSize> blob(
104 name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800105 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers10395842020-09-16 15:39:35 -0700106
107 // Use reader to check for valid data.
108 BlobStore::BlobReader reader1(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800109 ASSERT_EQ(OkStatus(), reader1.Open());
Ewout van Bekkumfa1fc662020-10-16 16:11:13 -0700110 Result<ConstByteSpan> possible_blob = reader1.GetMemoryMappedBlob();
111 ASSERT_TRUE(possible_blob.ok());
112 VerifyFlash(possible_blob.value());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800113 EXPECT_EQ(OkStatus(), reader1.Close());
David Rogers10395842020-09-16 15:39:35 -0700114
115 BlobStore::BlobReader reader(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800116 ASSERT_EQ(OkStatus(), reader.Open());
David Rogers10395842020-09-16 15:39:35 -0700117
David Rogers84e0dec2020-11-24 14:33:18 -0800118 std::array<std::byte, kBlobDataSize> read_buffer;
David Rogers10395842020-09-16 15:39:35 -0700119
David Rogers84e0dec2020-11-24 14:33:18 -0800120 ByteSpan read_span = read_buffer;
David Rogers10395842020-09-16 15:39:35 -0700121 while (read_span.size_bytes() > 0) {
122 size_t read_size = std::min(read_span.size_bytes(), read_chunk_size);
123
124 PW_LOG_DEBUG("Do write of %u bytes, %u bytes remain",
125 static_cast<unsigned>(read_size),
126 static_cast<unsigned>(read_span.size_bytes()));
127
128 ASSERT_EQ(read_span.size_bytes(), reader.ConservativeReadLimit());
129 auto result = reader.Read(read_span.first(read_size));
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800130 ASSERT_EQ(result.status(), OkStatus());
David Rogers10395842020-09-16 15:39:35 -0700131 read_span = read_span.subspan(read_size);
132 }
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800133 EXPECT_EQ(OkStatus(), reader.Close());
David Rogers10395842020-09-16 15:39:35 -0700134
David Rogers84e0dec2020-11-24 14:33:18 -0800135 VerifyFlash(read_buffer);
David Rogers10395842020-09-16 15:39:35 -0700136 }
137
David Rogers0fadf442020-09-18 10:38:15 -0700138 void VerifyFlash(ConstByteSpan verify_bytes, size_t offset = 0) {
David Rogers96922572020-08-04 10:24:57 -0700139 // Should be defined as same size.
David Rogers5aa32ab2020-09-08 14:39:24 -0700140 EXPECT_EQ(source_buffer_.size(), flash_.buffer().size_bytes());
David Rogers96922572020-08-04 10:24:57 -0700141
David Rogers5aa32ab2020-09-08 14:39:24 -0700142 // Can't allow it to march off the end of source_buffer_.
David Rogers10395842020-09-16 15:39:35 -0700143 ASSERT_LE((verify_bytes.size_bytes() + offset), source_buffer_.size());
David Rogers96922572020-08-04 10:24:57 -0700144
145 for (size_t i = 0; i < verify_bytes.size_bytes(); i++) {
David Rogers10395842020-09-16 15:39:35 -0700146 ASSERT_EQ(source_buffer_[i + offset], verify_bytes[i]);
David Rogers96922572020-08-04 10:24:57 -0700147 }
148 }
149
150 static constexpr size_t kFlashAlignment = 16;
151 static constexpr size_t kSectorSize = 2048;
152 static constexpr size_t kSectorCount = 2;
David Rogers10395842020-09-16 15:39:35 -0700153 static constexpr size_t kBlobDataSize = (kSectorCount * kSectorSize);
David Rogers96922572020-08-04 10:24:57 -0700154
155 kvs::FakeFlashMemoryBuffer<kSectorSize, kSectorCount> flash_;
156 kvs::FlashPartition partition_;
David Rogers10395842020-09-16 15:39:35 -0700157 std::array<std::byte, kBlobDataSize> source_buffer_;
David Rogers96922572020-08-04 10:24:57 -0700158};
159
160TEST_F(BlobStoreTest, Init_Ok) {
David Rogers22f7b3e2020-10-07 23:58:11 -0700161 // TODO: Do init test with flash/kvs explicitly in the different possible
162 // entry states.
David Rogers1f08acb2020-11-17 23:11:58 -0800163 constexpr size_t kBufferSize = 256;
164 BlobStoreBuffer<kBufferSize> blob(
165 "Blob_OK", partition_, nullptr, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800166 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers96922572020-08-04 10:24:57 -0700167}
168
David Rogers84e0dec2020-11-24 14:33:18 -0800169TEST_F(BlobStoreTest, IsOpen) {
David Rogers1f08acb2020-11-17 23:11:58 -0800170 constexpr size_t kBufferSize = 256;
171 BlobStoreBuffer<kBufferSize> blob(
172 "Blob_open", partition_, nullptr, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800173 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers84e0dec2020-11-24 14:33:18 -0800174
175 BlobStore::DeferredWriter deferred_writer(blob);
176 EXPECT_EQ(false, deferred_writer.IsOpen());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800177 EXPECT_EQ(OkStatus(), deferred_writer.Open());
David Rogers84e0dec2020-11-24 14:33:18 -0800178 EXPECT_EQ(true, deferred_writer.IsOpen());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800179 EXPECT_EQ(OkStatus(), deferred_writer.Close());
David Rogers84e0dec2020-11-24 14:33:18 -0800180 EXPECT_EQ(false, deferred_writer.IsOpen());
181
182 BlobStore::BlobWriter writer(blob);
183 EXPECT_EQ(false, writer.IsOpen());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800184 EXPECT_EQ(OkStatus(), writer.Open());
David Rogers84e0dec2020-11-24 14:33:18 -0800185 EXPECT_EQ(true, writer.IsOpen());
186
187 // Need to write something, so the blob reader is able to open.
188 std::array<std::byte, 64> tmp_buffer = {};
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800189 EXPECT_EQ(OkStatus(), writer.Write(tmp_buffer));
190 EXPECT_EQ(OkStatus(), writer.Close());
David Rogers84e0dec2020-11-24 14:33:18 -0800191 EXPECT_EQ(false, writer.IsOpen());
192
193 BlobStore::BlobReader reader(blob);
194 EXPECT_EQ(false, reader.IsOpen());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800195 ASSERT_EQ(OkStatus(), reader.Open());
David Rogers84e0dec2020-11-24 14:33:18 -0800196 EXPECT_EQ(true, reader.IsOpen());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800197 EXPECT_EQ(OkStatus(), reader.Close());
David Rogers84e0dec2020-11-24 14:33:18 -0800198 EXPECT_EQ(false, reader.IsOpen());
199}
200
David Rogers175851f2020-09-22 16:25:34 -0700201TEST_F(BlobStoreTest, Discard) {
202 InitSourceBufferToRandom(0x8675309);
203 WriteTestBlock();
David Rogers22f7b3e2020-10-07 23:58:11 -0700204 constexpr char blob_title[] = "TestBlobBlock";
205 std::array<std::byte, 64> tmp_buffer = {};
David Rogers175851f2020-09-22 16:25:34 -0700206
207 kvs::ChecksumCrc16 checksum;
David Rogers22f7b3e2020-10-07 23:58:11 -0700208
209 // TODO: Do this test with flash/kvs in the different entry state
210 // combinations.
211
David Rogers1f08acb2020-11-17 23:11:58 -0800212 constexpr size_t kBufferSize = 256;
213 BlobStoreBuffer<kBufferSize> blob(
214 blob_title, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800215 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers175851f2020-09-22 16:25:34 -0700216
217 BlobStore::BlobWriter writer(blob);
David Rogers22f7b3e2020-10-07 23:58:11 -0700218
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800219 EXPECT_EQ(OkStatus(), writer.Open());
220 EXPECT_EQ(OkStatus(), writer.Write(tmp_buffer));
David Rogers22f7b3e2020-10-07 23:58:11 -0700221
222 // The write does an implicit erase so there should be no key for this blob.
Wyatt Heplerf276c6b2020-11-11 21:13:38 -0800223 EXPECT_EQ(Status::NotFound(),
David Rogers22f7b3e2020-10-07 23:58:11 -0700224 kvs::TestKvs().Get(blob_title, tmp_buffer).status());
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800225 EXPECT_EQ(OkStatus(), writer.Close());
David Rogers22f7b3e2020-10-07 23:58:11 -0700226
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800227 EXPECT_EQ(OkStatus(), kvs::TestKvs().Get(blob_title, tmp_buffer).status());
David Rogers22f7b3e2020-10-07 23:58:11 -0700228
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800229 EXPECT_EQ(OkStatus(), writer.Open());
230 EXPECT_EQ(OkStatus(), writer.Discard());
231 EXPECT_EQ(OkStatus(), writer.Close());
David Rogers22f7b3e2020-10-07 23:58:11 -0700232
Wyatt Heplerf276c6b2020-11-11 21:13:38 -0800233 EXPECT_EQ(Status::NotFound(),
David Rogers22f7b3e2020-10-07 23:58:11 -0700234 kvs::TestKvs().Get(blob_title, tmp_buffer).status());
David Rogers175851f2020-09-22 16:25:34 -0700235}
236
David Rogers5aa32ab2020-09-08 14:39:24 -0700237TEST_F(BlobStoreTest, MultipleErase) {
David Rogers1f08acb2020-11-17 23:11:58 -0800238 constexpr size_t kBufferSize = 256;
239 BlobStoreBuffer<kBufferSize> blob(
240 "Blob_OK", partition_, nullptr, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800241 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers96922572020-08-04 10:24:57 -0700242
David Rogers5aa32ab2020-09-08 14:39:24 -0700243 BlobStore::BlobWriter writer(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800244 EXPECT_EQ(OkStatus(), writer.Open());
David Rogers96922572020-08-04 10:24:57 -0700245
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800246 EXPECT_EQ(OkStatus(), writer.Erase());
247 EXPECT_EQ(OkStatus(), writer.Erase());
248 EXPECT_EQ(OkStatus(), writer.Erase());
David Rogers5aa32ab2020-09-08 14:39:24 -0700249}
David Rogers96922572020-08-04 10:24:57 -0700250
David Rogers10395842020-09-16 15:39:35 -0700251TEST_F(BlobStoreTest, OffsetRead) {
252 InitSourceBufferToRandom(0x11309);
253 WriteTestBlock();
254
255 constexpr size_t kOffset = 10;
256 ASSERT_LT(kOffset, kBlobDataSize);
257
258 kvs::ChecksumCrc16 checksum;
259
260 char name[16] = "TestBlobBlock";
David Rogers1f08acb2020-11-17 23:11:58 -0800261 constexpr size_t kBufferSize = 16;
262 BlobStoreBuffer<kBufferSize> blob(
263 name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800264 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers10395842020-09-16 15:39:35 -0700265 BlobStore::BlobReader reader(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800266 ASSERT_EQ(OkStatus(), reader.Open(kOffset));
David Rogers10395842020-09-16 15:39:35 -0700267
David Rogers84e0dec2020-11-24 14:33:18 -0800268 std::array<std::byte, kBlobDataSize - kOffset> read_buffer;
269 ByteSpan read_span = read_buffer;
David Rogers10395842020-09-16 15:39:35 -0700270 ASSERT_EQ(read_span.size_bytes(), reader.ConservativeReadLimit());
271
272 auto result = reader.Read(read_span);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800273 ASSERT_EQ(result.status(), OkStatus());
274 EXPECT_EQ(OkStatus(), reader.Close());
David Rogers84e0dec2020-11-24 14:33:18 -0800275 VerifyFlash(read_buffer, kOffset);
David Rogers10395842020-09-16 15:39:35 -0700276}
277
278TEST_F(BlobStoreTest, InvalidReadOffset) {
279 InitSourceBufferToRandom(0x11309);
280 WriteTestBlock();
281
282 constexpr size_t kOffset = kBlobDataSize;
283
284 kvs::ChecksumCrc16 checksum;
285
286 char name[16] = "TestBlobBlock";
David Rogers1f08acb2020-11-17 23:11:58 -0800287 constexpr size_t kBufferSize = 16;
288 BlobStoreBuffer<kBufferSize> blob(
289 name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800290 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers10395842020-09-16 15:39:35 -0700291 BlobStore::BlobReader reader(blob);
Wyatt Heplerd78f7c62020-09-28 14:27:32 -0700292 ASSERT_EQ(Status::InvalidArgument(), reader.Open(kOffset));
David Rogers10395842020-09-16 15:39:35 -0700293}
294
David Rogers84e0dec2020-11-24 14:33:18 -0800295// Test reading with a read buffer larger than the available data in the
296TEST_F(BlobStoreTest, ReadBufferIsLargerThanData) {
297 InitSourceBufferToRandom(0x57326);
298
299 constexpr size_t kWriteBytes = 64;
300 WriteTestBlock(kWriteBytes);
301
302 kvs::ChecksumCrc16 checksum;
303
304 char name[16] = "TestBlobBlock";
David Rogers1f08acb2020-11-17 23:11:58 -0800305 constexpr size_t kBufferSize = 16;
306 BlobStoreBuffer<kBufferSize> blob(
307 name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800308 EXPECT_EQ(OkStatus(), blob.Init());
David Rogers84e0dec2020-11-24 14:33:18 -0800309 BlobStore::BlobReader reader(blob);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800310 ASSERT_EQ(OkStatus(), reader.Open());
David Rogers84e0dec2020-11-24 14:33:18 -0800311 EXPECT_EQ(kWriteBytes, reader.ConservativeReadLimit());
312
313 std::array<std::byte, kWriteBytes + 10> read_buffer;
314 ByteSpan read_span = read_buffer;
315
316 auto result = reader.Read(read_span);
Wyatt Hepler1b3da3a2021-01-07 13:26:57 -0800317 ASSERT_EQ(result.status(), OkStatus());
318 EXPECT_EQ(OkStatus(), reader.Close());
David Rogers84e0dec2020-11-24 14:33:18 -0800319}
320
David Rogers10395842020-09-16 15:39:35 -0700321TEST_F(BlobStoreTest, ChunkRead1) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700322 InitSourceBufferToRandom(0x8675309);
David Rogers10395842020-09-16 15:39:35 -0700323 WriteTestBlock();
324 ChunkReadTest(1);
David Rogers5aa32ab2020-09-08 14:39:24 -0700325}
David Rogers96922572020-08-04 10:24:57 -0700326
David Rogers10395842020-09-16 15:39:35 -0700327TEST_F(BlobStoreTest, ChunkRead3) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700328 InitSourceBufferToFill(0);
David Rogers10395842020-09-16 15:39:35 -0700329 WriteTestBlock();
330 ChunkReadTest(3);
David Rogers5aa32ab2020-09-08 14:39:24 -0700331}
David Rogers96922572020-08-04 10:24:57 -0700332
David Rogers10395842020-09-16 15:39:35 -0700333TEST_F(BlobStoreTest, ChunkRead4) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700334 InitSourceBufferToFill(1);
David Rogers10395842020-09-16 15:39:35 -0700335 WriteTestBlock();
336 ChunkReadTest(4);
David Rogers5aa32ab2020-09-08 14:39:24 -0700337}
338
David Rogers10395842020-09-16 15:39:35 -0700339TEST_F(BlobStoreTest, ChunkRead5) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700340 InitSourceBufferToFill(0xff);
David Rogers10395842020-09-16 15:39:35 -0700341 WriteTestBlock();
342 ChunkReadTest(5);
David Rogers5aa32ab2020-09-08 14:39:24 -0700343}
344
David Rogers10395842020-09-16 15:39:35 -0700345TEST_F(BlobStoreTest, ChunkRead16) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700346 InitSourceBufferToRandom(0x86);
David Rogers10395842020-09-16 15:39:35 -0700347 WriteTestBlock();
348 ChunkReadTest(16);
David Rogers5aa32ab2020-09-08 14:39:24 -0700349}
350
David Rogers10395842020-09-16 15:39:35 -0700351TEST_F(BlobStoreTest, ChunkRead64) {
David Rogers5aa32ab2020-09-08 14:39:24 -0700352 InitSourceBufferToRandom(0x9);
David Rogers10395842020-09-16 15:39:35 -0700353 WriteTestBlock();
354 ChunkReadTest(64);
David Rogers5aa32ab2020-09-08 14:39:24 -0700355}
356
David Rogers10395842020-09-16 15:39:35 -0700357TEST_F(BlobStoreTest, ChunkReadFull) {
358 InitSourceBufferToRandom(0x9);
359 WriteTestBlock();
360 ChunkReadTest(kBlobDataSize);
David Rogers96922572020-08-04 10:24:57 -0700361}
362
David Rogers22f7b3e2020-10-07 23:58:11 -0700363TEST_F(BlobStoreTest, PartialBufferThenClose) {
364 // Do write of only a partial chunk, which will only have bytes in buffer
365 // (none written to flash) at close.
366 size_t data_bytes = 12;
367 InitSourceBufferToRandom(0x111, data_bytes);
368 WriteTestBlock(data_bytes);
David Rogers5aa32ab2020-09-08 14:39:24 -0700369
David Rogers22f7b3e2020-10-07 23:58:11 -0700370 // Do write with several full chunks and then some partial.
371 data_bytes = 158;
372 InitSourceBufferToRandom(0x3222, data_bytes);
373}
David Rogers5aa32ab2020-09-08 14:39:24 -0700374
David Rogers22f7b3e2020-10-07 23:58:11 -0700375// Test to do write/close, write/close multiple times.
376TEST_F(BlobStoreTest, MultipleWrites) {
377 InitSourceBufferToRandom(0x1121);
378 WriteTestBlock();
379 InitSourceBufferToRandom(0x515);
380 WriteTestBlock();
381 InitSourceBufferToRandom(0x4321);
382 WriteTestBlock();
383}
David Rogers5aa32ab2020-09-08 14:39:24 -0700384
David Rogers96922572020-08-04 10:24:57 -0700385} // namespace
386} // namespace pw::blob_store