1 // Copyright 2023 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_persistent_ram/flat_file_system_entry.h"
16
17 #include "pw_unit_test/framework.h"
18
19 namespace pw::persistent_ram {
20 namespace {
21
22 class FlatFileSystemPersistentBufferEntryTest : public ::testing::Test {
23 protected:
24 static constexpr uint32_t kBufferSize = 16;
25 static constexpr size_t kMaxFileNameLength = 32;
26
FlatFileSystemPersistentBufferEntryTest()27 FlatFileSystemPersistentBufferEntryTest() {}
28
29 // Emulate invalidation of persistent section(s).
ZeroPersistentMemory()30 void ZeroPersistentMemory() { memset(buffer_, 0, sizeof(buffer_)); }
31
GetPersistentBuffer()32 PersistentBuffer<kBufferSize>& GetPersistentBuffer() {
33 return *(new (buffer_) PersistentBuffer<kBufferSize>());
34 }
35
36 // Allocate a chunk of aligned storage that can be independently controlled.
37 alignas(PersistentBuffer<kBufferSize>)
38 std::byte buffer_[sizeof(PersistentBuffer<kBufferSize>)];
39 };
40
TEST_F(FlatFileSystemPersistentBufferEntryTest,BasicProperties)41 TEST_F(FlatFileSystemPersistentBufferEntryTest, BasicProperties) {
42 constexpr std::string_view kExpectedFileName("file_1.bin");
43 constexpr file::FlatFileSystemService::Entry::Id kExpectedFileId = 7;
44 constexpr file::FlatFileSystemService::Entry::FilePermissions
45 kExpectedPermissions =
46 file::FlatFileSystemService::Entry::FilePermissions::READ;
47
48 ZeroPersistentMemory();
49 auto& persistent = GetPersistentBuffer();
50
51 // write some data to create the file
52 constexpr uint32_t kExpectedNumber = 0x6C2C6582;
53 auto writer = persistent.GetWriter();
54 ASSERT_EQ(OkStatus(), writer.Write(as_bytes(span(&kExpectedNumber, 1))));
55
56 FlatFileSystemPersistentBufferEntry persistent_file(
57 kExpectedFileName, kExpectedFileId, kExpectedPermissions, persistent);
58
59 std::array<char, kMaxFileNameLength> tmp_buffer = {};
60 static_assert(kExpectedFileName.size() <= tmp_buffer.size());
61 StatusWithSize sws = persistent_file.Name(tmp_buffer);
62 ASSERT_EQ(OkStatus(), sws.status());
63
64 EXPECT_EQ(
65 0, std::memcmp(tmp_buffer.data(), kExpectedFileName.data(), sws.size()));
66 EXPECT_EQ(sizeof(kExpectedNumber), persistent_file.SizeBytes());
67 EXPECT_EQ(kExpectedPermissions, persistent_file.Permissions());
68 EXPECT_EQ(kExpectedFileId, persistent_file.FileId());
69 }
70
TEST_F(FlatFileSystemPersistentBufferEntryTest,Delete)71 TEST_F(FlatFileSystemPersistentBufferEntryTest, Delete) {
72 constexpr std::string_view kExpectedFileName("file_2.bin");
73 constexpr file::FlatFileSystemService::Entry::Id kExpectedFileId = 8;
74 constexpr file::FlatFileSystemService::Entry::FilePermissions
75 kExpectedPermissions =
76 file::FlatFileSystemService::Entry::FilePermissions::WRITE;
77
78 ZeroPersistentMemory();
79 auto& persistent = GetPersistentBuffer();
80
81 // write some data to create the file
82 constexpr uint32_t kExpectedNumber = 0x6C2C6582;
83 auto writer = persistent.GetWriter();
84 ASSERT_EQ(OkStatus(), writer.Write(as_bytes(span(&kExpectedNumber, 1))));
85
86 FlatFileSystemPersistentBufferEntry persistent_file(
87 kExpectedFileName, kExpectedFileId, kExpectedPermissions, persistent);
88
89 std::array<char, kMaxFileNameLength> tmp_buffer = {};
90 static_assert(kExpectedFileName.size() <= tmp_buffer.size());
91 StatusWithSize sws = persistent_file.Name(tmp_buffer);
92 ASSERT_EQ(OkStatus(), sws.status());
93
94 EXPECT_EQ(
95 0, std::memcmp(tmp_buffer.data(), kExpectedFileName.data(), sws.size()));
96 EXPECT_EQ(sizeof(kExpectedNumber), persistent_file.SizeBytes());
97
98 ASSERT_EQ(OkStatus(), persistent_file.Delete());
99
100 sws = persistent_file.Name(tmp_buffer);
101 ASSERT_EQ(Status::NotFound(), sws.status());
102 EXPECT_EQ(0u, persistent_file.SizeBytes());
103 }
104
TEST_F(FlatFileSystemPersistentBufferEntryTest,NoData)105 TEST_F(FlatFileSystemPersistentBufferEntryTest, NoData) {
106 constexpr std::string_view kExpectedFileName("file_2.bin");
107 constexpr file::FlatFileSystemService::Entry::Id kExpectedFileId = 9;
108 constexpr file::FlatFileSystemService::Entry::FilePermissions
109 kExpectedPermissions =
110 file::FlatFileSystemService::Entry::FilePermissions::READ_AND_WRITE;
111
112 ZeroPersistentMemory();
113 auto& persistent = GetPersistentBuffer();
114
115 FlatFileSystemPersistentBufferEntry persistent_file(
116 kExpectedFileName, kExpectedFileId, kExpectedPermissions, persistent);
117
118 std::array<char, kMaxFileNameLength> tmp_buffer = {};
119 static_assert(kExpectedFileName.size() <= tmp_buffer.size());
120
121 StatusWithSize sws = persistent_file.Name(tmp_buffer);
122 ASSERT_EQ(Status::NotFound(), sws.status());
123 EXPECT_EQ(0u, persistent_file.SizeBytes());
124 }
125
126 } // namespace
127 } // namespace pw::persistent_ram
128