普通文本  |  151行  |  6.8 KB

/*
 * 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 <gtest/gtest.h>

#include <algorithm>
#include <string>
#include <vector>

#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<std::string>& 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<std::string> 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<std::string> 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__
}