141 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
| /*
 | |
|  * 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 <memory>
 | |
| #include <string>
 | |
| #include <string_view>
 | |
| #include <vector>
 | |
| 
 | |
| #include <android-base/file.h>
 | |
| #include <bootloader_message/bootloader_message.h>
 | |
| #include <gtest/gtest.h>
 | |
| 
 | |
| #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<MiscWriter> 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<MiscWriter>(MiscWriterActions::kSetDarkThemeFlag);
 | |
|   ASSERT_TRUE(misc_writer_);
 | |
|   ASSERT_TRUE(misc_writer_->PerformAction());
 | |
|   std::string expected = "theme-dark";
 | |
|   CheckMiscPartitionVendorSpaceContent(0, expected);
 | |
| 
 | |
|   misc_writer_ = std::make_unique<MiscWriter>(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<MiscWriter>(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<MiscWriter>(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<MiscWriter>(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<MiscWriter>(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
 |