/* * Copyright (C) 2016 The Android Open Source Project * * 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 #include #include #include #include #include #include #include "misc_writer/misc_writer.h" using namespace std::string_literals; namespace android { namespace hardware { namespace google { namespace pixel { class MiscWriterTest : public ::testing::Test { protected: void TearDown() override { // Clear the vendor space. auto zeros = std::string(WIPE_PACKAGE_OFFSET_IN_MISC - VENDOR_SPACE_OFFSET_IN_MISC, 0); std::string err; ASSERT_TRUE(MiscWriter::WriteMiscPartitionVendorSpace(zeros.data(), zeros.size(), 0, &err)) << err; } void CheckMiscPartitionVendorSpaceContent(size_t offset, const std::string& expected); std::unique_ptr misc_writer_; }; void MiscWriterTest::CheckMiscPartitionVendorSpaceContent(size_t offset, const std::string& expected) { ASSERT_TRUE(MiscWriter::OffsetAndSizeInVendorSpace(offset, expected.size())); std::string err; auto misc_blk_device = get_misc_blk_device(&err); ASSERT_FALSE(misc_blk_device.empty()); android::base::unique_fd fd(open(misc_blk_device.c_str(), O_RDONLY)); ASSERT_NE(-1, fd); std::string content(expected.size(), 0); ASSERT_TRUE(android::base::ReadFullyAtOffset(fd, content.data(), content.size(), VENDOR_SPACE_OFFSET_IN_MISC + offset)); ASSERT_EQ(expected, content); } TEST_F(MiscWriterTest, SetClearDarkTheme) { misc_writer_ = std::make_unique(MiscWriterActions::kSetDarkThemeFlag); ASSERT_TRUE(misc_writer_); ASSERT_TRUE(misc_writer_->PerformAction()); std::string expected = "theme-dark"; CheckMiscPartitionVendorSpaceContent(0, expected); misc_writer_ = std::make_unique(MiscWriterActions::kClearDarkThemeFlag); ASSERT_TRUE(misc_writer_->PerformAction()); std::string zeros(expected.size(), 0); CheckMiscPartitionVendorSpaceContent(0, zeros); } TEST_F(MiscWriterTest, SetClearDarkTheme_OffsetOverride) { misc_writer_ = std::make_unique(MiscWriterActions::kSetDarkThemeFlag); size_t offset = 12360; ASSERT_TRUE(misc_writer_->PerformAction(offset)); std::string expected = "theme-dark"; CheckMiscPartitionVendorSpaceContent(offset, expected); misc_writer_ = std::make_unique(MiscWriterActions::kClearDarkThemeFlag); ASSERT_TRUE(misc_writer_->PerformAction(offset)); std::string zeros(expected.size(), 0); CheckMiscPartitionVendorSpaceContent(offset, zeros); } TEST_F(MiscWriterTest, SetClearSota) { misc_writer_ = std::make_unique(MiscWriterActions::kSetSotaFlag); ASSERT_TRUE(misc_writer_); ASSERT_TRUE(misc_writer_->PerformAction()); std::string expected = "enable-sota"; CheckMiscPartitionVendorSpaceContent(32, expected); // Test we can write to the override offset. size_t override_offset = 12360; ASSERT_FALSE(misc_writer_->PerformAction(override_offset)); CheckMiscPartitionVendorSpaceContent(override_offset, expected); misc_writer_ = std::make_unique(MiscWriterActions::kClearSotaFlag); ASSERT_TRUE(misc_writer_->PerformAction()); std::string zeros(expected.size(), 0); CheckMiscPartitionVendorSpaceContent(32, zeros); } TEST_F(MiscWriterTest, WriteMiscPartitionVendorSpace) { std::string kTestMessage = "kTestMessage"; std::string err; ASSERT_TRUE( MiscWriter::WriteMiscPartitionVendorSpace(kTestMessage.data(), kTestMessage.size(), 0, &err)); CheckMiscPartitionVendorSpaceContent(0, kTestMessage); // Write with an offset. ASSERT_TRUE(MiscWriter::WriteMiscPartitionVendorSpace("\x00\x00", 2, 5, &err)); CheckMiscPartitionVendorSpaceContent(0, "kTest\x00\x00ssage"s); // Write with the right size. auto start_offset = WIPE_PACKAGE_OFFSET_IN_MISC - VENDOR_SPACE_OFFSET_IN_MISC - kTestMessage.size(); ASSERT_TRUE(MiscWriter::WriteMiscPartitionVendorSpace(kTestMessage.data(), kTestMessage.size(), start_offset, &err)); // Out-of-bound write. ASSERT_FALSE(MiscWriter::WriteMiscPartitionVendorSpace(kTestMessage.data(), kTestMessage.size(), start_offset + 1, &err)); // Message won't fit. std::string long_message(WIPE_PACKAGE_OFFSET_IN_MISC - VENDOR_SPACE_OFFSET_IN_MISC + 1, 'a'); ASSERT_FALSE( MiscWriter::WriteMiscPartitionVendorSpace(long_message.data(), long_message.size(), 0, &err)); } } // namespace pixel } // namespace google } // namespace hardware } // namespace android