From 6cce3f7f90daea873994a148015736cb4400895d Mon Sep 17 00:00:00 2001 From: Steven Moreland Date: Tue, 25 Feb 2020 14:22:53 -0800 Subject: [PATCH] init: init_kill_services_test Kill processes and make sure the phone recovers. This adds a basic level of testing, but it could be improved by: - trying to kill all running processes on the device - improving metrics for 'recovery' Bug: 148236233 Test: init_kill_services_test Change-Id: I8aaca7bf4bb0be588decf741d1f6e1c5787cea84 --- TEST_MAPPING | 3 + init/test_kill_services/Android.bp | 7 ++ .../init_kill_services_test.cpp | 69 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 init/test_kill_services/Android.bp create mode 100644 init/test_kill_services/init_kill_services_test.cpp diff --git a/TEST_MAPPING b/TEST_MAPPING index e3a86756c..44c47f3c9 100644 --- a/TEST_MAPPING +++ b/TEST_MAPPING @@ -27,6 +27,9 @@ { "name": "fs_mgr_vendor_overlay_test" }, + { + "name": "init_kill_services_test" + }, { "name": "libbase_test" }, diff --git a/init/test_kill_services/Android.bp b/init/test_kill_services/Android.bp new file mode 100644 index 000000000..f6e85e289 --- /dev/null +++ b/init/test_kill_services/Android.bp @@ -0,0 +1,7 @@ +cc_test { + name: "init_kill_services_test", + srcs: ["init_kill_services_test.cpp"], + shared_libs: ["libbase"], + test_suites: ["general-tests"], + require_root: true, +} diff --git a/init/test_kill_services/init_kill_services_test.cpp b/init/test_kill_services/init_kill_services_test.cpp new file mode 100644 index 000000000..7e543f232 --- /dev/null +++ b/init/test_kill_services/init_kill_services_test.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2020 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 + +using ::android::base::GetProperty; +using ::android::base::SetProperty; + +void ExpectKillingServiceRecovers(const std::string& service_name) { + const std::string status_prop = "init.svc." + service_name; + const std::string pid_prop = "init.svc_debug_pid." + service_name; + + const std::string initial_pid = GetProperty(pid_prop, ""); + + EXPECT_EQ("running", GetProperty(status_prop, "")) << status_prop; + EXPECT_NE("", initial_pid) << pid_prop; + + EXPECT_EQ(0, system(("kill -9 " + initial_pid).c_str())); + + constexpr size_t kMaxWaitMilliseconds = 10000; + constexpr size_t kRetryWaitMilliseconds = 100; + + constexpr size_t kRetryTimes = kMaxWaitMilliseconds / kRetryWaitMilliseconds; + + for (size_t retry = 0; retry < kRetryTimes; retry++) { + const std::string& pid = GetProperty(pid_prop, ""); + if (pid != initial_pid && pid != "") break; + usleep(kRetryWaitMilliseconds * 1000); + } + + // svc_debug_pid is set after svc property + EXPECT_EQ("running", GetProperty(status_prop, "")); +} + +class InitKillServicesTest : public ::testing::TestWithParam {}; + +TEST_P(InitKillServicesTest, KillCriticalProcesses) { + ExpectKillingServiceRecovers(GetParam()); + + // sanity check init is still responding + EXPECT_TRUE(SetProperty("test.death.test", "asdf")); + EXPECT_EQ(GetProperty("test.death.test", ""), "asdf"); + EXPECT_TRUE(SetProperty("test.death.test", "")); +} + +static inline std::string PrintName(const testing::TestParamInfo& info) { + return info.param; +} + +INSTANTIATE_TEST_CASE_P(DeathTest, InitKillServicesTest, + ::testing::Values("lmkd", "ueventd", "hwservicemanager", "servicemanager"), + PrintName);