diff options
author | Tom Cherry <tomcherry@google.com> | 2018-07-17 15:28:16 -0700 |
---|---|---|
committer | Tom Cherry <tomcherry@google.com> | 2018-07-17 15:28:51 -0700 |
commit | 5f0198bfbb7b8c7ee65dbadc19b4c7553531687c (patch) | |
tree | e3d253f2cf6a91dd720408caefb0d8ef1470ba9d /init/ueventd_parser_test.cpp | |
parent | a63b3309fffcdbc8074648e539390342b0bd8697 (diff) |
ueventd: add a test for ueventd_parser.cpp
Test: this unit test
Change-Id: Ib23f23ea5b362bb458adf8208573e5dc80ad6cf0
Diffstat (limited to 'init/ueventd_parser_test.cpp')
-rw-r--r-- | init/ueventd_parser_test.cpp | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/init/ueventd_parser_test.cpp b/init/ueventd_parser_test.cpp new file mode 100644 index 000000000..31208b926 --- /dev/null +++ b/init/ueventd_parser_test.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2018 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 "ueventd_parser.h" + +#include <android-base/test_utils.h> +#include <gtest/gtest.h> +#include <private/android_filesystem_config.h> + +namespace android { +namespace init { + +void TestSubsystems(const Subsystem& expected, const Subsystem& test) { + EXPECT_EQ(expected.name_, test.name_); + EXPECT_EQ(expected.devname_source_, test.devname_source_) << expected.name_; + EXPECT_EQ(expected.dir_name_, test.dir_name_) << expected.name_; +} + +void TestPermissions(const Permissions& expected, const Permissions& test) { + EXPECT_EQ(expected.name_, test.name_); + EXPECT_EQ(expected.perm_, test.perm_) << expected.name_; + EXPECT_EQ(expected.uid_, test.uid_) << expected.name_; + EXPECT_EQ(expected.gid_, test.gid_) << expected.name_; + EXPECT_EQ(expected.prefix_, test.prefix_) << expected.name_; + EXPECT_EQ(expected.wildcard_, test.wildcard_) << expected.name_; +} + +void TestSysfsPermissions(const SysfsPermissions& expected, const SysfsPermissions& test) { + TestPermissions(expected, test); + EXPECT_EQ(expected.attribute_, test.attribute_); +} + +template <typename T, typename F> +void TestVector(const T& expected, const T& test, F function) { + ASSERT_EQ(expected.size(), test.size()); + auto expected_it = expected.begin(); + auto test_it = test.begin(); + + for (; expected_it != expected.end(); ++expected_it, ++test_it) { + function(*expected_it, *test_it); + } +} + +void TestUeventdFile(const std::string& content, const UeventdConfiguration& expected) { + TemporaryFile tf; + ASSERT_TRUE(tf.fd != -1); + ASSERT_TRUE(android::base::WriteStringToFd(content, tf.fd)); + + auto result = ParseConfig({tf.path}); + + TestVector(expected.subsystems, result.subsystems, TestSubsystems); + TestVector(expected.sysfs_permissions, result.sysfs_permissions, TestSysfsPermissions); + TestVector(expected.dev_permissions, result.dev_permissions, TestPermissions); + EXPECT_EQ(expected.firmware_directories, result.firmware_directories); +} + +TEST(ueventd_parser, EmptyFile) { + TestUeventdFile("", {}); +} + +TEST(ueventd_parser, Subsystems) { + auto ueventd_file = R"( +subsystem test_devname + devname uevent_devname + +subsystem test_devpath_no_dirname + devname uevent_devpath + +subsystem test_devname2 + devname uevent_devname + +subsystem test_devpath_dirname + devname uevent_devpath + dirname /dev/graphics +)"; + + auto subsystems = std::vector<Subsystem>{ + {"test_devname", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"}, + {"test_devpath_no_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev"}, + {"test_devname2", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"}, + {"test_devpath_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev/graphics"}}; + + TestUeventdFile(ueventd_file, {subsystems, {}, {}, {}}); +} + +TEST(ueventd_parser, Permissions) { + auto ueventd_file = R"( +/dev/rtc0 0640 system system +/dev/graphics/* 0660 root graphics +/dev/*/test 0660 root system + +/sys/devices/platform/trusty.* trusty_version 0440 root log +/sys/devices/virtual/input/input enable 0660 root input +/sys/devices/virtual/*/input poll_delay 0660 root input +)"; + + auto permissions = std::vector<Permissions>{ + {"/dev/rtc0", 0640, AID_SYSTEM, AID_SYSTEM}, + {"/dev/graphics/*", 0660, AID_ROOT, AID_GRAPHICS}, + {"/dev/*/test", 0660, AID_ROOT, AID_SYSTEM}, + }; + + auto sysfs_permissions = std::vector<SysfsPermissions>{ + {"/sys/devices/platform/trusty.*", "trusty_version", 0440, AID_ROOT, AID_LOG}, + {"/sys/devices/virtual/input/input", "enable", 0660, AID_ROOT, AID_INPUT}, + {"/sys/devices/virtual/*/input", "poll_delay", 0660, AID_ROOT, AID_INPUT}, + }; + + TestUeventdFile(ueventd_file, {{}, sysfs_permissions, permissions, {}}); +} + +TEST(ueventd_parser, FirmwareDirectories) { + auto ueventd_file = R"( +firmware_directories /first/ /second /third +firmware_directories /more +)"; + + auto firmware_directories = std::vector<std::string>{ + "/first/", + "/second", + "/third", + "/more", + }; + + TestUeventdFile(ueventd_file, {{}, {}, {}, firmware_directories}); +} + +TEST(ueventd_parser, AllTogether) { + auto ueventd_file = R"( + +/dev/rtc0 0640 system system +firmware_directories /first/ /second /third +/sys/devices/platform/trusty.* trusty_version 0440 root log + +subsystem test_devname + devname uevent_devname + +/dev/graphics/* 0660 root graphics + +subsystem test_devpath_no_dirname + devname uevent_devpath + +/sys/devices/virtual/input/input enable 0660 root input + +## this is a comment + +subsystem test_devname2 +## another comment + devname uevent_devname + +subsystem test_devpath_dirname + devname uevent_devpath + dirname /dev/graphics + +/dev/*/test 0660 root system +/sys/devices/virtual/*/input poll_delay 0660 root input +firmware_directories /more + +#ending comment +)"; + + auto subsystems = std::vector<Subsystem>{ + {"test_devname", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"}, + {"test_devpath_no_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev"}, + {"test_devname2", Subsystem::DEVNAME_UEVENT_DEVNAME, "/dev"}, + {"test_devpath_dirname", Subsystem::DEVNAME_UEVENT_DEVPATH, "/dev/graphics"}}; + + auto permissions = std::vector<Permissions>{ + {"/dev/rtc0", 0640, AID_SYSTEM, AID_SYSTEM}, + {"/dev/graphics/*", 0660, AID_ROOT, AID_GRAPHICS}, + {"/dev/*/test", 0660, AID_ROOT, AID_SYSTEM}, + }; + + auto sysfs_permissions = std::vector<SysfsPermissions>{ + {"/sys/devices/platform/trusty.*", "trusty_version", 0440, AID_ROOT, AID_LOG}, + {"/sys/devices/virtual/input/input", "enable", 0660, AID_ROOT, AID_INPUT}, + {"/sys/devices/virtual/*/input", "poll_delay", 0660, AID_ROOT, AID_INPUT}, + }; + + auto firmware_directories = std::vector<std::string>{ + "/first/", + "/second", + "/third", + "/more", + }; + + TestUeventdFile(ueventd_file, + {subsystems, sysfs_permissions, permissions, firmware_directories}); +} + +// All of these lines are ill-formed, so test that there is 0 output. +TEST(ueventd_parser, ParseErrors) { + auto ueventd_file = R"( + +/dev/rtc0 badmode baduidbad system +/dev/rtc0 0640 baduidbad system +/dev/rtc0 0640 system baduidbad +firmware_directories #no directory listed +/sys/devices/platform/trusty.* trusty_version badmode root log +/sys/devices/platform/trusty.* trusty_version 0440 baduidbad log +/sys/devices/platform/trusty.* trusty_version 0440 root baduidbad + +subsystem #no name + +)"; + + TestUeventdFile(ueventd_file, {}); +} + +} // namespace init +} // namespace android |