pw_kvs: Add test that reproduces failure on device.
Add a test that is patterned after the failures that were happening on
device. The new test is disabled while investigating the failure.
Change-Id: Ia71ccf3959be257a7f5ab189230a87b56ce2dbe5
diff --git a/pw_kvs/key_value_store_test.cc b/pw_kvs/key_value_store_test.cc
index 401ef8e..cc89c55 100644
--- a/pw_kvs/key_value_store_test.cc
+++ b/pw_kvs/key_value_store_test.cc
@@ -745,6 +745,65 @@
EXPECT_EQ(kvs_.size(), 1u);
}
+TEST_F(EmptyInitializedKvs, DISABLED_RepeatingValueWithOtherData) {
+ std::byte set_buf[150];
+ std::byte get_buf[sizeof(set_buf)];
+
+ for (size_t set_index = 0; set_index < sizeof(set_buf); set_index++) {
+ set_buf[set_index] = static_cast<std::byte>(set_index);
+ }
+
+ StatusWithSize result;
+
+ // Test setting the same entry 10 times but varying the amount of data
+ // that is already in env before each test
+ for (size_t test_iteration = 0; test_iteration < sizeof(set_buf);
+ test_iteration++) {
+ ASSERT_EQ(Status::OK, test_partition.Erase());
+ // Add a constant unchanging entry so that the updates are not
+ // the only entries in the env. The size of this initial entry
+ // we vary between no bytes to sizeof(set_buf).
+ ASSERT_EQ(Status::OK,
+ kvs_.Put("const_entry", span(set_buf, test_iteration)));
+
+ // The value we read back should be the last value we set
+ std::memset(get_buf, 0, sizeof(get_buf));
+ result = kvs_.Get("const_entry", span(get_buf));
+ ASSERT_TRUE(result.ok());
+ ASSERT_EQ(result.size(), test_iteration);
+ for (size_t j = 0; j < test_iteration; j++) {
+ EXPECT_EQ(set_buf[j], get_buf[j]);
+ }
+
+ // Update the test entry 5 times
+ static_assert(sizeof(std::byte) == sizeof(uint8_t));
+ uint8_t set_entry_buf[]{1, 2, 3, 4, 5, 6, 7, 8};
+ std::byte* set_entry = reinterpret_cast<std::byte*>(set_entry_buf);
+ std::byte get_entry_buf[sizeof(set_entry_buf)];
+ for (size_t i = 0; i < 5; i++) {
+ set_entry[0] = static_cast<std::byte>(i);
+ ASSERT_EQ(Status::OK,
+ kvs_.Put("test_entry", span(set_entry, sizeof(set_entry_buf))));
+ std::memset(get_entry_buf, 0, sizeof(get_entry_buf));
+ result = kvs_.Get("test_entry", span(get_entry_buf));
+ ASSERT_TRUE(result.ok());
+ ASSERT_EQ(result.size(), sizeof(get_entry_buf));
+ for (uint32_t j = 0; j < sizeof(set_entry_buf); j++) {
+ EXPECT_EQ(set_entry[j], get_entry_buf[j]);
+ }
+ }
+
+ // Check that the const entry is still present and has the right value
+ std::memset(get_buf, 0, sizeof(get_buf));
+ result = kvs_.Get("const_entry", span(get_buf));
+ ASSERT_TRUE(result.ok());
+ ASSERT_EQ(result.size(), test_iteration);
+ for (size_t j = 0; j < test_iteration; j++) {
+ EXPECT_EQ(set_buf[j], get_buf[j]);
+ }
+ }
+}
+
#if 0 // Offset reads are not yet supported
TEST_F(EmptyInitializedKvs, OffsetRead) {