/* * 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 "server_configurable_flags/disaster_recovery.h" #include "server_configurable_flags/get_flags.h" #include #include #include #include #include "android-base/file.h" #include "android-base/properties.h" #include "android-base/strings.h" using namespace server_configurable_flags; using namespace android::base; static bool contains(std::vector& vec, std::string& str) { return std::find(vec.begin(), vec.end(), str) != vec.end(); } TEST(server_configurable_flags, empty_flag_returns_default) { std::string result = server_configurable_flags::GetServerConfigurableFlag("category", "flag", "default"); ASSERT_EQ("default", result); } TEST(server_configurable_flags, set_flag_returns_value) { android::base::SetProperty("persist.device_config.category.flag", "hello"); std::string result = server_configurable_flags::GetServerConfigurableFlag("category", "flag", "default"); ASSERT_EQ("hello", result); // clean up android::base::SetProperty("persist.device_config.category.flag", ""); } TEST(server_configurable_flags, invalid_flag_returns_default) { std::string result = server_configurable_flags::GetServerConfigurableFlag("category.", "flag", "default"); ASSERT_EQ("default", result); result = server_configurable_flags::GetServerConfigurableFlag("category", "!flag", "default"); ASSERT_EQ("default", result); result = server_configurable_flags::GetServerConfigurableFlag("category", ".flag", "default"); ASSERT_EQ("default", result); } TEST(server_configurable_flags, flags_reset_skip_under_threshold) { #if defined(__BIONIC__) android::base::SetProperty("persist.device_config.attempted_boot_count", "1"); android::base::SetProperty("persist.device_config.category1.prop1", "val1"); android::base::SetProperty("persist.device_config.category1.prop2", "val2"); android::base::SetProperty("persist.device_config.category2.prop3", "val3"); android::base::SetProperty("sys.category3.test", "val4"); android::base::SetProperty("device_config.reset_performed", ""); server_configurable_flags::ServerConfigurableFlagsReset(server_configurable_flags::BOOT_FAILURE); ASSERT_EQ("2", android::base::GetProperty("persist.device_config.attempted_boot_count", "")); ASSERT_EQ("val1", android::base::GetProperty("persist.device_config.category1.prop1", "")); ASSERT_EQ("val2", android::base::GetProperty("persist.device_config.category1.prop2", "")); ASSERT_EQ("val3", android::base::GetProperty("persist.device_config.category2.prop3", "")); ASSERT_EQ("val4", android::base::GetProperty("sys.category3.test", "")); ASSERT_EQ("", android::base::GetProperty("device_config.reset_performed", "")); #else // __BIONIC__ GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif // __BIONIC__ } TEST(server_configurable_flags, flags_reset_performed_over_threshold) { #if defined(__BIONIC__) android::base::SetProperty("persist.device_config.attempted_boot_count", "5"); android::base::SetProperty("persist.device_config.category1.prop1", "val1"); android::base::SetProperty("persist.device_config.category1.prop2", "val2"); android::base::SetProperty("persist.device_config.category2.prop3", "val3"); android::base::SetProperty("sys.category3.test", "val4"); server_configurable_flags::ServerConfigurableFlagsReset(server_configurable_flags::BOOT_FAILURE); ASSERT_EQ("true", android::base::GetProperty("device_config.reset_performed", "")); ASSERT_EQ("5", android::base::GetProperty("persist.device_config.attempted_boot_count", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category1.prop1", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category1.prop2", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category2.prop3", "")); ASSERT_EQ("val4", android::base::GetProperty("sys.category3.test", "")); std::string content; ASSERT_EQ(true, ReadFileToString("/data/server_configurable_flags/reset_flags", &content)); std::vector properties = Split(content, ";"); ASSERT_EQ((unsigned long)3, properties.size()); std::string prop1("persist.device_config.category1.prop1"), prop2("persist.device_config.category1.prop2"), prop3("persist.device_config.category2.prop3"); ASSERT_EQ(true, contains(properties, prop1)); ASSERT_EQ(true, contains(properties, prop2)); ASSERT_EQ(true, contains(properties, prop3)); #else // __BIONIC__ GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif // __BIONIC__ } TEST(server_configurable_flags, flags_reset_performed_on_updatable_crashing) { #if defined(__BIONIC__) android::base::SetProperty("persist.device_config.attempted_boot_count", "1"); android::base::SetProperty("persist.device_config.category1.prop1", "val1"); android::base::SetProperty("persist.device_config.category1.prop2", "val2"); android::base::SetProperty("persist.device_config.category2.prop3", "val3"); android::base::SetProperty("sys.category3.test", "val4"); server_configurable_flags::ServerConfigurableFlagsReset( server_configurable_flags::UPDATABLE_CRASHING); ASSERT_EQ("true", android::base::GetProperty("device_config.reset_performed", "")); ASSERT_EQ("1", android::base::GetProperty("persist.device_config.attempted_boot_count", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category1.prop1", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category1.prop2", "")); ASSERT_EQ("", android::base::GetProperty("persist.device_config.category2.prop3", "")); ASSERT_EQ("val4", android::base::GetProperty("sys.category3.test", "")); std::string content; ASSERT_EQ(true, ReadFileToString("/data/server_configurable_flags/reset_flags", &content)); std::vector properties = Split(content, ";"); ASSERT_EQ((unsigned long)3, properties.size()); std::string prop1("persist.device_config.category1.prop1"), prop2("persist.device_config.category1.prop2"), prop3("persist.device_config.category2.prop3"); ASSERT_EQ(true, contains(properties, prop1)); ASSERT_EQ(true, contains(properties, prop2)); ASSERT_EQ(true, contains(properties, prop3)); #else // __BIONIC__ GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif // __BIONIC__ }