From 5649b31a177f98e0f6601ec03c0e0b4fc0ae07e0 Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Wed, 22 Mar 2017 08:46:55 -0700 Subject: [PATCH] fs_config_generate: unit test Test -D and -F flag of fs_config_generate Test: gTest host fs_config-unit-tests Bug: 36071012 Change-Id: I23a655b17b7c55817f2aacc760700ff1b0728db3 --- tools/fs_config/Android.mk | 33 +++++++ .../android_filesystem_config_test_data.h | 40 +++++++++ tools/fs_config/fs_config_generate.c | 4 + tools/fs_config/fs_config_test.cpp | 86 +++++++++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 tools/fs_config/android_filesystem_config_test_data.h create mode 100644 tools/fs_config/fs_config_test.cpp diff --git a/tools/fs_config/Android.mk b/tools/fs_config/Android.mk index 65f8a081a..4a2b566e4 100644 --- a/tools/fs_config/Android.mk +++ b/tools/fs_config/Android.mk @@ -195,3 +195,36 @@ ANDROID_FS_CONFIG_H := my_fs_config_h := fs_config_generate_bin := my_gen_oem_aid := + +# ----------------------------------------------------------------------------- +# Unit tests. +# ----------------------------------------------------------------------------- + +test_c_flags := \ + -fstack-protector-all \ + -g \ + -Wall \ + -Wextra \ + -Werror \ + -fno-builtin \ + -DANDROID_FILESYSTEM_CONFIG='"android_filesystem_config_test_data.h"' + +################################## +# test executable +include $(CLEAR_VARS) +LOCAL_MODULE := fs_config_generate_test +LOCAL_SRC_FILES := fs_config_generate.c +LOCAL_SHARED_LIBRARIES := libcutils +LOCAL_CFLAGS := $(test_c_flags) +LOCAL_MODULE_RELATIVE_PATH := fs_config-unit-tests +LOCAL_GTEST := false +include $(BUILD_HOST_NATIVE_TEST) + +################################## +# gTest tool +include $(CLEAR_VARS) +LOCAL_MODULE := fs_config-unit-tests +LOCAL_CFLAGS += $(test_c_flags) -DHOST +LOCAL_SHARED_LIBRARIES := liblog libcutils libbase +LOCAL_SRC_FILES := fs_config_test.cpp +include $(BUILD_HOST_NATIVE_TEST) diff --git a/tools/fs_config/android_filesystem_config_test_data.h b/tools/fs_config/android_filesystem_config_test_data.h new file mode 100644 index 000000000..2b9841534 --- /dev/null +++ b/tools/fs_config/android_filesystem_config_test_data.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2017 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 + +/* Test Data */ + +#undef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS +#undef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES + +static const struct fs_path_config android_device_dirs[] = { + {00555, AID_ROOT, AID_SYSTEM, 0, "system/etc"}, + {00555, AID_ROOT, AID_SYSTEM, 0, "vendor/etc"}, + {00555, AID_ROOT, AID_SYSTEM, 0, "oem/etc"}, + {00555, AID_ROOT, AID_SYSTEM, 0, "odm/etc"}, +}; + +static const struct fs_path_config android_device_files[] = { + {00444, AID_ROOT, AID_SYSTEM, 0, "system/etc/fs_config_dirs"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "vendor/etc/fs_config_dirs"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "oem/etc/fs_config_dirs"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "odm/etc/fs_config_dirs"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "system/etc/fs_config_files"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "vendor/etc/fs_config_files"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "oem/etc/fs_config_files"}, + {00444, AID_ROOT, AID_SYSTEM, 0, "odm/etc/fs_config_files"}, +}; diff --git a/tools/fs_config/fs_config_generate.c b/tools/fs_config/fs_config_generate.c index c06213f67..e08642fa4 100644 --- a/tools/fs_config/fs_config_generate.c +++ b/tools/fs_config/fs_config_generate.c @@ -28,7 +28,11 @@ * the binary format used in the /system/etc/fs_config_dirs and * the /system/etc/fs_config_files to be used by the runtimes. */ +#ifdef ANDROID_FILESYSTEM_CONFIG +#include ANDROID_FILESYSTEM_CONFIG +#else #include "android_filesystem_config.h" +#endif #ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS static const struct fs_path_config android_device_dirs[] = { diff --git a/tools/fs_config/fs_config_test.cpp b/tools/fs_config/fs_config_test.cpp new file mode 100644 index 000000000..49e89e32b --- /dev/null +++ b/tools/fs_config/fs_config_test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017 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 +#include + +#include "android_filesystem_config_test_data.h" + +// must run test in the test directory +const static char fs_config_generate_command[] = "./fs_config_generate_test"; + +static std::string popenToString(std::string command) { + std::string ret; + + FILE* fp = popen(command.c_str(), "r"); + if (fp) { + if (!android::base::ReadFdToString(fileno(fp), &ret)) ret = ""; + pclose(fp); + } + return ret; +} + +static void confirm(std::string&& data, const fs_path_config* config, + ssize_t num_config) { + const struct fs_path_config_from_file* pc = + reinterpret_cast(data.c_str()); + size_t len = data.size(); + + ASSERT_TRUE(config != NULL); + ASSERT_LT(0, num_config); + + while (len > 0) { + uint16_t host_len = pc->len; + if (host_len > len) break; + + EXPECT_EQ(config->mode, pc->mode); + EXPECT_EQ(config->uid, pc->uid); + EXPECT_EQ(config->gid, pc->gid); + EXPECT_EQ(config->capabilities, pc->capabilities); + EXPECT_STREQ(config->prefix, pc->prefix); + + EXPECT_LT(0, num_config); + --num_config; + if (num_config >= 0) ++config; + pc = reinterpret_cast( + reinterpret_cast(pc) + host_len); + len -= host_len; + } + EXPECT_EQ(0, num_config); +} + +/* See local android_filesystem_config.h for test data */ + +TEST(fs_conf_test, dirs) { + confirm(popenToString( + android::base::StringPrintf("%s -D", fs_config_generate_command)), + android_device_dirs, arraysize(android_device_dirs)); +} + +TEST(fs_conf_test, files) { + confirm(popenToString( + android::base::StringPrintf("%s -F", fs_config_generate_command)), + android_device_files, arraysize(android_device_files)); +}