pw_blob_store: Don't assert on BlobReader seeks or reads

Return FAILED_PRECONDITION if seeking or reading from a closed
BlobStore::BlobReader.

Change-Id: I8ff4710d9378fd86f79f3e1e95282c09d7562de8
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/77823
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Reviewed-by: David Rogers <davidrogers@google.com>
Commit-Queue: Wyatt Hepler <hepler@google.com>
diff --git a/pw_blob_store/blob_store.cc b/pw_blob_store/blob_store.cc
index 9a1fd7b..fee5e5b 100644
--- a/pw_blob_store/blob_store.cc
+++ b/pw_blob_store/blob_store.cc
@@ -706,7 +706,10 @@
 }
 
 Status BlobStore::BlobReader::DoSeek(ptrdiff_t offset, Whence origin) {
-  PW_DCHECK(open_);
+  if (!open_) {
+    return Status::FailedPrecondition();
+  }
+
   // Note that Open ensures it is ValidToRead() which
   // in turn guarantees store_.ReadableDataBytes() > 0.
 
@@ -718,7 +721,10 @@
 }
 
 StatusWithSize BlobStore::BlobReader::DoRead(ByteSpan dest) {
-  PW_DCHECK(open_);
+  if (!open_) {
+    return StatusWithSize::FailedPrecondition();
+  }
+
   StatusWithSize status = store_.Read(offset_, dest);
   if (status.ok()) {
     offset_ += status.size();
diff --git a/pw_blob_store/blob_store_test.cc b/pw_blob_store/blob_store_test.cc
index 22dc621..11fd849 100644
--- a/pw_blob_store/blob_store_test.cc
+++ b/pw_blob_store/blob_store_test.cc
@@ -683,6 +683,27 @@
   ASSERT_EQ(Status::InvalidArgument(), reader.Open(kOffset));
 }
 
+TEST_F(BlobStoreTest, ReadSeekClosedReader) {
+  InitSourceBufferToRandom(0x11309);
+  WriteTestBlock();
+
+  kvs::ChecksumCrc16 checksum;
+
+  char name[16] = "TestBlobBlock";
+  constexpr size_t kBufferSize = 16;
+  BlobStoreBuffer<kBufferSize> blob(
+      name, partition_, &checksum, kvs::TestKvs(), kBufferSize);
+  EXPECT_EQ(OkStatus(), blob.Init());
+  BlobStore::BlobReader reader(blob);
+  ASSERT_EQ(OkStatus(), reader.Open());
+  ASSERT_EQ(OkStatus(), reader.Close());
+
+  EXPECT_EQ(Status::FailedPrecondition(), reader.Seek(0));
+
+  std::byte read_buffer[32];
+  EXPECT_EQ(Status::FailedPrecondition(), reader.Read(read_buffer).status());
+}
+
 TEST_F(BlobStoreTest, InvalidSeekOffset) {
   InitSourceBufferToRandom(0x11309);
   WriteTestBlock();