| /* | |
| * Copyright (C) 2019 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 <unistd.h> | |
| #include <future> | |
| #include <string> | |
| #include <thread> | |
| #include <base/files/file_util.h> | |
| #include "fs_avb_test_util.h" | |
| #include "util.h" | |
| // Target functions to test: | |
| using android::fs_mgr::BytesToHex; | |
| using android::fs_mgr::FileWaitMode; | |
| using android::fs_mgr::HexToBytes; | |
| using android::fs_mgr::NibbleValue; | |
| using android::fs_mgr::WaitForFile; | |
| namespace fs_avb_host_test { | |
| TEST(BasicUtilTest, NibbleValue09) { | |
| uint8_t value; | |
| EXPECT_TRUE(NibbleValue('0', &value)); | |
| EXPECT_EQ(0, value); | |
| EXPECT_TRUE(NibbleValue('1', &value)); | |
| EXPECT_EQ(1, value); | |
| EXPECT_TRUE(NibbleValue('2', &value)); | |
| EXPECT_EQ(2, value); | |
| EXPECT_TRUE(NibbleValue('3', &value)); | |
| EXPECT_EQ(3, value); | |
| EXPECT_TRUE(NibbleValue('4', &value)); | |
| EXPECT_EQ(4, value); | |
| EXPECT_TRUE(NibbleValue('5', &value)); | |
| EXPECT_EQ(5, value); | |
| EXPECT_TRUE(NibbleValue('6', &value)); | |
| EXPECT_EQ(6, value); | |
| EXPECT_TRUE(NibbleValue('7', &value)); | |
| EXPECT_EQ(7, value); | |
| EXPECT_TRUE(NibbleValue('8', &value)); | |
| EXPECT_EQ(8, value); | |
| EXPECT_TRUE(NibbleValue('9', &value)); | |
| EXPECT_EQ(9, value); | |
| } | |
| TEST(BasicUtilTest, NibbleValueAF) { | |
| uint8_t value; | |
| EXPECT_TRUE(NibbleValue('a', &value)); | |
| EXPECT_EQ(10, value); | |
| EXPECT_TRUE(NibbleValue('b', &value)); | |
| EXPECT_EQ(11, value); | |
| EXPECT_TRUE(NibbleValue('c', &value)); | |
| EXPECT_EQ(12, value); | |
| EXPECT_TRUE(NibbleValue('d', &value)); | |
| EXPECT_EQ(13, value); | |
| EXPECT_TRUE(NibbleValue('e', &value)); | |
| EXPECT_EQ(14, value); | |
| EXPECT_TRUE(NibbleValue('f', &value)); | |
| EXPECT_EQ(15, value); | |
| EXPECT_TRUE(NibbleValue('A', &value)); | |
| EXPECT_EQ(10, value); | |
| EXPECT_TRUE(NibbleValue('B', &value)); | |
| EXPECT_EQ(11, value); | |
| EXPECT_TRUE(NibbleValue('C', &value)); | |
| EXPECT_EQ(12, value); | |
| EXPECT_TRUE(NibbleValue('D', &value)); | |
| EXPECT_EQ(13, value); | |
| EXPECT_TRUE(NibbleValue('E', &value)); | |
| EXPECT_EQ(14, value); | |
| EXPECT_TRUE(NibbleValue('F', &value)); | |
| EXPECT_EQ(15, value); | |
| } | |
| TEST(BasicUtilTest, NibbleValueInvalid) { | |
| uint8_t value; | |
| EXPECT_FALSE(NibbleValue('G', &value)); | |
| EXPECT_FALSE(NibbleValue('H', &value)); | |
| EXPECT_FALSE(NibbleValue('I', &value)); | |
| EXPECT_FALSE(NibbleValue('x', &value)); | |
| EXPECT_FALSE(NibbleValue('y', &value)); | |
| EXPECT_FALSE(NibbleValue('z', &value)); | |
| } | |
| TEST(BasicUtilTest, HexToBytes) { | |
| std::string hex = "000102030405060708090A0B0C0D0E0F"; | |
| uint8_t bytes[16]; | |
| EXPECT_TRUE(HexToBytes((uint8_t*)bytes, sizeof(bytes), hex)); | |
| for (size_t i = 0; i < sizeof(bytes); i++) { | |
| EXPECT_EQ(i, bytes[i]); | |
| } | |
| } | |
| TEST(BasicUtilTest, HexToBytes2) { | |
| std::string hex = "101112131415161718191A1B1C1D1E1F"; | |
| uint8_t bytes[16]; | |
| EXPECT_TRUE(HexToBytes((uint8_t*)bytes, sizeof(bytes), hex)); | |
| for (size_t i = 0; i < sizeof(bytes); i++) { | |
| EXPECT_EQ(16 + i, bytes[i]); | |
| } | |
| } | |
| TEST(BasicUtilTest, BytesToHex) { | |
| const uint8_t bytes[16]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; | |
| EXPECT_EQ("0102", BytesToHex((uint8_t*)bytes, 2)); | |
| EXPECT_EQ("01020304", BytesToHex((uint8_t*)bytes, 4)); | |
| EXPECT_EQ("0102030405060708", BytesToHex((uint8_t*)bytes, 8)); | |
| EXPECT_EQ("0102030405060708090a0b0c0d0e0f10", BytesToHex((uint8_t*)bytes, 16)); | |
| EXPECT_EQ("01", BytesToHex((uint8_t*)bytes, 1)); | |
| EXPECT_EQ("010203", BytesToHex((uint8_t*)bytes, 3)); | |
| EXPECT_EQ("0102030405", BytesToHex((uint8_t*)bytes, 5)); | |
| } | |
| TEST(BasicUtilTest, HexToBytesInValidOddLenHex) { | |
| std::string hex = "12345"; | |
| uint8_t bytes[16]; | |
| EXPECT_FALSE(HexToBytes((uint8_t*)bytes, sizeof(bytes), hex)); | |
| } | |
| TEST(BasicUtilTest, HexToBytesInsufficientByteLen) { | |
| std::string hex = "101112131415161718191A1B1C1D1E1F"; | |
| uint8_t bytes[8]; | |
| EXPECT_FALSE(HexToBytes((uint8_t*)bytes, sizeof(bytes), hex)); | |
| } | |
| TEST(BasicUtilTest, WaitForFile) { | |
| // Gets system tmp dir. | |
| base::FilePath tmp_dir; | |
| ASSERT_TRUE(GetTempDir(&tmp_dir)); | |
| // Waits this path. | |
| base::FilePath wait_path = tmp_dir.Append("libfs_avb-test-exist-dir"); | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| EXPECT_TRUE(base::CreateDirectory(wait_path)); | |
| EXPECT_TRUE(WaitForFile(wait_path.value(), 1s)); | |
| // Removes the wait_path. | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| } | |
| TEST(BasicUtilTest, WaitForFileNonExist) { | |
| base::FilePath wait_path("/path/not/exist"); | |
| EXPECT_FALSE(WaitForFile(wait_path.value(), 200ms)); | |
| } | |
| TEST(BasicUtilTest, WaitForFileDeferCreation) { | |
| // Gets system tmp dir. | |
| base::FilePath tmp_dir; | |
| ASSERT_TRUE(GetTempDir(&tmp_dir)); | |
| // Waits this path. | |
| base::FilePath wait_path = tmp_dir.Append("libfs_avb-test-exist-dir"); | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| auto wait_file = std::async(WaitForFile, wait_path.value(), 500ms, FileWaitMode::Exists); | |
| // Sleeps 100ms before creating the wait_path. | |
| std::this_thread::sleep_for(100ms); | |
| EXPECT_TRUE(base::CreateDirectory(wait_path)); | |
| // Checks WaitForFile() returns success. | |
| EXPECT_TRUE(wait_file.get()); | |
| // Removes the wait_path. | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| } | |
| TEST(BasicUtilTest, WaitForFileDeferCreationFailure) { | |
| // Gets system tmp dir. | |
| base::FilePath tmp_dir; | |
| ASSERT_TRUE(GetTempDir(&tmp_dir)); | |
| // Waits this path. | |
| base::FilePath wait_path = tmp_dir.Append("libfs_avb-test-exist-dir"); | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| auto wait_file = std::async(WaitForFile, wait_path.value(), 50ms, FileWaitMode::Exists); | |
| // Sleeps 100ms before creating the wait_path. | |
| std::this_thread::sleep_for(100ms); | |
| EXPECT_TRUE(base::CreateDirectory(wait_path)); | |
| // Checks WaitForFile() returns failure, because it only waits 50ms. | |
| EXPECT_FALSE(wait_file.get()); | |
| // Removes the wait_path. | |
| ASSERT_TRUE(base::DeleteFile(wait_path, false /* resursive */)); | |
| } | |
| } // namespace fs_avb_host_test |