1343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme/* 2343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * Copyright (C) 2016 The Android Open Source Project 3343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * 4343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * Licensed under the Apache License, Version 2.0 (the "License"); 5343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * you may not use this file except in compliance with the License. 6343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * You may obtain a copy of the License at 7343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * 8343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * http://www.apache.org/licenses/LICENSE-2.0 9343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * 10343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * Unless required by applicable law or agreed to in writing, software 11343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * distributed under the License is distributed on an "AS IS" BASIS, 12343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * See the License for the specific language governing permissions and 14343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme * limitations under the License. 15343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme */ 16343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 17343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include "../dumpsys.h" 18343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 19343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <vector> 20343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 21343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <gmock/gmock.h> 22343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <gtest/gtest.h> 23343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 24343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <android-base/file.h> 25343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <utils/String16.h> 26a0f7f2dfd0ecb0ba13efdb62b5b850e198f01a1fSteven Moreland#include <utils/String8.h> 27343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme#include <utils/Vector.h> 28343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 29343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing namespace android; 30343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 31343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::_; 32343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::Action; 33343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::ActionInterface; 34343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::DoAll; 35343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::Eq; 36343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::HasSubstr; 37343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::MakeAction; 38343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::Not; 39343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::Return; 40343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::StrEq; 41343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::Test; 42343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::WithArg; 43343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::internal::CaptureStderr; 44343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::internal::CaptureStdout; 45343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::internal::GetCapturedStderr; 46343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeusing ::testing::internal::GetCapturedStdout; 47343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 48343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeclass ServiceManagerMock : public IServiceManager { 49343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme public: 50343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_CONST_METHOD1(getService, sp<IBinder>(const String16&)); 51343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_CONST_METHOD1(checkService, sp<IBinder>(const String16&)); 52343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_METHOD3(addService, status_t(const String16&, const sp<IBinder>&, bool)); 53343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_METHOD0(listServices, Vector<String16>()); 54343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 55343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme protected: 56343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_METHOD0(onAsBinder, IBinder*()); 57343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme}; 58343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 59343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeclass BinderMock : public BBinder { 60343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme public: 61343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme BinderMock() { 62343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 63343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 64343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme MOCK_METHOD2(dump, status_t(int, const Vector<String16>&)); 65343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme}; 66343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 67343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// gmock black magic to provide a WithArg<0>(WriteOnFd(output)) matcher 68343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemetypedef void WriteOnFdFunction(int); 69343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 70343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeclass WriteOnFdAction : public ActionInterface<WriteOnFdFunction> { 71343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme public: 72343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme explicit WriteOnFdAction(const std::string& output) : output_(output) { 73343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 74343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme virtual Result Perform(const ArgumentTuple& args) { 75343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme int fd = ::std::tr1::get<0>(args); 76343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme android::base::WriteStringToFd(output_, fd); 77343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 78343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 79343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme private: 80343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme std::string output_; 81343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme}; 82343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 83343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Matcher used to emulate dump() by writing on its file descriptor. 84343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeAction<WriteOnFdFunction> WriteOnFd(const std::string& output) { 85343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme return MakeAction(new WriteOnFdAction(output)); 86343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 87343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 88343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Matcher for args using Android's Vector<String16> format 89343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// TODO: move it to some common testing library 90343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeMATCHER_P(AndroidElementsAre, expected, "") { 91343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme std::ostringstream errors; 92343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme if (arg.size() != expected.size()) { 93343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme errors << " sizes do not match (expected " << expected.size() << ", got " << arg.size() 94343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme << ")\n"; 95343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 96343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme int i = 0; 97343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme std::ostringstream actual_stream, expected_stream; 98343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme for (String16 actual : arg) { 99a0f7f2dfd0ecb0ba13efdb62b5b850e198f01a1fSteven Moreland std::string actual_str = String8(actual).c_str(); 100343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme std::string expected_str = expected[i]; 101343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme actual_stream << "'" << actual_str << "' "; 102343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme expected_stream << "'" << expected_str << "' "; 103343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme if (actual_str != expected_str) { 104343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme errors << " element mismatch at index " << i << "\n"; 105343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 106343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme i++; 107343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 108343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 109343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme if (!errors.str().empty()) { 110343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme errors << "\nExpected args: " << expected_stream.str() 111343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme << "\nActual args: " << actual_stream.str(); 112343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme *result_listener << errors.str(); 113343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme return false; 114343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 115343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme return true; 116343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 117343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 118343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Custom action to sleep for timeout seconds 119343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeACTION_P(Sleep, timeout) { 120343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sleep(timeout); 121343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 122343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 123343175a5ffeba6d1714336913a81b3029df73dbbFelipe Lemeclass DumpsysTest : public Test { 124343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme public: 1252c3cd83603a7eefe7efe8c99cbe1c04b54cfe599Steven Moreland DumpsysTest() : sm_(), dump_(&sm_), stdout_(), stderr_() { 126343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 127343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 128343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void ExpectListServices(std::vector<std::string> services) { 129343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme Vector<String16> services16; 130343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme for (auto& service : services) { 131343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme services16.add(String16(service.c_str())); 132343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 133343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_CALL(sm_, listServices()).WillRepeatedly(Return(services16)); 134343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 135343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 136343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sp<BinderMock> ExpectCheckService(const char* name, bool running = true) { 137343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sp<BinderMock> binder_mock; 138343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme if (running) { 139343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme binder_mock = new BinderMock; 140343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 141343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_CALL(sm_, checkService(String16(name))).WillRepeatedly(Return(binder_mock)); 142343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme return binder_mock; 143343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 144343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 145343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void ExpectDump(const char* name, const std::string& output) { 146343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sp<BinderMock> binder_mock = ExpectCheckService(name); 147343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_CALL(*binder_mock, dump(_, _)) 148343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme .WillRepeatedly(DoAll(WithArg<0>(WriteOnFd(output)), Return(0))); 149343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 150343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 151343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void ExpectDumpWithArgs(const char* name, std::vector<std::string> args, 152343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme const std::string& output) { 153343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sp<BinderMock> binder_mock = ExpectCheckService(name); 154343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_CALL(*binder_mock, dump(_, AndroidElementsAre(args))) 155343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme .WillRepeatedly(DoAll(WithArg<0>(WriteOnFd(output)), Return(0))); 156343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 157343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 158343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void ExpectDumpAndHang(const char* name, int timeout_s, const std::string& output) { 159343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sp<BinderMock> binder_mock = ExpectCheckService(name); 160343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_CALL(*binder_mock, dump(_, _)) 161343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme .WillRepeatedly(DoAll(Sleep(timeout_s), WithArg<0>(WriteOnFd(output)), Return(0))); 162343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 163343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 164343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void CallMain(const std::vector<std::string>& args) { 165343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme const char* argv[1024] = {"/some/virtual/dir/dumpsys"}; 166343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme int argc = (int)args.size() + 1; 167343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme int i = 1; 168343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme for (const std::string& arg : args) { 169343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme argv[i++] = arg.c_str(); 170343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 171343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CaptureStdout(); 172343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CaptureStderr(); 173343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme int status = dump_.main(argc, const_cast<char**>(argv)); 174343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme stdout_ = GetCapturedStdout(); 175343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme stderr_ = GetCapturedStderr(); 176343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(status, Eq(0)); 177343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 178343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 1792c3cd83603a7eefe7efe8c99cbe1c04b54cfe599Steven Moreland void AssertRunningServices(const std::vector<std::string>& services) { 1802c3cd83603a7eefe7efe8c99cbe1c04b54cfe599Steven Moreland std::string expected("Currently running services:\n"); 181343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme for (const std::string& service : services) { 182343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme expected.append(" ").append(service).append("\n"); 183343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 184343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stdout_, HasSubstr(expected)); 185343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 186343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 187343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void AssertOutput(const std::string& expected) { 188343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stdout_, StrEq(expected)); 189343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 190343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 191343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void AssertOutputContains(const std::string& expected) { 192343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stdout_, HasSubstr(expected)); 193343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 194343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 195343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void AssertDumped(const std::string& service, const std::string& dump) { 196343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stdout_, HasSubstr("DUMP OF SERVICE " + service + ":\n" + dump)); 197343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 198343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 199343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void AssertNotDumped(const std::string& dump) { 200343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stdout_, Not(HasSubstr(dump))); 201343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 202343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 203343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme void AssertStopped(const std::string& service) { 204343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme EXPECT_THAT(stderr_, HasSubstr("Can't find service: " + service + "\n")); 205343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme } 206343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 207343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ServiceManagerMock sm_; 208343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme Dumpsys dump_; 209343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 210343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme private: 211343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme std::string stdout_, stderr_; 212343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme}; 213343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 214343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys -l' when all services are running 215343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, ListAllServices) { 216343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectListServices({"Locksmith", "Valet"}); 217343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("Locksmith"); 218343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("Valet"); 219343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 220343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"-l"}); 221343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 222343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertRunningServices({"Locksmith", "Valet"}); 223343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 224343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 225343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys -l' when a service is not running 226343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, ListRunningServices) { 227343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectListServices({"Locksmith", "Valet"}); 228343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("Locksmith"); 229343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("Valet", false); 230343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 231343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"-l"}); 232343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 233343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertRunningServices({"Locksmith"}); 234343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertNotDumped({"Valet"}); 235343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 236343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 237343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys service_name' on a service is running 238343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, DumpRunningService) { 239343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("Valet", "Here's your car"); 240343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 241343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"Valet"}); 242343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 243343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertOutput("Here's your car"); 244343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 245343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 246343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys -t 1 service_name' on a service that times out after 2s 247343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, DumpRunningServiceTimeout) { 248343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDumpAndHang("Valet", 2, "Here's your car"); 249343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 250343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"-t", "1", "Valet"}); 251343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 252343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertOutputContains("SERVICE 'Valet' DUMP TIMEOUT (1s) EXPIRED"); 253343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertNotDumped("Here's your car"); 254343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 255343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme // Must wait so binder mock is deleted, otherwise test will fail with a leaked object 256343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme sleep(1); 257343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 258343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 259343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys service_name Y U NO HAVE ARGS' on a service that is running 260343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, DumpWithArgsRunningService) { 261343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDumpWithArgs("SERVICE", {"Y", "U", "NO", "HANDLE", "ARGS"}, "I DO!"); 262343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 263343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"SERVICE", "Y", "U", "NO", "HANDLE", "ARGS"}); 264343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 265343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertOutput("I DO!"); 266343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 267343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 268343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys' with no arguments 269343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, DumpMultipleServices) { 270343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectListServices({"running1", "stopped2", "running3"}); 271343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("running1", "dump1"); 272343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("stopped2", false); 273343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("running3", "dump3"); 274343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 275343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({}); 276343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 277343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertRunningServices({"running1", "running3"}); 278343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertDumped("running1", "dump1"); 279343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertStopped("stopped2"); 280343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertDumped("running3", "dump3"); 281343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 282343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 283343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme// Tests 'dumpsys --skip skipped3 skipped5', which should skip these services 284343175a5ffeba6d1714336913a81b3029df73dbbFelipe LemeTEST_F(DumpsysTest, DumpWithSkip) { 285343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectListServices({"running1", "stopped2", "skipped3", "running4", "skipped5"}); 286343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("running1", "dump1"); 287343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectCheckService("stopped2", false); 288343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("skipped3", "dump3"); 289343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("running4", "dump4"); 290343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme ExpectDump("skipped5", "dump5"); 291343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 292343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme CallMain({"--skip", "skipped3", "skipped5"}); 293343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme 294343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertRunningServices({"running1", "running4", "skipped3 (skipped)", "skipped5 (skipped)"}); 295343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertDumped("running1", "dump1"); 296343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertDumped("running4", "dump4"); 297343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertStopped("stopped2"); 298343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertNotDumped("dump3"); 299343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme AssertNotDumped("dump5"); 300343175a5ffeba6d1714336913a81b3029df73dbbFelipe Leme} 301