| // Copyright 2021 Google LLC |
| // |
| // 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 |
| // |
| // http://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 <flasher/device/mock.hpp> |
| #include <flasher/device/mutated.hpp> |
| #include <flasher/mutate/asymmetric.hpp> |
| |
| #include <cstring> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| namespace flasher |
| { |
| namespace device |
| { |
| |
| using testing::_; |
| using testing::ElementsAre; |
| |
| constexpr std::byte operator""_b(unsigned long long t) |
| { |
| return static_cast<std::byte>(t); |
| } |
| |
| class MutatedTest : public testing::Test |
| { |
| protected: |
| MutatedTest() : dev(Device::Type::Nor, 4, 4), mdev(mut, dev) {} |
| |
| testing::StrictMock<Mock> dev; |
| mutate::Asymmetric mut; |
| Mutated mdev; |
| }; |
| |
| TEST_F(MutatedTest, Read) |
| { |
| std::array<std::byte, 4> buf; |
| EXPECT_CALL(dev, readAt(_, 1)) |
| .WillOnce([](std::span<std::byte> buf, size_t) { |
| std::memset(buf.data(), 4, buf.size()); |
| return buf; |
| }); |
| EXPECT_THAT(mdev.readAt(buf, 1), ElementsAre(3_b, 2_b, 1_b, 0_b)); |
| } |
| |
| TEST_F(MutatedTest, Write) |
| { |
| std::array<std::byte, 4> data = {0_b, 0_b, 0_b, 0_b}; |
| EXPECT_CALL(dev, writeAt(_, 3)) |
| .WillOnce([](std::span<const std::byte> data, size_t) { |
| EXPECT_THAT(data, ElementsAre(3_b, 4_b, 5_b, 6_b)); |
| return data; |
| }); |
| EXPECT_THAT(mdev.writeAt(data, 3), ElementsAre(0_b, 0_b, 0_b, 0_b)); |
| } |
| |
| TEST_F(MutatedTest, Erase) |
| { |
| EXPECT_CALL(dev, eraseBlocks(3, 2)); |
| mdev.eraseBlocks(3, 2); |
| } |
| |
| } // namespace device |
| } // namespace flasher |