| // Copyright 2021 The Pigweed Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| // use this file except in compliance with the License. You may obtain a copy of |
| // the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| // License for the specific language governing permissions and limitations under |
| // the License. |
| |
| #include "pw_snapshot/uuid.h" |
| |
| #include <array> |
| #include <span> |
| |
| #include "gtest/gtest.h" |
| #include "pw_bytes/span.h" |
| #include "pw_protobuf/encoder.h" |
| #include "pw_result/result.h" |
| #include "pw_snapshot_metadata_proto/snapshot_metadata.pwpb.h" |
| #include "pw_status/status.h" |
| |
| namespace pw::snapshot { |
| namespace { |
| |
| ConstByteSpan EncodeSnapshotWithUuid(ConstByteSpan uuid, ByteSpan dest) { |
| SnapshotBasicInfo::MemoryEncoder snapshot_encoder(dest); |
| { |
| Metadata::StreamEncoder metadata_encoder = |
| snapshot_encoder.GetMetadataEncoder(); |
| EXPECT_EQ(OkStatus(), metadata_encoder.WriteSnapshotUuid(uuid)); |
| } |
| EXPECT_EQ(OkStatus(), snapshot_encoder.status()); |
| |
| return snapshot_encoder; |
| } |
| |
| TEST(ReadUuid, ReadUuid) { |
| const std::array<uint8_t, 8> kExpectedUuid = { |
| 0x1F, 0x8F, 0xBF, 0xC4, 0x86, 0x0E, 0xED, 0xD4}; |
| std::array<std::byte, 16> snapshot_buffer; |
| ConstByteSpan snapshot = EncodeSnapshotWithUuid( |
| std::as_bytes(std::span(kExpectedUuid)), snapshot_buffer); |
| |
| std::array<std::byte, kUuidSizeBytes> uuid_dest; |
| Result<ConstByteSpan> result = ReadUuidFromSnapshot(snapshot, uuid_dest); |
| EXPECT_EQ(OkStatus(), result.status()); |
| EXPECT_EQ(kExpectedUuid.size(), result->size()); |
| EXPECT_EQ(0, memcmp(result->data(), kExpectedUuid.data(), result->size())); |
| } |
| |
| TEST(ReadUuid, NoUuid) { |
| std::array<std::byte, 16> snapshot_buffer; |
| |
| // Write some snapshot metadata, but no UUID. |
| SnapshotBasicInfo::MemoryEncoder snapshot_encoder(snapshot_buffer); |
| { |
| Metadata::StreamEncoder metadata_encoder = |
| snapshot_encoder.GetMetadataEncoder(); |
| EXPECT_EQ(OkStatus(), metadata_encoder.WriteFatal(true)); |
| } |
| EXPECT_EQ(OkStatus(), snapshot_encoder.status()); |
| |
| ConstByteSpan snapshot(snapshot_encoder); |
| std::array<std::byte, kUuidSizeBytes> uuid_dest; |
| Result<ConstByteSpan> result = ReadUuidFromSnapshot(snapshot, uuid_dest); |
| EXPECT_EQ(Status::NotFound(), result.status()); |
| } |
| |
| TEST(ReadUuid, UndersizedBuffer) { |
| const std::array<uint8_t, 17> kExpectedUuid = {0xF4, |
| 0x1B, |
| 0xE1, |
| 0x2D, |
| 0x10, |
| 0x9B, |
| 0xB2, |
| 0x1A, |
| 0x88, |
| 0xE0, |
| 0xC4, |
| 0x77, |
| 0xCA, |
| 0x18, |
| 0x83, |
| 0xB5, |
| 0xBB}; |
| std::array<std::byte, 32> snapshot_buffer; |
| ConstByteSpan snapshot = EncodeSnapshotWithUuid( |
| std::as_bytes(std::span(kExpectedUuid)), snapshot_buffer); |
| |
| std::array<std::byte, kUuidSizeBytes> uuid_dest; |
| Result<ConstByteSpan> result = ReadUuidFromSnapshot(snapshot, uuid_dest); |
| EXPECT_EQ(Status::ResourceExhausted(), result.status()); |
| } |
| |
| } // namespace |
| } // namespace pw::snapshot |