xref: /aosp_15_r20/frameworks/native/cmds/lshal/test.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <chrono>
18*38e8c45fSAndroid Build Coastguard Worker #include <future>
19*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
20*38e8c45fSAndroid Build Coastguard Worker #include "android/hidl/base/1.0/IBase.h"
21*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "Lshal"
22*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker #include <sstream>
25*38e8c45fSAndroid Build Coastguard Worker #include <string>
26*38e8c45fSAndroid Build Coastguard Worker #include <thread>
27*38e8c45fSAndroid Build Coastguard Worker #include <vector>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker #include <android-base/parseint.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <android/hardware/tests/inheritance/1.0/IChild.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h>
34*38e8c45fSAndroid Build Coastguard Worker #include <vintf/parse_xml.h>
35*38e8c45fSAndroid Build Coastguard Worker 
36*38e8c45fSAndroid Build Coastguard Worker #include "ListCommand.h"
37*38e8c45fSAndroid Build Coastguard Worker #include "Lshal.h"
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker #define NELEMS(array)   static_cast<int>(sizeof(array) / sizeof(array[0]))
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker using namespace testing;
42*38e8c45fSAndroid Build Coastguard Worker 
43*38e8c45fSAndroid Build Coastguard Worker using std::chrono_literals::operator""ms;
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::DebugInfo;
46*38e8c45fSAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
47*38e8c45fSAndroid Build Coastguard Worker using ::android::hidl::manager::V1_0::IServiceManager;
48*38e8c45fSAndroid Build Coastguard Worker using ::android::hidl::manager::V1_0::IServiceNotification;
49*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::hidl_array;
50*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::hidl_death_recipient;
51*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::hidl_handle;
52*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
53*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
54*38e8c45fSAndroid Build Coastguard Worker using ::android::hardware::Void;
55*38e8c45fSAndroid Build Coastguard Worker using android::vintf::Arch;
56*38e8c45fSAndroid Build Coastguard Worker using android::vintf::CompatibilityMatrix;
57*38e8c45fSAndroid Build Coastguard Worker using android::vintf::HalManifest;
58*38e8c45fSAndroid Build Coastguard Worker using android::vintf::Transport;
59*38e8c45fSAndroid Build Coastguard Worker using android::vintf::VintfObject;
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker using InstanceDebugInfo = IServiceManager::InstanceDebugInfo;
62*38e8c45fSAndroid Build Coastguard Worker 
63*38e8c45fSAndroid Build Coastguard Worker using hidl_hash = hidl_array<uint8_t, 32>;
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker namespace android {
66*38e8c45fSAndroid Build Coastguard Worker namespace hardware {
67*38e8c45fSAndroid Build Coastguard Worker namespace tests {
68*38e8c45fSAndroid Build Coastguard Worker namespace inheritance {
69*38e8c45fSAndroid Build Coastguard Worker namespace V1_0 {
70*38e8c45fSAndroid Build Coastguard Worker namespace implementation {
71*38e8c45fSAndroid Build Coastguard Worker struct Child : android::hardware::tests::inheritance::V1_0::IChild {
doChildandroid::hardware::tests::inheritance::V1_0::implementation::Child72*38e8c45fSAndroid Build Coastguard Worker     ::android::hardware::Return<void> doChild() override { return Void(); }
doParentandroid::hardware::tests::inheritance::V1_0::implementation::Child73*38e8c45fSAndroid Build Coastguard Worker     ::android::hardware::Return<void> doParent() override { return Void(); }
doGrandparentandroid::hardware::tests::inheritance::V1_0::implementation::Child74*38e8c45fSAndroid Build Coastguard Worker     ::android::hardware::Return<void> doGrandparent() override { return Void(); }
75*38e8c45fSAndroid Build Coastguard Worker 
debugandroid::hardware::tests::inheritance::V1_0::implementation::Child76*38e8c45fSAndroid Build Coastguard Worker     ::android::hardware::Return<void> debug(const hidl_handle& hh, const hidl_vec<hidl_string>& options) override {
77*38e8c45fSAndroid Build Coastguard Worker         const native_handle_t *handle = hh.getNativeHandle();
78*38e8c45fSAndroid Build Coastguard Worker         if (handle->numFds < 1) {
79*38e8c45fSAndroid Build Coastguard Worker             return Void();
80*38e8c45fSAndroid Build Coastguard Worker         }
81*38e8c45fSAndroid Build Coastguard Worker         int fd = handle->data[0];
82*38e8c45fSAndroid Build Coastguard Worker         std::string content{descriptor};
83*38e8c45fSAndroid Build Coastguard Worker         for (const auto &option : options) {
84*38e8c45fSAndroid Build Coastguard Worker             content += "\n";
85*38e8c45fSAndroid Build Coastguard Worker             content += option.c_str();
86*38e8c45fSAndroid Build Coastguard Worker         }
87*38e8c45fSAndroid Build Coastguard Worker         if (options.size() > 0) {
88*38e8c45fSAndroid Build Coastguard Worker             uint64_t len;
89*38e8c45fSAndroid Build Coastguard Worker             if (android::base::ParseUint(options[0], &len)) {
90*38e8c45fSAndroid Build Coastguard Worker                 content += "\n";
91*38e8c45fSAndroid Build Coastguard Worker                 content += std::string(len, 'X');
92*38e8c45fSAndroid Build Coastguard Worker             }
93*38e8c45fSAndroid Build Coastguard Worker         }
94*38e8c45fSAndroid Build Coastguard Worker         ssize_t written = write(fd, content.c_str(), content.size());
95*38e8c45fSAndroid Build Coastguard Worker         if (written != (ssize_t)content.size()) {
96*38e8c45fSAndroid Build Coastguard Worker             LOG(WARNING) << "SERVER(Child) debug writes " << written << " bytes < "
97*38e8c45fSAndroid Build Coastguard Worker                     << content.size() << " bytes, errno = " << errno;
98*38e8c45fSAndroid Build Coastguard Worker         }
99*38e8c45fSAndroid Build Coastguard Worker         return Void();
100*38e8c45fSAndroid Build Coastguard Worker     }
101*38e8c45fSAndroid Build Coastguard Worker };
102*38e8c45fSAndroid Build Coastguard Worker 
103*38e8c45fSAndroid Build Coastguard Worker } // namespace implementation
104*38e8c45fSAndroid Build Coastguard Worker } // namespace V1_0
105*38e8c45fSAndroid Build Coastguard Worker } // namespace inheritance
106*38e8c45fSAndroid Build Coastguard Worker } // namespace tests
107*38e8c45fSAndroid Build Coastguard Worker } // namespace hardware
108*38e8c45fSAndroid Build Coastguard Worker 
109*38e8c45fSAndroid Build Coastguard Worker namespace lshal {
110*38e8c45fSAndroid Build Coastguard Worker 
111*38e8c45fSAndroid Build Coastguard Worker class MockServiceManager : public IServiceManager {
112*38e8c45fSAndroid Build Coastguard Worker public:
113*38e8c45fSAndroid Build Coastguard Worker     template<typename T>
114*38e8c45fSAndroid Build Coastguard Worker     using R = ::android::hardware::Return<T>;
115*38e8c45fSAndroid Build Coastguard Worker     using String = const hidl_string&;
116*38e8c45fSAndroid Build Coastguard Worker     ~MockServiceManager() = default;
117*38e8c45fSAndroid Build Coastguard Worker 
118*38e8c45fSAndroid Build Coastguard Worker #define MOCK_METHOD_CB(name) MOCK_METHOD1(name, R<void>(IServiceManager::name##_cb))
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(get, R<sp<IBase>>(String, String));
121*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(add, R<bool>(String, const sp<IBase>&));
122*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(getTransport, R<IServiceManager::Transport>(String, String));
123*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(list);
124*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(listByInterface, R<void>(String, listByInterface_cb));
125*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD3(registerForNotifications, R<bool>(String, String, const sp<IServiceNotification>&));
126*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(debugDump);
127*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(registerPassthroughClient, R<void>(String, String));
128*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(interfaceChain);
129*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(debug, R<void>(const hidl_handle&, const hidl_vec<hidl_string>&));
130*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(interfaceDescriptor);
131*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(getHashChain);
132*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD0(setHalInstrumentation, R<void>());
133*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD2(linkToDeath, R<bool>(const sp<hidl_death_recipient>&, uint64_t));
134*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD0(ping, R<void>());
135*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD_CB(getDebugInfo);
136*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD0(notifySyspropsChanged, R<void>());
137*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD1(unlinkToDeath, R<bool>(const sp<hidl_death_recipient>&));
138*38e8c45fSAndroid Build Coastguard Worker 
139*38e8c45fSAndroid Build Coastguard Worker };
140*38e8c45fSAndroid Build Coastguard Worker 
141*38e8c45fSAndroid Build Coastguard Worker class DebugTest : public ::testing::Test {
142*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()143*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
144*38e8c45fSAndroid Build Coastguard Worker         using ::android::hardware::tests::inheritance::V1_0::IChild;
145*38e8c45fSAndroid Build Coastguard Worker         using ::android::hardware::tests::inheritance::V1_0::IParent;
146*38e8c45fSAndroid Build Coastguard Worker         using ::android::hardware::tests::inheritance::V1_0::IGrandparent;
147*38e8c45fSAndroid Build Coastguard Worker         using ::android::hardware::tests::inheritance::V1_0::implementation::Child;
148*38e8c45fSAndroid Build Coastguard Worker 
149*38e8c45fSAndroid Build Coastguard Worker         err.str("");
150*38e8c45fSAndroid Build Coastguard Worker         out.str("");
151*38e8c45fSAndroid Build Coastguard Worker         serviceManager = new testing::NiceMock<MockServiceManager>();
152*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*serviceManager, get(_, _))
153*38e8c45fSAndroid Build Coastguard Worker                 .WillByDefault(
154*38e8c45fSAndroid Build Coastguard Worker                         Invoke([](const auto& iface,
155*38e8c45fSAndroid Build Coastguard Worker                                   const auto& inst) -> ::android::hardware::Return<sp<IBase>> {
156*38e8c45fSAndroid Build Coastguard Worker                             if (inst != "default") return nullptr;
157*38e8c45fSAndroid Build Coastguard Worker                             if (iface == IChild::descriptor || iface == IParent::descriptor ||
158*38e8c45fSAndroid Build Coastguard Worker                                 iface == IGrandparent::descriptor)
159*38e8c45fSAndroid Build Coastguard Worker                                 return new Child();
160*38e8c45fSAndroid Build Coastguard Worker                             return nullptr;
161*38e8c45fSAndroid Build Coastguard Worker                         }));
162*38e8c45fSAndroid Build Coastguard Worker 
163*38e8c45fSAndroid Build Coastguard Worker         lshal = std::make_unique<Lshal>(out, err, serviceManager, serviceManager);
164*38e8c45fSAndroid Build Coastguard Worker     }
TearDown()165*38e8c45fSAndroid Build Coastguard Worker     void TearDown() override {}
166*38e8c45fSAndroid Build Coastguard Worker 
167*38e8c45fSAndroid Build Coastguard Worker     std::stringstream err;
168*38e8c45fSAndroid Build Coastguard Worker     std::stringstream out;
169*38e8c45fSAndroid Build Coastguard Worker     sp<MockServiceManager> serviceManager;
170*38e8c45fSAndroid Build Coastguard Worker 
171*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<Lshal> lshal;
172*38e8c45fSAndroid Build Coastguard Worker };
173*38e8c45fSAndroid Build Coastguard Worker 
createArg(const std::vector<const char * > & args)174*38e8c45fSAndroid Build Coastguard Worker static Arg createArg(const std::vector<const char*>& args) {
175*38e8c45fSAndroid Build Coastguard Worker     return Arg{static_cast<int>(args.size()), const_cast<char**>(args.data())};
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker 
178*38e8c45fSAndroid Build Coastguard Worker template<typename T>
callMain(const std::unique_ptr<T> & lshal,const std::vector<const char * > & args)179*38e8c45fSAndroid Build Coastguard Worker static Status callMain(const std::unique_ptr<T>& lshal, const std::vector<const char*>& args) {
180*38e8c45fSAndroid Build Coastguard Worker     return lshal->main(createArg(args));
181*38e8c45fSAndroid Build Coastguard Worker }
182*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,Debug)183*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, Debug) {
184*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, callMain(lshal, {
185*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "[email protected]::IChild/default", "foo", "bar"
186*38e8c45fSAndroid Build Coastguard Worker     }));
187*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), StrEq("[email protected]::IChild\nfoo\nbar"));
188*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), IsEmpty());
189*38e8c45fSAndroid Build Coastguard Worker }
190*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,Debug2)191*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, Debug2) {
192*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, callMain(lshal, {
193*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "[email protected]::IChild", "baz", "quux"
194*38e8c45fSAndroid Build Coastguard Worker     }));
195*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), StrEq("[email protected]::IChild\nbaz\nquux"));
196*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), IsEmpty());
197*38e8c45fSAndroid Build Coastguard Worker }
198*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,Debug3)199*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, Debug3) {
200*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, callMain(lshal, {
201*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "[email protected]::IDoesNotExist",
202*38e8c45fSAndroid Build Coastguard Worker     }));
203*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), HasSubstr("does not exist"));
204*38e8c45fSAndroid Build Coastguard Worker }
205*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,DebugLarge)206*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, DebugLarge) {
207*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, callMain(lshal, {
208*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "[email protected]::IChild/default", "10000"
209*38e8c45fSAndroid Build Coastguard Worker     }));
210*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(),
211*38e8c45fSAndroid Build Coastguard Worker                 StrEq("[email protected]::IChild\n10000\n" +
212*38e8c45fSAndroid Build Coastguard Worker                       std::string(10000, 'X')));
213*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), IsEmpty());
214*38e8c45fSAndroid Build Coastguard Worker }
215*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,DebugParent)216*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, DebugParent) {
217*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, callMain(lshal, {
218*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "[email protected]::IParent", "calling parent"
219*38e8c45fSAndroid Build Coastguard Worker     }));
220*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), StrEq("[email protected]::IChild\ncalling parent"));
221*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), IsEmpty());
222*38e8c45fSAndroid Build Coastguard Worker }
223*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(DebugTest,DebugParentExclude)224*38e8c45fSAndroid Build Coastguard Worker TEST_F(DebugTest, DebugParentExclude) {
225*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, callMain(lshal, {
226*38e8c45fSAndroid Build Coastguard Worker         "lshal", "debug", "-E", "[email protected]::IParent", "excluding"
227*38e8c45fSAndroid Build Coastguard Worker     }));
228*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), IsEmpty());
229*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), IsEmpty());
230*38e8c45fSAndroid Build Coastguard Worker }
231*38e8c45fSAndroid Build Coastguard Worker 
232*38e8c45fSAndroid Build Coastguard Worker class MockLshal : public Lshal {
233*38e8c45fSAndroid Build Coastguard Worker public:
MockLshal()234*38e8c45fSAndroid Build Coastguard Worker     MockLshal() {}
235*38e8c45fSAndroid Build Coastguard Worker     ~MockLshal() = default;
236*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(out, NullableOStream<std::ostream>());
237*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(err, NullableOStream<std::ostream>());
238*38e8c45fSAndroid Build Coastguard Worker };
239*38e8c45fSAndroid Build Coastguard Worker 
240*38e8c45fSAndroid Build Coastguard Worker // expose protected fields and methods for ListCommand
241*38e8c45fSAndroid Build Coastguard Worker class MockListCommand : public ListCommand {
242*38e8c45fSAndroid Build Coastguard Worker public:
MockListCommand(Lshal * lshal)243*38e8c45fSAndroid Build Coastguard Worker     explicit MockListCommand(Lshal* lshal) : ListCommand(*lshal) {}
244*38e8c45fSAndroid Build Coastguard Worker 
parseArgs(const Arg & arg)245*38e8c45fSAndroid Build Coastguard Worker     Status parseArgs(const Arg& arg) { return ListCommand::parseArgs(arg); }
main(const Arg & arg)246*38e8c45fSAndroid Build Coastguard Worker     Status main(const Arg& arg) { return ListCommand::main(arg); }
forEachTable(const std::function<void (Table &)> & f)247*38e8c45fSAndroid Build Coastguard Worker     void forEachTable(const std::function<void(Table &)> &f) {
248*38e8c45fSAndroid Build Coastguard Worker         return ListCommand::forEachTable(f);
249*38e8c45fSAndroid Build Coastguard Worker     }
forEachTable(const std::function<void (const Table &)> & f) const250*38e8c45fSAndroid Build Coastguard Worker     void forEachTable(const std::function<void(const Table &)> &f) const {
251*38e8c45fSAndroid Build Coastguard Worker         return ListCommand::forEachTable(f);
252*38e8c45fSAndroid Build Coastguard Worker     }
fetch()253*38e8c45fSAndroid Build Coastguard Worker     Status fetch() { return ListCommand::fetch(); }
dumpVintf(const NullableOStream<std::ostream> & out)254*38e8c45fSAndroid Build Coastguard Worker     void dumpVintf(const NullableOStream<std::ostream>& out) {
255*38e8c45fSAndroid Build Coastguard Worker         return ListCommand::dumpVintf(out);
256*38e8c45fSAndroid Build Coastguard Worker     }
internalPostprocess()257*38e8c45fSAndroid Build Coastguard Worker     void internalPostprocess() { ListCommand::postprocess(); }
getPidInfoCached(pid_t serverPid)258*38e8c45fSAndroid Build Coastguard Worker     const BinderPidInfo* getPidInfoCached(pid_t serverPid) {
259*38e8c45fSAndroid Build Coastguard Worker         return ListCommand::getPidInfoCached(serverPid);
260*38e8c45fSAndroid Build Coastguard Worker     }
261*38e8c45fSAndroid Build Coastguard Worker 
262*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD0(postprocess, void());
263*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD2(getPidInfo, bool(pid_t, BinderPidInfo*));
264*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD1(parseCmdline, std::string(pid_t));
265*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD1(getPartition, Partition(pid_t));
266*38e8c45fSAndroid Build Coastguard Worker 
267*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(getDeviceManifest, std::shared_ptr<const vintf::HalManifest>());
268*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(getDeviceMatrix, std::shared_ptr<const vintf::CompatibilityMatrix>());
269*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(getFrameworkManifest, std::shared_ptr<const vintf::HalManifest>());
270*38e8c45fSAndroid Build Coastguard Worker     MOCK_CONST_METHOD0(getFrameworkMatrix, std::shared_ptr<const vintf::CompatibilityMatrix>());
271*38e8c45fSAndroid Build Coastguard Worker };
272*38e8c45fSAndroid Build Coastguard Worker 
273*38e8c45fSAndroid Build Coastguard Worker class ListParseArgsTest : public ::testing::Test {
274*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()275*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
276*38e8c45fSAndroid Build Coastguard Worker         mockLshal = std::make_unique<NiceMock<MockLshal>>();
277*38e8c45fSAndroid Build Coastguard Worker         mockList = std::make_unique<MockListCommand>(mockLshal.get());
278*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockLshal, err()).WillByDefault(Return(NullableOStream<std::ostream>(err)));
279*38e8c45fSAndroid Build Coastguard Worker         // ListCommand::parseArgs should parse arguments from the second element
280*38e8c45fSAndroid Build Coastguard Worker         optind = 1;
281*38e8c45fSAndroid Build Coastguard Worker     }
282*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockLshal> mockLshal;
283*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockListCommand> mockList;
284*38e8c45fSAndroid Build Coastguard Worker     std::stringstream err;
285*38e8c45fSAndroid Build Coastguard Worker };
286*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListParseArgsTest,Args)287*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListParseArgsTest, Args) {
288*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->parseArgs(createArg({"lshal", "-p", "-i", "-a", "-c"})));
289*38e8c45fSAndroid Build Coastguard Worker     mockList->forEachTable([](const Table& table) {
290*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(SelectedColumns({TableColumnType::SERVER_PID, TableColumnType::INTERFACE_NAME,
291*38e8c45fSAndroid Build Coastguard Worker                                    TableColumnType::SERVER_ADDR, TableColumnType::CLIENT_PIDS}),
292*38e8c45fSAndroid Build Coastguard Worker                   table.getSelectedColumns());
293*38e8c45fSAndroid Build Coastguard Worker     });
294*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
295*38e8c45fSAndroid Build Coastguard Worker }
296*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListParseArgsTest,Cmds)297*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListParseArgsTest, Cmds) {
298*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->parseArgs(createArg({"lshal", "-m"})));
299*38e8c45fSAndroid Build Coastguard Worker     mockList->forEachTable([](const Table& table) {
300*38e8c45fSAndroid Build Coastguard Worker         EXPECT_THAT(table.getSelectedColumns(), Not(Contains(TableColumnType::SERVER_PID)))
301*38e8c45fSAndroid Build Coastguard Worker                 << "should not print server PID with -m";
302*38e8c45fSAndroid Build Coastguard Worker         EXPECT_THAT(table.getSelectedColumns(), Not(Contains(TableColumnType::CLIENT_PIDS)))
303*38e8c45fSAndroid Build Coastguard Worker                 << "should not print client PIDs with -m";
304*38e8c45fSAndroid Build Coastguard Worker         EXPECT_THAT(table.getSelectedColumns(), Contains(TableColumnType::SERVER_CMD))
305*38e8c45fSAndroid Build Coastguard Worker                 << "should print server cmd with -m";
306*38e8c45fSAndroid Build Coastguard Worker         EXPECT_THAT(table.getSelectedColumns(), Contains(TableColumnType::CLIENT_CMDS))
307*38e8c45fSAndroid Build Coastguard Worker                 << "should print client cmds with -m";
308*38e8c45fSAndroid Build Coastguard Worker     });
309*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
310*38e8c45fSAndroid Build Coastguard Worker }
311*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListParseArgsTest,DebugAndNeat)312*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListParseArgsTest, DebugAndNeat) {
313*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, mockList->parseArgs(createArg({"lshal", "--neat", "-d"})));
314*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), HasSubstr("--neat should not be used with --debug."));
315*38e8c45fSAndroid Build Coastguard Worker }
316*38e8c45fSAndroid Build Coastguard Worker 
317*38e8c45fSAndroid Build Coastguard Worker /// Fetch Test
318*38e8c45fSAndroid Build Coastguard Worker 
319*38e8c45fSAndroid Build Coastguard Worker // A set of deterministic functions to generate fake debug infos.
getPtr(pid_t serverId)320*38e8c45fSAndroid Build Coastguard Worker static uint64_t getPtr(pid_t serverId) { return 10000 + serverId; }
getClients(pid_t serverId)321*38e8c45fSAndroid Build Coastguard Worker static std::vector<pid_t> getClients(pid_t serverId) {
322*38e8c45fSAndroid Build Coastguard Worker     return {serverId + 1, serverId + 3};
323*38e8c45fSAndroid Build Coastguard Worker }
getPidInfoFromId(pid_t serverId)324*38e8c45fSAndroid Build Coastguard Worker static BinderPidInfo getPidInfoFromId(pid_t serverId) {
325*38e8c45fSAndroid Build Coastguard Worker     BinderPidInfo info;
326*38e8c45fSAndroid Build Coastguard Worker     info.refPids[getPtr(serverId)] = getClients(serverId);
327*38e8c45fSAndroid Build Coastguard Worker     info.threadUsage = 10 + serverId;
328*38e8c45fSAndroid Build Coastguard Worker     info.threadCount = 20 + serverId;
329*38e8c45fSAndroid Build Coastguard Worker     return info;
330*38e8c45fSAndroid Build Coastguard Worker }
getInterfaceName(pid_t serverId)331*38e8c45fSAndroid Build Coastguard Worker static std::string getInterfaceName(pid_t serverId) {
332*38e8c45fSAndroid Build Coastguard Worker     return "a.h.foo" + std::to_string(serverId) + "@" + std::to_string(serverId) + ".0::IFoo";
333*38e8c45fSAndroid Build Coastguard Worker }
getInstanceName(pid_t serverId)334*38e8c45fSAndroid Build Coastguard Worker static std::string getInstanceName(pid_t serverId) {
335*38e8c45fSAndroid Build Coastguard Worker     return std::to_string(serverId);
336*38e8c45fSAndroid Build Coastguard Worker }
getIdFromInstanceName(const hidl_string & instance)337*38e8c45fSAndroid Build Coastguard Worker static pid_t getIdFromInstanceName(const hidl_string& instance) {
338*38e8c45fSAndroid Build Coastguard Worker     return atoi(instance.c_str());
339*38e8c45fSAndroid Build Coastguard Worker }
getFqInstanceName(pid_t serverId)340*38e8c45fSAndroid Build Coastguard Worker static std::string getFqInstanceName(pid_t serverId) {
341*38e8c45fSAndroid Build Coastguard Worker     return getInterfaceName(serverId) + "/" + getInstanceName(serverId);
342*38e8c45fSAndroid Build Coastguard Worker }
getCmdlineFromId(pid_t serverId)343*38e8c45fSAndroid Build Coastguard Worker static std::string getCmdlineFromId(pid_t serverId) {
344*38e8c45fSAndroid Build Coastguard Worker     if (serverId == NO_PID) return "";
345*38e8c45fSAndroid Build Coastguard Worker     return "command_line_" + std::to_string(serverId);
346*38e8c45fSAndroid Build Coastguard Worker }
getIsReleasedFromId(pid_t p)347*38e8c45fSAndroid Build Coastguard Worker static bool getIsReleasedFromId(pid_t p) { return p % 2 == 0; }
getHashFromId(pid_t serverId)348*38e8c45fSAndroid Build Coastguard Worker static hidl_hash getHashFromId(pid_t serverId) {
349*38e8c45fSAndroid Build Coastguard Worker     hidl_hash hash;
350*38e8c45fSAndroid Build Coastguard Worker     bool isReleased = getIsReleasedFromId(serverId);
351*38e8c45fSAndroid Build Coastguard Worker     for (size_t i = 0; i < hash.size(); ++i) {
352*38e8c45fSAndroid Build Coastguard Worker         hash[i] = isReleased ? static_cast<uint8_t>(serverId) : 0u;
353*38e8c45fSAndroid Build Coastguard Worker     }
354*38e8c45fSAndroid Build Coastguard Worker     return hash;
355*38e8c45fSAndroid Build Coastguard Worker }
356*38e8c45fSAndroid Build Coastguard Worker 
357*38e8c45fSAndroid Build Coastguard Worker // Fake service returned by mocked IServiceManager::get.
358*38e8c45fSAndroid Build Coastguard Worker class TestService : public IBase {
359*38e8c45fSAndroid Build Coastguard Worker public:
TestService(pid_t id)360*38e8c45fSAndroid Build Coastguard Worker     explicit TestService(pid_t id) : mId(id) {}
getDebugInfo(getDebugInfo_cb cb)361*38e8c45fSAndroid Build Coastguard Worker     hardware::Return<void> getDebugInfo(getDebugInfo_cb cb) override {
362*38e8c45fSAndroid Build Coastguard Worker         cb({ mId /* pid */, getPtr(mId), DebugInfo::Architecture::IS_64BIT });
363*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
364*38e8c45fSAndroid Build Coastguard Worker     }
interfaceChain(interfaceChain_cb cb)365*38e8c45fSAndroid Build Coastguard Worker     hardware::Return<void> interfaceChain(interfaceChain_cb cb) override {
366*38e8c45fSAndroid Build Coastguard Worker         cb({getInterfaceName(mId), IBase::descriptor});
367*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
368*38e8c45fSAndroid Build Coastguard Worker     }
getHashChain(getHashChain_cb cb)369*38e8c45fSAndroid Build Coastguard Worker     hardware::Return<void> getHashChain(getHashChain_cb cb) override {
370*38e8c45fSAndroid Build Coastguard Worker         cb({getHashFromId(mId), getHashFromId(0xff)});
371*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
372*38e8c45fSAndroid Build Coastguard Worker     }
373*38e8c45fSAndroid Build Coastguard Worker private:
374*38e8c45fSAndroid Build Coastguard Worker     pid_t mId;
375*38e8c45fSAndroid Build Coastguard Worker };
376*38e8c45fSAndroid Build Coastguard Worker 
377*38e8c45fSAndroid Build Coastguard Worker class ListTest : public ::testing::Test {
378*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()379*38e8c45fSAndroid Build Coastguard Worker     virtual void SetUp() override {
380*38e8c45fSAndroid Build Coastguard Worker         initMockServiceManager();
381*38e8c45fSAndroid Build Coastguard Worker         lshal = std::make_unique<Lshal>(out, err, serviceManager, passthruManager);
382*38e8c45fSAndroid Build Coastguard Worker         initMockList();
383*38e8c45fSAndroid Build Coastguard Worker     }
384*38e8c45fSAndroid Build Coastguard Worker 
initMockList()385*38e8c45fSAndroid Build Coastguard Worker     void initMockList() {
386*38e8c45fSAndroid Build Coastguard Worker         mockList = std::make_unique<NiceMock<MockListCommand>>(lshal.get());
387*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getPidInfo(_,_)).WillByDefault(Invoke(
388*38e8c45fSAndroid Build Coastguard Worker             [](pid_t serverPid, BinderPidInfo* info) {
389*38e8c45fSAndroid Build Coastguard Worker                 *info = getPidInfoFromId(serverPid);
390*38e8c45fSAndroid Build Coastguard Worker                 return true;
391*38e8c45fSAndroid Build Coastguard Worker             }));
392*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, parseCmdline(_)).WillByDefault(Invoke(&getCmdlineFromId));
393*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, postprocess()).WillByDefault(Invoke([&]() {
394*38e8c45fSAndroid Build Coastguard Worker             mockList->internalPostprocess();
395*38e8c45fSAndroid Build Coastguard Worker             size_t i = 0;
396*38e8c45fSAndroid Build Coastguard Worker             mockList->forEachTable([&](Table& table) {
397*38e8c45fSAndroid Build Coastguard Worker                 table.setDescription("[fake description " + std::to_string(i++) + "]");
398*38e8c45fSAndroid Build Coastguard Worker             });
399*38e8c45fSAndroid Build Coastguard Worker         }));
400*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getPartition(_)).WillByDefault(Return(Partition::VENDOR));
401*38e8c45fSAndroid Build Coastguard Worker 
402*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getDeviceManifest())
403*38e8c45fSAndroid Build Coastguard Worker                 .WillByDefault(Return(std::make_shared<HalManifest>()));
404*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getDeviceMatrix())
405*38e8c45fSAndroid Build Coastguard Worker                 .WillByDefault(Return(std::make_shared<CompatibilityMatrix>()));
406*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getFrameworkManifest())
407*38e8c45fSAndroid Build Coastguard Worker                 .WillByDefault(Return(std::make_shared<HalManifest>()));
408*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*mockList, getFrameworkMatrix())
409*38e8c45fSAndroid Build Coastguard Worker                 .WillByDefault(Return(std::make_shared<CompatibilityMatrix>()));
410*38e8c45fSAndroid Build Coastguard Worker     }
411*38e8c45fSAndroid Build Coastguard Worker 
initMockServiceManager()412*38e8c45fSAndroid Build Coastguard Worker     void initMockServiceManager() {
413*38e8c45fSAndroid Build Coastguard Worker         serviceManager = new testing::NiceMock<MockServiceManager>();
414*38e8c45fSAndroid Build Coastguard Worker         passthruManager = new testing::NiceMock<MockServiceManager>();
415*38e8c45fSAndroid Build Coastguard Worker         using A = DebugInfo::Architecture;
416*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*serviceManager, list(_)).WillByDefault(Invoke(
417*38e8c45fSAndroid Build Coastguard Worker             [] (IServiceManager::list_cb cb) {
418*38e8c45fSAndroid Build Coastguard Worker                 cb({ getFqInstanceName(1), getFqInstanceName(2) });
419*38e8c45fSAndroid Build Coastguard Worker                 return hardware::Void();
420*38e8c45fSAndroid Build Coastguard Worker             }));
421*38e8c45fSAndroid Build Coastguard Worker 
422*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*serviceManager, get(_, _)).WillByDefault(Invoke(
423*38e8c45fSAndroid Build Coastguard Worker             [&](const hidl_string&, const hidl_string& instance) {
424*38e8c45fSAndroid Build Coastguard Worker                 int id = getIdFromInstanceName(instance);
425*38e8c45fSAndroid Build Coastguard Worker                 return sp<IBase>(new TestService(id));
426*38e8c45fSAndroid Build Coastguard Worker             }));
427*38e8c45fSAndroid Build Coastguard Worker 
428*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*serviceManager, debugDump(_)).WillByDefault(Invoke(
429*38e8c45fSAndroid Build Coastguard Worker             [] (IServiceManager::debugDump_cb cb) {
430*38e8c45fSAndroid Build Coastguard Worker                 cb({InstanceDebugInfo{getInterfaceName(3), getInstanceName(3), 3,
431*38e8c45fSAndroid Build Coastguard Worker                                       getClients(3), A::IS_32BIT},
432*38e8c45fSAndroid Build Coastguard Worker                     InstanceDebugInfo{getInterfaceName(4), getInstanceName(4), 4,
433*38e8c45fSAndroid Build Coastguard Worker                                       getClients(4), A::IS_32BIT}});
434*38e8c45fSAndroid Build Coastguard Worker                 return hardware::Void();
435*38e8c45fSAndroid Build Coastguard Worker             }));
436*38e8c45fSAndroid Build Coastguard Worker 
437*38e8c45fSAndroid Build Coastguard Worker         ON_CALL(*passthruManager, debugDump(_)).WillByDefault(Invoke(
438*38e8c45fSAndroid Build Coastguard Worker             [] (IServiceManager::debugDump_cb cb) {
439*38e8c45fSAndroid Build Coastguard Worker                 cb({InstanceDebugInfo{getInterfaceName(5), getInstanceName(5), 5,
440*38e8c45fSAndroid Build Coastguard Worker                                       getClients(5), A::IS_32BIT},
441*38e8c45fSAndroid Build Coastguard Worker                     InstanceDebugInfo{getInterfaceName(6), getInstanceName(6), 6,
442*38e8c45fSAndroid Build Coastguard Worker                                       getClients(6), A::IS_32BIT}});
443*38e8c45fSAndroid Build Coastguard Worker                 return hardware::Void();
444*38e8c45fSAndroid Build Coastguard Worker             }));
445*38e8c45fSAndroid Build Coastguard Worker     }
446*38e8c45fSAndroid Build Coastguard Worker 
447*38e8c45fSAndroid Build Coastguard Worker     std::stringstream err;
448*38e8c45fSAndroid Build Coastguard Worker     std::stringstream out;
449*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<Lshal> lshal;
450*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<MockListCommand> mockList;
451*38e8c45fSAndroid Build Coastguard Worker     sp<MockServiceManager> serviceManager;
452*38e8c45fSAndroid Build Coastguard Worker     sp<MockServiceManager> passthruManager;
453*38e8c45fSAndroid Build Coastguard Worker };
454*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,GetPidInfoCached)455*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, GetPidInfoCached) {
456*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mockList, getPidInfo(5, _)).Times(1);
457*38e8c45fSAndroid Build Coastguard Worker 
458*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(nullptr, mockList->getPidInfoCached(5));
459*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(nullptr, mockList->getPidInfoCached(5));
460*38e8c45fSAndroid Build Coastguard Worker }
461*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,Fetch)462*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, Fetch) {
463*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
464*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(0u, mockList->parseArgs(createArg({"lshal"})));
465*38e8c45fSAndroid Build Coastguard Worker     ASSERT_EQ(0u, mockList->fetch());
466*38e8c45fSAndroid Build Coastguard Worker     vintf::TransportArch hwbinder{Transport::HWBINDER, Arch::ARCH_64};
467*38e8c45fSAndroid Build Coastguard Worker     vintf::TransportArch passthrough{Transport::PASSTHROUGH, Arch::ARCH_32};
468*38e8c45fSAndroid Build Coastguard Worker     std::array<vintf::TransportArch, 6> transportArchs{{hwbinder, hwbinder, passthrough,
469*38e8c45fSAndroid Build Coastguard Worker                                                         passthrough, passthrough, passthrough}};
470*38e8c45fSAndroid Build Coastguard Worker     int i = 0;
471*38e8c45fSAndroid Build Coastguard Worker     mockList->forEachTable([&](const Table& table) {
472*38e8c45fSAndroid Build Coastguard Worker         for (const auto& entry : table) {
473*38e8c45fSAndroid Build Coastguard Worker             if (i >= transportArchs.size()) {
474*38e8c45fSAndroid Build Coastguard Worker                 break;
475*38e8c45fSAndroid Build Coastguard Worker             }
476*38e8c45fSAndroid Build Coastguard Worker 
477*38e8c45fSAndroid Build Coastguard Worker             int id = i + 1;
478*38e8c45fSAndroid Build Coastguard Worker             auto transport = transportArchs.at(i).transport;
479*38e8c45fSAndroid Build Coastguard Worker             TableEntry expected{
480*38e8c45fSAndroid Build Coastguard Worker                 .interfaceName = getFqInstanceName(id),
481*38e8c45fSAndroid Build Coastguard Worker                 .transport = transport,
482*38e8c45fSAndroid Build Coastguard Worker                 .serverPid = transport == Transport::HWBINDER ? id : NO_PID,
483*38e8c45fSAndroid Build Coastguard Worker                 .threadUsage =
484*38e8c45fSAndroid Build Coastguard Worker                         transport == Transport::HWBINDER ? getPidInfoFromId(id).threadUsage : 0,
485*38e8c45fSAndroid Build Coastguard Worker                 .threadCount =
486*38e8c45fSAndroid Build Coastguard Worker                         transport == Transport::HWBINDER ? getPidInfoFromId(id).threadCount : 0,
487*38e8c45fSAndroid Build Coastguard Worker                 .serverCmdline = {},
488*38e8c45fSAndroid Build Coastguard Worker                 .serverObjectAddress = transport == Transport::HWBINDER ? getPtr(id) : NO_PTR,
489*38e8c45fSAndroid Build Coastguard Worker                 .clientPids = getClients(id),
490*38e8c45fSAndroid Build Coastguard Worker                 .clientCmdlines = {},
491*38e8c45fSAndroid Build Coastguard Worker                 .arch = transportArchs.at(i).arch,
492*38e8c45fSAndroid Build Coastguard Worker             };
493*38e8c45fSAndroid Build Coastguard Worker             EXPECT_EQ(expected, entry) << expected.to_string() << " vs. " << entry.to_string();
494*38e8c45fSAndroid Build Coastguard Worker 
495*38e8c45fSAndroid Build Coastguard Worker             ++i;
496*38e8c45fSAndroid Build Coastguard Worker         }
497*38e8c45fSAndroid Build Coastguard Worker     });
498*38e8c45fSAndroid Build Coastguard Worker 
499*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(transportArchs.size(), i) << "Not all entries are tested.";
500*38e8c45fSAndroid Build Coastguard Worker 
501*38e8c45fSAndroid Build Coastguard Worker }
502*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpVintf)503*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpVintf) {
504*38e8c45fSAndroid Build Coastguard Worker     const std::string expected = "    <hal format=\"hidl\">\n"
505*38e8c45fSAndroid Build Coastguard Worker                                  "        <name>a.h.foo1</name>\n"
506*38e8c45fSAndroid Build Coastguard Worker                                  "        <transport>hwbinder</transport>\n"
507*38e8c45fSAndroid Build Coastguard Worker                                  "        <fqname>@1.0::IFoo/1</fqname>\n"
508*38e8c45fSAndroid Build Coastguard Worker                                  "    </hal>\n"
509*38e8c45fSAndroid Build Coastguard Worker                                  "    <hal format=\"hidl\">\n"
510*38e8c45fSAndroid Build Coastguard Worker                                  "        <name>a.h.foo2</name>\n"
511*38e8c45fSAndroid Build Coastguard Worker                                  "        <transport>hwbinder</transport>\n"
512*38e8c45fSAndroid Build Coastguard Worker                                  "        <fqname>@2.0::IFoo/2</fqname>\n"
513*38e8c45fSAndroid Build Coastguard Worker                                  "    </hal>\n"
514*38e8c45fSAndroid Build Coastguard Worker                                  "    <hal format=\"hidl\">\n"
515*38e8c45fSAndroid Build Coastguard Worker                                  "        <name>a.h.foo3</name>\n"
516*38e8c45fSAndroid Build Coastguard Worker                                  "        <transport arch=\"32\">passthrough</transport>\n"
517*38e8c45fSAndroid Build Coastguard Worker                                  "        <fqname>@3.0::IFoo/3</fqname>\n"
518*38e8c45fSAndroid Build Coastguard Worker                                  "    </hal>\n"
519*38e8c45fSAndroid Build Coastguard Worker                                  "    <hal format=\"hidl\">\n"
520*38e8c45fSAndroid Build Coastguard Worker                                  "        <name>a.h.foo4</name>\n"
521*38e8c45fSAndroid Build Coastguard Worker                                  "        <transport arch=\"32\">passthrough</transport>\n"
522*38e8c45fSAndroid Build Coastguard Worker                                  "        <fqname>@4.0::IFoo/4</fqname>\n"
523*38e8c45fSAndroid Build Coastguard Worker                                  "    </hal>\n";
524*38e8c45fSAndroid Build Coastguard Worker 
525*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
526*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "--init-vintf"})));
527*38e8c45fSAndroid Build Coastguard Worker     auto output = out.str();
528*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(output, HasSubstr(expected));
529*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(output, HasSubstr("[email protected]::IFoo/5"));
530*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(output, HasSubstr("[email protected]::IFoo/6"));
531*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
532*38e8c45fSAndroid Build Coastguard Worker 
533*38e8c45fSAndroid Build Coastguard Worker     std::string error;
534*38e8c45fSAndroid Build Coastguard Worker     vintf::HalManifest m;
535*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(true, vintf::fromXml(&m, out.str(), &error))
536*38e8c45fSAndroid Build Coastguard Worker         << "--init-vintf does not emit valid HAL manifest: " << error;
537*38e8c45fSAndroid Build Coastguard Worker }
538*38e8c45fSAndroid Build Coastguard Worker 
539*38e8c45fSAndroid Build Coastguard Worker // test default columns
TEST_F(ListTest,DumpDefault)540*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpDefault) {
541*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
542*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
543*38e8c45fSAndroid Build Coastguard Worker         "VINTF R Interface            Thread Use Server Clients\n"
544*38e8c45fSAndroid Build Coastguard Worker         "X     N [email protected]::IFoo/1 11/21      1      2 4\n"
545*38e8c45fSAndroid Build Coastguard Worker         "X     Y [email protected]::IFoo/2 12/22      2      3 5\n"
546*38e8c45fSAndroid Build Coastguard Worker         "\n"
547*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
548*38e8c45fSAndroid Build Coastguard Worker         "VINTF R Interface            Thread Use Server Clients\n"
549*38e8c45fSAndroid Build Coastguard Worker         "X     ? [email protected]::IFoo/3 N/A        N/A    4 6\n"
550*38e8c45fSAndroid Build Coastguard Worker         "X     ? [email protected]::IFoo/4 N/A        N/A    5 7\n"
551*38e8c45fSAndroid Build Coastguard Worker         "\n"
552*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
553*38e8c45fSAndroid Build Coastguard Worker         "VINTF R Interface            Thread Use Server Clients\n"
554*38e8c45fSAndroid Build Coastguard Worker         "X     ? [email protected]::IFoo/5 N/A        N/A    6 8\n"
555*38e8c45fSAndroid Build Coastguard Worker         "X     ? [email protected]::IFoo/6 N/A        N/A    7 9\n"
556*38e8c45fSAndroid Build Coastguard Worker         "\n";
557*38e8c45fSAndroid Build Coastguard Worker 
558*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
559*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal"})));
560*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
561*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
562*38e8c45fSAndroid Build Coastguard Worker }
563*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpHash)564*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpHash) {
565*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
566*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
567*38e8c45fSAndroid Build Coastguard Worker         "Interface            R Hash\n"
568*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 N 0000000000000000000000000000000000000000000000000000000000000000\n"
569*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 Y 0202020202020202020202020202020202020202020202020202020202020202\n"
570*38e8c45fSAndroid Build Coastguard Worker         "\n"
571*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
572*38e8c45fSAndroid Build Coastguard Worker         "Interface            R Hash\n"
573*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 ? \n"
574*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 ? \n"
575*38e8c45fSAndroid Build Coastguard Worker         "\n"
576*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
577*38e8c45fSAndroid Build Coastguard Worker         "Interface            R Hash\n"
578*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 ? \n"
579*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 ? \n"
580*38e8c45fSAndroid Build Coastguard Worker         "\n";
581*38e8c45fSAndroid Build Coastguard Worker 
582*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
583*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-ils"})));
584*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
585*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
586*38e8c45fSAndroid Build Coastguard Worker }
587*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,Dump)588*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, Dump) {
589*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
590*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
591*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Arch Thread Use Server PTR              Clients\n"
592*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  64   11/21      1      0000000000002711 2 4\n"
593*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  64   12/22      2      0000000000002712 3 5\n"
594*38e8c45fSAndroid Build Coastguard Worker         "\n"
595*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
596*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
597*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough 32   N/A        N/A    N/A 4 6\n"
598*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough 32   N/A        N/A    N/A 5 7\n"
599*38e8c45fSAndroid Build Coastguard Worker         "\n"
600*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
601*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
602*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough 32   N/A        N/A    N/A 6 8\n"
603*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough 32   N/A        N/A    N/A 7 9\n"
604*38e8c45fSAndroid Build Coastguard Worker         "\n";
605*38e8c45fSAndroid Build Coastguard Worker 
606*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
607*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepac"})));
608*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
609*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
610*38e8c45fSAndroid Build Coastguard Worker }
611*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpCmdline)612*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpCmdline) {
613*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
614*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
615*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Arch Thread Use Server CMD     PTR              Clients CMD\n"
616*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  64   11/21      command_line_1 0000000000002711 command_line_2;command_line_4\n"
617*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  64   12/22      command_line_2 0000000000002712 command_line_3;command_line_5\n"
618*38e8c45fSAndroid Build Coastguard Worker         "\n"
619*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
620*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server CMD PTR Clients CMD\n"
621*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough 32   N/A                   N/A command_line_4;command_line_6\n"
622*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough 32   N/A                   N/A command_line_5;command_line_7\n"
623*38e8c45fSAndroid Build Coastguard Worker         "\n"
624*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
625*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server CMD PTR Clients CMD\n"
626*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough 32   N/A                   N/A command_line_6;command_line_8\n"
627*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough 32   N/A                   N/A command_line_7;command_line_9\n"
628*38e8c45fSAndroid Build Coastguard Worker         "\n";
629*38e8c45fSAndroid Build Coastguard Worker 
630*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
631*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepacm"})));
632*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
633*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
634*38e8c45fSAndroid Build Coastguard Worker }
635*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpNeat)636*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpNeat) {
637*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
638*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 11/21 1   2 4\n"
639*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 12/22 2   3 5\n"
640*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 N/A   N/A 4 6\n"
641*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 N/A   N/A 5 7\n"
642*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 N/A   N/A 6 8\n"
643*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 N/A   N/A 7 9\n";
644*38e8c45fSAndroid Build Coastguard Worker 
645*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
646*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-iepc", "--neat"})));
647*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
648*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
649*38e8c45fSAndroid Build Coastguard Worker }
650*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpSingleHalType)651*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpSingleHalType) {
652*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
653*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
654*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Arch Thread Use Server PTR              Clients\n"
655*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  64   11/21      1      0000000000002711 2 4\n"
656*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  64   12/22      2      0000000000002712 3 5\n"
657*38e8c45fSAndroid Build Coastguard Worker         "\n";
658*38e8c45fSAndroid Build Coastguard Worker 
659*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
660*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepac", "--types=binderized"})));
661*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
662*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
663*38e8c45fSAndroid Build Coastguard Worker }
664*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpReorderedHalTypes)665*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpReorderedHalTypes) {
666*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
667*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
668*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
669*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough 32   N/A        N/A    N/A 4 6\n"
670*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough 32   N/A        N/A    N/A 5 7\n"
671*38e8c45fSAndroid Build Coastguard Worker         "\n"
672*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
673*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
674*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough 32   N/A        N/A    N/A 6 8\n"
675*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough 32   N/A        N/A    N/A 7 9\n"
676*38e8c45fSAndroid Build Coastguard Worker         "\n"
677*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
678*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Arch Thread Use Server PTR              Clients\n"
679*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  64   11/21      1      0000000000002711 2 4\n"
680*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  64   12/22      2      0000000000002712 3 5\n"
681*38e8c45fSAndroid Build Coastguard Worker         "\n";
682*38e8c45fSAndroid Build Coastguard Worker 
683*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
684*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepac", "--types=passthrough_clients",
685*38e8c45fSAndroid Build Coastguard Worker                                             "--types=passthrough_libs", "--types=binderized"})));
686*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
687*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
688*38e8c45fSAndroid Build Coastguard Worker }
689*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpAbbreviatedHalTypes)690*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpAbbreviatedHalTypes) {
691*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
692*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
693*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
694*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough 32   N/A        N/A    N/A 4 6\n"
695*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough 32   N/A        N/A    N/A 5 7\n"
696*38e8c45fSAndroid Build Coastguard Worker         "\n"
697*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
698*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
699*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough 32   N/A        N/A    N/A 6 8\n"
700*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough 32   N/A        N/A    N/A 7 9\n"
701*38e8c45fSAndroid Build Coastguard Worker         "\n";
702*38e8c45fSAndroid Build Coastguard Worker 
703*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
704*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepac", "--types=c,l"})));
705*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
706*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
707*38e8c45fSAndroid Build Coastguard Worker }
708*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpEmptyAndDuplicateHalTypes)709*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpEmptyAndDuplicateHalTypes) {
710*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
711*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
712*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
713*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough 32   N/A        N/A    N/A 4 6\n"
714*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough 32   N/A        N/A    N/A 5 7\n"
715*38e8c45fSAndroid Build Coastguard Worker         "\n"
716*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
717*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Arch Thread Use Server PTR Clients\n"
718*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough 32   N/A        N/A    N/A 6 8\n"
719*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough 32   N/A        N/A    N/A 7 9\n"
720*38e8c45fSAndroid Build Coastguard Worker         "\n";
721*38e8c45fSAndroid Build Coastguard Worker 
722*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
723*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-itrepac", "--types=c,l,,,l,l,c,",
724*38e8c45fSAndroid Build Coastguard Worker                                             "--types=passthrough_libs,passthrough_clients"})));
725*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
726*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
727*38e8c45fSAndroid Build Coastguard Worker }
728*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,UnknownHalType)729*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, UnknownHalType) {
730*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
731*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(1u, mockList->main(createArg({"lshal", "-itrepac", "--types=c,r"})));
732*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), HasSubstr("Unrecognized HAL type: r"));
733*38e8c45fSAndroid Build Coastguard Worker }
734*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,Vintf)735*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, Vintf) {
736*38e8c45fSAndroid Build Coastguard Worker     std::string deviceManifestXml =
737*38e8c45fSAndroid Build Coastguard Worker             "<manifest version=\"1.0\" type=\"device\">\n"
738*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
739*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo1</name>\n"
740*38e8c45fSAndroid Build Coastguard Worker             "        <transport>hwbinder</transport>\n"
741*38e8c45fSAndroid Build Coastguard Worker             "        <fqname>@1.0::IFoo/1</fqname>\n"
742*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
743*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
744*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo3</name>\n"
745*38e8c45fSAndroid Build Coastguard Worker             "        <transport arch=\"32+64\">passthrough</transport>\n"
746*38e8c45fSAndroid Build Coastguard Worker             "        <fqname>@3.0::IFoo/3</fqname>\n"
747*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
748*38e8c45fSAndroid Build Coastguard Worker             "</manifest>\n";
749*38e8c45fSAndroid Build Coastguard Worker     std::string frameworkManifestXml =
750*38e8c45fSAndroid Build Coastguard Worker             "<manifest version=\"1.0\" type=\"framework\">\n"
751*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
752*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo5</name>\n"
753*38e8c45fSAndroid Build Coastguard Worker             "        <transport arch=\"32\">passthrough</transport>\n"
754*38e8c45fSAndroid Build Coastguard Worker             "        <fqname>@5.0::IFoo/5</fqname>\n"
755*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
756*38e8c45fSAndroid Build Coastguard Worker             "</manifest>\n";
757*38e8c45fSAndroid Build Coastguard Worker     std::string deviceMatrixXml =
758*38e8c45fSAndroid Build Coastguard Worker             "<compatibility-matrix version=\"1.0\" type=\"device\">\n"
759*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
760*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo5</name>\n"
761*38e8c45fSAndroid Build Coastguard Worker             "        <version>5.0</version>\n"
762*38e8c45fSAndroid Build Coastguard Worker             "        <interface>\n"
763*38e8c45fSAndroid Build Coastguard Worker             "            <name>IFoo</name>\n"
764*38e8c45fSAndroid Build Coastguard Worker             "            <instance>5</instance>\n"
765*38e8c45fSAndroid Build Coastguard Worker             "        </interface>\n"
766*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
767*38e8c45fSAndroid Build Coastguard Worker             "</compatibility-matrix>\n";
768*38e8c45fSAndroid Build Coastguard Worker     std::string frameworkMatrixXml =
769*38e8c45fSAndroid Build Coastguard Worker             "<compatibility-matrix version=\"1.0\" type=\"framework\">\n"
770*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
771*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo1</name>\n"
772*38e8c45fSAndroid Build Coastguard Worker             "        <version>1.0</version>\n"
773*38e8c45fSAndroid Build Coastguard Worker             "        <interface>\n"
774*38e8c45fSAndroid Build Coastguard Worker             "            <name>IFoo</name>\n"
775*38e8c45fSAndroid Build Coastguard Worker             "            <instance>1</instance>\n"
776*38e8c45fSAndroid Build Coastguard Worker             "        </interface>\n"
777*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
778*38e8c45fSAndroid Build Coastguard Worker             "    <hal>\n"
779*38e8c45fSAndroid Build Coastguard Worker             "        <name>a.h.foo3</name>\n"
780*38e8c45fSAndroid Build Coastguard Worker             "        <version>3.0</version>\n"
781*38e8c45fSAndroid Build Coastguard Worker             "        <interface>\n"
782*38e8c45fSAndroid Build Coastguard Worker             "            <name>IFoo</name>\n"
783*38e8c45fSAndroid Build Coastguard Worker             "            <instance>3</instance>\n"
784*38e8c45fSAndroid Build Coastguard Worker             "        </interface>\n"
785*38e8c45fSAndroid Build Coastguard Worker             "    </hal>\n"
786*38e8c45fSAndroid Build Coastguard Worker             "</compatibility-matrix>\n";
787*38e8c45fSAndroid Build Coastguard Worker 
788*38e8c45fSAndroid Build Coastguard Worker     std::string expected = "DM,FC [email protected]::IFoo/1\n"
789*38e8c45fSAndroid Build Coastguard Worker                            "X     [email protected]::IFoo/2\n"
790*38e8c45fSAndroid Build Coastguard Worker                            "DM,FC [email protected]::IFoo/3\n"
791*38e8c45fSAndroid Build Coastguard Worker                            "X     [email protected]::IFoo/4\n"
792*38e8c45fSAndroid Build Coastguard Worker                            "DC,FM [email protected]::IFoo/5\n"
793*38e8c45fSAndroid Build Coastguard Worker                            "X     [email protected]::IFoo/6\n";
794*38e8c45fSAndroid Build Coastguard Worker 
795*38e8c45fSAndroid Build Coastguard Worker     auto deviceManifest = std::make_shared<HalManifest>();
796*38e8c45fSAndroid Build Coastguard Worker     auto frameworkManifest = std::make_shared<HalManifest>();
797*38e8c45fSAndroid Build Coastguard Worker     auto deviceMatrix = std::make_shared<CompatibilityMatrix>();
798*38e8c45fSAndroid Build Coastguard Worker     auto frameworkMatrix = std::make_shared<CompatibilityMatrix>();
799*38e8c45fSAndroid Build Coastguard Worker 
800*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(fromXml(deviceManifest.get(), deviceManifestXml));
801*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(fromXml(frameworkManifest.get(), frameworkManifestXml));
802*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(fromXml(deviceMatrix.get(), deviceMatrixXml));
803*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(fromXml(frameworkMatrix.get(), frameworkMatrixXml));
804*38e8c45fSAndroid Build Coastguard Worker 
805*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*mockList, getDeviceManifest()).WillByDefault(Return(deviceManifest));
806*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*mockList, getDeviceMatrix()).WillByDefault(Return(deviceMatrix));
807*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*mockList, getFrameworkManifest()).WillByDefault(Return(frameworkManifest));
808*38e8c45fSAndroid Build Coastguard Worker     ON_CALL(*mockList, getFrameworkMatrix()).WillByDefault(Return(frameworkMatrix));
809*38e8c45fSAndroid Build Coastguard Worker 
810*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
811*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-Vi", "--neat"})));
812*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr(expected));
813*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
814*38e8c45fSAndroid Build Coastguard Worker }
815*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,AllColumns)816*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, AllColumns) {
817*38e8c45fSAndroid Build Coastguard Worker     // clang-format off
818*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
819*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
820*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Server PTR              Arch Thread Use R Hash                                                             VINTF Status Clients\n"
821*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  1      0000000000002711 64   11/21      N 0000000000000000000000000000000000000000000000000000000000000000 X     alive  2 4\n"
822*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  2      0000000000002712 64   12/22      Y 0202020202020202020202020202020202020202020202020202020202020202 X     alive  3 5\n"
823*38e8c45fSAndroid Build Coastguard Worker         "\n"
824*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
825*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Server PTR Arch Thread Use R Hash VINTF Status Clients\n"
826*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough N/A    N/A 32   N/A        ?      X     N/A    4 6\n"
827*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough N/A    N/A 32   N/A        ?      X     N/A    5 7\n"
828*38e8c45fSAndroid Build Coastguard Worker         "\n"
829*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
830*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Server PTR Arch Thread Use R Hash VINTF Status Clients\n"
831*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough N/A    N/A 32   N/A        ?      X     N/A    6 8\n"
832*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough N/A    N/A 32   N/A        ?      X     N/A    7 9\n"
833*38e8c45fSAndroid Build Coastguard Worker         "\n";
834*38e8c45fSAndroid Build Coastguard Worker     // clang-format on
835*38e8c45fSAndroid Build Coastguard Worker 
836*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
837*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "--all"})));
838*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
839*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
840*38e8c45fSAndroid Build Coastguard Worker }
841*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,AllColumnsWithCmd)842*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, AllColumnsWithCmd) {
843*38e8c45fSAndroid Build Coastguard Worker     // clang-format off
844*38e8c45fSAndroid Build Coastguard Worker     const std::string expected =
845*38e8c45fSAndroid Build Coastguard Worker         "[fake description 0]\n"
846*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport Server CMD     PTR              Arch Thread Use R Hash                                                             VINTF Status Clients CMD\n"
847*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/1 hwbinder  command_line_1 0000000000002711 64   11/21      N 0000000000000000000000000000000000000000000000000000000000000000 X     alive  command_line_2;command_line_4\n"
848*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/2 hwbinder  command_line_2 0000000000002712 64   12/22      Y 0202020202020202020202020202020202020202020202020202020202020202 X     alive  command_line_3;command_line_5\n"
849*38e8c45fSAndroid Build Coastguard Worker         "\n"
850*38e8c45fSAndroid Build Coastguard Worker         "[fake description 1]\n"
851*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Server CMD PTR Arch Thread Use R Hash VINTF Status Clients CMD\n"
852*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/3 passthrough            N/A 32   N/A        ?      X     N/A    command_line_4;command_line_6\n"
853*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/4 passthrough            N/A 32   N/A        ?      X     N/A    command_line_5;command_line_7\n"
854*38e8c45fSAndroid Build Coastguard Worker         "\n"
855*38e8c45fSAndroid Build Coastguard Worker         "[fake description 2]\n"
856*38e8c45fSAndroid Build Coastguard Worker         "Interface            Transport   Server CMD PTR Arch Thread Use R Hash VINTF Status Clients CMD\n"
857*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/5 passthrough            N/A 32   N/A        ?      X     N/A    command_line_6;command_line_8\n"
858*38e8c45fSAndroid Build Coastguard Worker         "[email protected]::IFoo/6 passthrough            N/A 32   N/A        ?      X     N/A    command_line_7;command_line_9\n"
859*38e8c45fSAndroid Build Coastguard Worker         "\n";
860*38e8c45fSAndroid Build Coastguard Worker     // clang-format on
861*38e8c45fSAndroid Build Coastguard Worker 
862*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
863*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-Am"})));
864*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
865*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
866*38e8c45fSAndroid Build Coastguard Worker }
867*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,AllSections)868*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, AllSections) {
869*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
870*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "--types=all"})));
871*38e8c45fSAndroid Build Coastguard Worker     using HalTypeBase = std::underlying_type_t<HalType>;
872*38e8c45fSAndroid Build Coastguard Worker     for (HalTypeBase i = 0; i < static_cast<HalTypeBase>(HalType::LAST); ++i) {
873*38e8c45fSAndroid Build Coastguard Worker         EXPECT_THAT(out.str(), HasSubstr("[fake description " + std::to_string(i) + "]"));
874*38e8c45fSAndroid Build Coastguard Worker     }
875*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(),
876*38e8c45fSAndroid Build Coastguard Worker                 Not(HasSubstr("[fake description " +
877*38e8c45fSAndroid Build Coastguard Worker                               std::to_string(static_cast<HalTypeBase>(HalType::LAST)) + "]")));
878*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
879*38e8c45fSAndroid Build Coastguard Worker }
880*38e8c45fSAndroid Build Coastguard Worker 
881*38e8c45fSAndroid Build Coastguard Worker // Fake service returned by mocked IServiceManager::get for DumpDebug.
882*38e8c45fSAndroid Build Coastguard Worker // The interfaceChain and getHashChain functions returns
883*38e8c45fSAndroid Build Coastguard Worker // foo(id - 1) -> foo(id - 2) -> ... foo1 -> IBase.
884*38e8c45fSAndroid Build Coastguard Worker class InheritingService : public IBase {
885*38e8c45fSAndroid Build Coastguard Worker public:
InheritingService(pid_t id)886*38e8c45fSAndroid Build Coastguard Worker     explicit InheritingService(pid_t id) : mId(id) {}
interfaceDescriptor(interfaceDescriptor_cb cb)887*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> interfaceDescriptor(interfaceDescriptor_cb cb) override {
888*38e8c45fSAndroid Build Coastguard Worker         cb(getInterfaceName(mId));
889*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
890*38e8c45fSAndroid Build Coastguard Worker     }
interfaceChain(interfaceChain_cb cb)891*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> interfaceChain(interfaceChain_cb cb) override {
892*38e8c45fSAndroid Build Coastguard Worker         std::vector<hidl_string> ret;
893*38e8c45fSAndroid Build Coastguard Worker         for (auto i = mId; i > 0; --i) {
894*38e8c45fSAndroid Build Coastguard Worker             ret.push_back(getInterfaceName(i));
895*38e8c45fSAndroid Build Coastguard Worker         }
896*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(IBase::descriptor);
897*38e8c45fSAndroid Build Coastguard Worker         cb(ret);
898*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
899*38e8c45fSAndroid Build Coastguard Worker     }
getHashChain(getHashChain_cb cb)900*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> getHashChain(getHashChain_cb cb) override {
901*38e8c45fSAndroid Build Coastguard Worker         std::vector<hidl_hash> ret;
902*38e8c45fSAndroid Build Coastguard Worker         for (auto i = mId; i > 0; --i) {
903*38e8c45fSAndroid Build Coastguard Worker             ret.push_back(getHashFromId(i));
904*38e8c45fSAndroid Build Coastguard Worker         }
905*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(getHashFromId(0xff));
906*38e8c45fSAndroid Build Coastguard Worker         cb(ret);
907*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
908*38e8c45fSAndroid Build Coastguard Worker     }
debug(const hidl_handle & hh,const hidl_vec<hidl_string> &)909*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> debug(const hidl_handle& hh,
910*38e8c45fSAndroid Build Coastguard Worker                                           const hidl_vec<hidl_string>&) override {
911*38e8c45fSAndroid Build Coastguard Worker         const native_handle_t* handle = hh.getNativeHandle();
912*38e8c45fSAndroid Build Coastguard Worker         if (handle->numFds < 1) {
913*38e8c45fSAndroid Build Coastguard Worker             return Void();
914*38e8c45fSAndroid Build Coastguard Worker         }
915*38e8c45fSAndroid Build Coastguard Worker         int fd = handle->data[0];
916*38e8c45fSAndroid Build Coastguard Worker         std::string content = "debug info for ";
917*38e8c45fSAndroid Build Coastguard Worker         content += getInterfaceName(mId);
918*38e8c45fSAndroid Build Coastguard Worker         ssize_t written = write(fd, content.c_str(), content.size());
919*38e8c45fSAndroid Build Coastguard Worker         if (written != (ssize_t)content.size()) {
920*38e8c45fSAndroid Build Coastguard Worker             LOG(WARNING) << "SERVER(" << descriptor << ") debug writes " << written << " bytes < "
921*38e8c45fSAndroid Build Coastguard Worker                          << content.size() << " bytes, errno = " << errno;
922*38e8c45fSAndroid Build Coastguard Worker         }
923*38e8c45fSAndroid Build Coastguard Worker         return Void();
924*38e8c45fSAndroid Build Coastguard Worker     }
925*38e8c45fSAndroid Build Coastguard Worker 
926*38e8c45fSAndroid Build Coastguard Worker private:
927*38e8c45fSAndroid Build Coastguard Worker     pid_t mId;
928*38e8c45fSAndroid Build Coastguard Worker };
929*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListTest,DumpDebug)930*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListTest, DumpDebug) {
931*38e8c45fSAndroid Build Coastguard Worker     size_t inheritanceLevel = 3;
932*38e8c45fSAndroid Build Coastguard Worker     sp<IBase> service = new InheritingService(inheritanceLevel);
933*38e8c45fSAndroid Build Coastguard Worker 
934*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*serviceManager, list(_)).WillRepeatedly(Invoke([&](IServiceManager::list_cb cb) {
935*38e8c45fSAndroid Build Coastguard Worker         std::vector<hidl_string> ret;
936*38e8c45fSAndroid Build Coastguard Worker         for (auto i = 1; i <= inheritanceLevel; ++i) {
937*38e8c45fSAndroid Build Coastguard Worker             ret.push_back(getInterfaceName(i) + "/default");
938*38e8c45fSAndroid Build Coastguard Worker         }
939*38e8c45fSAndroid Build Coastguard Worker         cb(ret);
940*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
941*38e8c45fSAndroid Build Coastguard Worker     }));
942*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*serviceManager, get(_, _))
943*38e8c45fSAndroid Build Coastguard Worker             .WillRepeatedly(Invoke([&](const hidl_string&, const hidl_string&) -> sp<IBase> {
944*38e8c45fSAndroid Build Coastguard Worker                 return sp<IBase>(service);
945*38e8c45fSAndroid Build Coastguard Worker             }));
946*38e8c45fSAndroid Build Coastguard Worker 
947*38e8c45fSAndroid Build Coastguard Worker     const std::string expected = "[fake description 0]\n"
948*38e8c45fSAndroid Build Coastguard Worker                                  "Interface\n"
949*38e8c45fSAndroid Build Coastguard Worker                                  "[email protected]::IFoo/default\n"
950*38e8c45fSAndroid Build Coastguard Worker                                  "[See [email protected]::IFoo/default]\n"
951*38e8c45fSAndroid Build Coastguard Worker                                  "[email protected]::IFoo/default\n"
952*38e8c45fSAndroid Build Coastguard Worker                                  "[See [email protected]::IFoo/default]\n"
953*38e8c45fSAndroid Build Coastguard Worker                                  "[email protected]::IFoo/default\n"
954*38e8c45fSAndroid Build Coastguard Worker                                  "debug info for [email protected]::IFoo\n"
955*38e8c45fSAndroid Build Coastguard Worker                                  "\n";
956*38e8c45fSAndroid Build Coastguard Worker 
957*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
958*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "--types=b", "-id"})));
959*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(expected, out.str());
960*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
961*38e8c45fSAndroid Build Coastguard Worker }
962*38e8c45fSAndroid Build Coastguard Worker 
963*38e8c45fSAndroid Build Coastguard Worker // In SlowService, everything goes slooooooow. Each IPC call will wait for
964*38e8c45fSAndroid Build Coastguard Worker // the specified time before calling the callback function or returning.
965*38e8c45fSAndroid Build Coastguard Worker class SlowService : public IBase {
966*38e8c45fSAndroid Build Coastguard Worker public:
SlowService(std::chrono::milliseconds wait)967*38e8c45fSAndroid Build Coastguard Worker     explicit SlowService(std::chrono::milliseconds wait) : mWait(wait) {}
interfaceDescriptor(interfaceDescriptor_cb cb)968*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> interfaceDescriptor(interfaceDescriptor_cb cb) override {
969*38e8c45fSAndroid Build Coastguard Worker         std::this_thread::sleep_for(mWait);
970*38e8c45fSAndroid Build Coastguard Worker         cb(getInterfaceName(1));
971*38e8c45fSAndroid Build Coastguard Worker         storeHistory("interfaceDescriptor");
972*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
973*38e8c45fSAndroid Build Coastguard Worker     }
interfaceChain(interfaceChain_cb cb)974*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> interfaceChain(interfaceChain_cb cb) override {
975*38e8c45fSAndroid Build Coastguard Worker         std::this_thread::sleep_for(mWait);
976*38e8c45fSAndroid Build Coastguard Worker         std::vector<hidl_string> ret;
977*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(getInterfaceName(1));
978*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(IBase::descriptor);
979*38e8c45fSAndroid Build Coastguard Worker         cb(ret);
980*38e8c45fSAndroid Build Coastguard Worker         storeHistory("interfaceChain");
981*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
982*38e8c45fSAndroid Build Coastguard Worker     }
getHashChain(getHashChain_cb cb)983*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> getHashChain(getHashChain_cb cb) override {
984*38e8c45fSAndroid Build Coastguard Worker         std::this_thread::sleep_for(mWait);
985*38e8c45fSAndroid Build Coastguard Worker         std::vector<hidl_hash> ret;
986*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(getHashFromId(0));
987*38e8c45fSAndroid Build Coastguard Worker         ret.push_back(getHashFromId(0xff));
988*38e8c45fSAndroid Build Coastguard Worker         cb(ret);
989*38e8c45fSAndroid Build Coastguard Worker         storeHistory("getHashChain");
990*38e8c45fSAndroid Build Coastguard Worker         return hardware::Void();
991*38e8c45fSAndroid Build Coastguard Worker     }
debug(const hidl_handle &,const hidl_vec<hidl_string> &)992*38e8c45fSAndroid Build Coastguard Worker     android::hardware::Return<void> debug(const hidl_handle&,
993*38e8c45fSAndroid Build Coastguard Worker                                           const hidl_vec<hidl_string>&) override {
994*38e8c45fSAndroid Build Coastguard Worker         std::this_thread::sleep_for(mWait);
995*38e8c45fSAndroid Build Coastguard Worker         storeHistory("debug");
996*38e8c45fSAndroid Build Coastguard Worker         return Void();
997*38e8c45fSAndroid Build Coastguard Worker     }
998*38e8c45fSAndroid Build Coastguard Worker 
999*38e8c45fSAndroid Build Coastguard Worker     template <class R, class P, class Pred>
waitForHistory(std::chrono::duration<R,P> wait,Pred predicate)1000*38e8c45fSAndroid Build Coastguard Worker     bool waitForHistory(std::chrono::duration<R, P> wait, Pred predicate) {
1001*38e8c45fSAndroid Build Coastguard Worker         std::unique_lock<std::mutex> lock(mLock);
1002*38e8c45fSAndroid Build Coastguard Worker         return mCv.wait_for(lock, wait, [&]() { return predicate(mCallHistory); });
1003*38e8c45fSAndroid Build Coastguard Worker     }
1004*38e8c45fSAndroid Build Coastguard Worker 
1005*38e8c45fSAndroid Build Coastguard Worker private:
storeHistory(std::string hist)1006*38e8c45fSAndroid Build Coastguard Worker     void storeHistory(std::string hist) {
1007*38e8c45fSAndroid Build Coastguard Worker         {
1008*38e8c45fSAndroid Build Coastguard Worker             std::lock_guard<std::mutex> lock(mLock);
1009*38e8c45fSAndroid Build Coastguard Worker             mCallHistory.emplace_back(std::move(hist));
1010*38e8c45fSAndroid Build Coastguard Worker         }
1011*38e8c45fSAndroid Build Coastguard Worker         mCv.notify_all();
1012*38e8c45fSAndroid Build Coastguard Worker     }
1013*38e8c45fSAndroid Build Coastguard Worker 
1014*38e8c45fSAndroid Build Coastguard Worker     const std::chrono::milliseconds mWait;
1015*38e8c45fSAndroid Build Coastguard Worker     std::mutex mLock;
1016*38e8c45fSAndroid Build Coastguard Worker     std::condition_variable mCv;
1017*38e8c45fSAndroid Build Coastguard Worker     // List of functions that have finished being called on this interface.
1018*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::string> mCallHistory;
1019*38e8c45fSAndroid Build Coastguard Worker };
1020*38e8c45fSAndroid Build Coastguard Worker 
1021*38e8c45fSAndroid Build Coastguard Worker class TimeoutTest : public ListTest {
1022*38e8c45fSAndroid Build Coastguard Worker public:
setMockServiceManager(sp<IBase> service)1023*38e8c45fSAndroid Build Coastguard Worker     void setMockServiceManager(sp<IBase> service) {
1024*38e8c45fSAndroid Build Coastguard Worker         EXPECT_CALL(*serviceManager, list(_))
1025*38e8c45fSAndroid Build Coastguard Worker                 .WillRepeatedly(Invoke([&](IServiceManager::list_cb cb) {
1026*38e8c45fSAndroid Build Coastguard Worker                     std::vector<hidl_string> ret;
1027*38e8c45fSAndroid Build Coastguard Worker                     ret.push_back(getInterfaceName(1) + "/default");
1028*38e8c45fSAndroid Build Coastguard Worker                     cb(ret);
1029*38e8c45fSAndroid Build Coastguard Worker                     return hardware::Void();
1030*38e8c45fSAndroid Build Coastguard Worker                 }));
1031*38e8c45fSAndroid Build Coastguard Worker         EXPECT_CALL(*serviceManager, get(_, _))
1032*38e8c45fSAndroid Build Coastguard Worker                 .WillRepeatedly(Invoke([&](const hidl_string&, const hidl_string&) -> sp<IBase> {
1033*38e8c45fSAndroid Build Coastguard Worker                     return service;
1034*38e8c45fSAndroid Build Coastguard Worker                 }));
1035*38e8c45fSAndroid Build Coastguard Worker     }
1036*38e8c45fSAndroid Build Coastguard Worker };
1037*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(TimeoutTest,BackgroundThreadIsKept)1038*38e8c45fSAndroid Build Coastguard Worker TEST_F(TimeoutTest, BackgroundThreadIsKept) {
1039*38e8c45fSAndroid Build Coastguard Worker     auto lshalIpcTimeout = 100ms;
1040*38e8c45fSAndroid Build Coastguard Worker     auto serviceIpcTimeout = 200ms;
1041*38e8c45fSAndroid Build Coastguard Worker     lshal->setWaitTimeForTest(lshalIpcTimeout, lshalIpcTimeout);
1042*38e8c45fSAndroid Build Coastguard Worker     sp<SlowService> service = new SlowService(serviceIpcTimeout);
1043*38e8c45fSAndroid Build Coastguard Worker     setMockServiceManager(service);
1044*38e8c45fSAndroid Build Coastguard Worker 
1045*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
1046*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, mockList->main(createArg({"lshal", "--types=b", "-i", "--neat"})));
1047*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), HasSubstr("Skipping \"[email protected]::IFoo/default\""));
1048*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(service->waitForHistory(serviceIpcTimeout * 5, [](const auto& hist) {
1049*38e8c45fSAndroid Build Coastguard Worker         return hist.size() == 1 && hist[0] == "interfaceChain";
1050*38e8c45fSAndroid Build Coastguard Worker     })) << "The background thread should continue after the main thread moves on, but it is killed";
1051*38e8c45fSAndroid Build Coastguard Worker }
1052*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(TimeoutTest,BackgroundThreadDoesNotBlockMainThread)1053*38e8c45fSAndroid Build Coastguard Worker TEST_F(TimeoutTest, BackgroundThreadDoesNotBlockMainThread) {
1054*38e8c45fSAndroid Build Coastguard Worker     auto lshalIpcTimeout = 100ms;
1055*38e8c45fSAndroid Build Coastguard Worker     auto serviceIpcTimeout = 2000ms;
1056*38e8c45fSAndroid Build Coastguard Worker     auto start = std::chrono::system_clock::now();
1057*38e8c45fSAndroid Build Coastguard Worker     lshal->setWaitTimeForTest(lshalIpcTimeout, lshalIpcTimeout);
1058*38e8c45fSAndroid Build Coastguard Worker     sp<SlowService> service = new SlowService(serviceIpcTimeout);
1059*38e8c45fSAndroid Build Coastguard Worker     setMockServiceManager(service);
1060*38e8c45fSAndroid Build Coastguard Worker 
1061*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
1062*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, mockList->main(createArg({"lshal", "--types=b", "-i", "--neat"})));
1063*38e8c45fSAndroid Build Coastguard Worker     EXPECT_LE(std::chrono::system_clock::now(), start + 5 * lshalIpcTimeout)
1064*38e8c45fSAndroid Build Coastguard Worker             << "The main thread should not be blocked by the background task";
1065*38e8c45fSAndroid Build Coastguard Worker }
1066*38e8c45fSAndroid Build Coastguard Worker 
1067*38e8c45fSAndroid Build Coastguard Worker class ListVintfTest : public ListTest {
1068*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()1069*38e8c45fSAndroid Build Coastguard Worker     virtual void SetUp() override {
1070*38e8c45fSAndroid Build Coastguard Worker         ListTest::SetUp();
1071*38e8c45fSAndroid Build Coastguard Worker         const std::string mockManifestXml =
1072*38e8c45fSAndroid Build Coastguard Worker                 "<manifest version=\"1.0\" type=\"device\">\n"
1073*38e8c45fSAndroid Build Coastguard Worker                 "    <hal format=\"hidl\">\n"
1074*38e8c45fSAndroid Build Coastguard Worker                 "        <name>a.h.foo1</name>\n"
1075*38e8c45fSAndroid Build Coastguard Worker                 "        <transport>hwbinder</transport>\n"
1076*38e8c45fSAndroid Build Coastguard Worker                 "        <fqname>@1.0::IFoo/1</fqname>\n"
1077*38e8c45fSAndroid Build Coastguard Worker                 "    </hal>\n"
1078*38e8c45fSAndroid Build Coastguard Worker                 "    <hal format=\"hidl\">\n"
1079*38e8c45fSAndroid Build Coastguard Worker                 "        <name>a.h.bar1</name>\n"
1080*38e8c45fSAndroid Build Coastguard Worker                 "        <transport>hwbinder</transport>\n"
1081*38e8c45fSAndroid Build Coastguard Worker                 "        <fqname>@1.0::IBar/1</fqname>\n"
1082*38e8c45fSAndroid Build Coastguard Worker                 "    </hal>\n"
1083*38e8c45fSAndroid Build Coastguard Worker                 "    <hal format=\"hidl\">\n"
1084*38e8c45fSAndroid Build Coastguard Worker                 "        <name>a.h.bar2</name>\n"
1085*38e8c45fSAndroid Build Coastguard Worker                 "        <transport arch=\"32+64\">passthrough</transport>\n"
1086*38e8c45fSAndroid Build Coastguard Worker                 "        <fqname>@2.0::IBar/2</fqname>\n"
1087*38e8c45fSAndroid Build Coastguard Worker                 "    </hal>\n"
1088*38e8c45fSAndroid Build Coastguard Worker                 "</manifest>";
1089*38e8c45fSAndroid Build Coastguard Worker         auto manifest = std::make_shared<HalManifest>();
1090*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(fromXml(manifest.get(), mockManifestXml));
1091*38e8c45fSAndroid Build Coastguard Worker         EXPECT_CALL(*mockList, getDeviceManifest())
1092*38e8c45fSAndroid Build Coastguard Worker             .Times(AnyNumber())
1093*38e8c45fSAndroid Build Coastguard Worker             .WillRepeatedly(Return(manifest));
1094*38e8c45fSAndroid Build Coastguard Worker     }
1095*38e8c45fSAndroid Build Coastguard Worker };
1096*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListVintfTest,ManifestHals)1097*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListVintfTest, ManifestHals) {
1098*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
1099*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-iStr", "--types=v", "--neat"})));
1100*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr("[email protected]::IBar/1 declared hwbinder    ?"));
1101*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr("[email protected]::IBar/2 declared passthrough 32+64"));
1102*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr("[email protected]::IFoo/1 declared hwbinder    ?"));
1103*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
1104*38e8c45fSAndroid Build Coastguard Worker }
1105*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListVintfTest,Lazy)1106*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListVintfTest, Lazy) {
1107*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
1108*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-iStr", "--types=z", "--neat"})));
1109*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr("[email protected]::IBar/1 declared hwbinder    ?"));
1110*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), HasSubstr("[email protected]::IBar/2 declared passthrough 32+64"));
1111*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
1112*38e8c45fSAndroid Build Coastguard Worker }
1113*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(ListVintfTest,NoLazy)1114*38e8c45fSAndroid Build Coastguard Worker TEST_F(ListVintfTest, NoLazy) {
1115*38e8c45fSAndroid Build Coastguard Worker     optind = 1; // mimic Lshal::parseArg()
1116*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(0u, mockList->main(createArg({"lshal", "-iStr", "--types=b,c,l", "--neat"})));
1117*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(out.str(), Not(HasSubstr("IBar")));
1118*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", err.str());
1119*38e8c45fSAndroid Build Coastguard Worker }
1120*38e8c45fSAndroid Build Coastguard Worker 
1121*38e8c45fSAndroid Build Coastguard Worker class HelpTest : public ::testing::Test {
1122*38e8c45fSAndroid Build Coastguard Worker public:
SetUp()1123*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override {
1124*38e8c45fSAndroid Build Coastguard Worker         lshal = std::make_unique<Lshal>(out, err, new MockServiceManager() /* serviceManager */,
1125*38e8c45fSAndroid Build Coastguard Worker                                         new MockServiceManager() /* passthruManager */);
1126*38e8c45fSAndroid Build Coastguard Worker     }
1127*38e8c45fSAndroid Build Coastguard Worker 
1128*38e8c45fSAndroid Build Coastguard Worker     std::stringstream err;
1129*38e8c45fSAndroid Build Coastguard Worker     std::stringstream out;
1130*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<Lshal> lshal;
1131*38e8c45fSAndroid Build Coastguard Worker };
1132*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(HelpTest,GlobalUsage)1133*38e8c45fSAndroid Build Coastguard Worker TEST_F(HelpTest, GlobalUsage) {
1134*38e8c45fSAndroid Build Coastguard Worker     (void)callMain(lshal, {"lshal", "--help"}); // ignore return
1135*38e8c45fSAndroid Build Coastguard Worker     std::string errStr = err.str();
1136*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(errStr, ContainsRegex("(^|\n)commands:($|\n)"))
1137*38e8c45fSAndroid Build Coastguard Worker         << "`lshal --help` does not contain global usage";
1138*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(errStr, ContainsRegex("(^|\n)list:($|\n)"))
1139*38e8c45fSAndroid Build Coastguard Worker         << "`lshal --help` does not contain usage for 'list' command";
1140*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(errStr, ContainsRegex("(^|\n)debug:($|\n)"))
1141*38e8c45fSAndroid Build Coastguard Worker         << "`lshal --help` does not contain usage for 'debug' command";
1142*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(errStr, ContainsRegex("(^|\n)help:($|\n)"))
1143*38e8c45fSAndroid Build Coastguard Worker         << "`lshal --help` does not contain usage for 'help' command";
1144*38e8c45fSAndroid Build Coastguard Worker 
1145*38e8c45fSAndroid Build Coastguard Worker     err.str("");
1146*38e8c45fSAndroid Build Coastguard Worker     (void)callMain(lshal, {"lshal", "help"}); // ignore return
1147*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(errStr, err.str()) << "`lshal help` should have the same output as `lshal --help`";
1148*38e8c45fSAndroid Build Coastguard Worker 
1149*38e8c45fSAndroid Build Coastguard Worker     err.str("");
1150*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, callMain(lshal, {"lshal", "--unknown-option"}));
1151*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("unrecognized option"));
1152*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), EndsWith(errStr))
1153*38e8c45fSAndroid Build Coastguard Worker             << "`lshal --unknown-option` should have the same output as `lshal --help`";
1154*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", out.str());
1155*38e8c45fSAndroid Build Coastguard Worker }
1156*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(HelpTest,UnknownOptionList1)1157*38e8c45fSAndroid Build Coastguard Worker TEST_F(HelpTest, UnknownOptionList1) {
1158*38e8c45fSAndroid Build Coastguard Worker     (void)callMain(lshal, {"lshal", "help", "list"});
1159*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("(^|\n)list:($|\n)"))
1160*38e8c45fSAndroid Build Coastguard Worker         << "`lshal help list` does not contain usage for 'list' command";
1161*38e8c45fSAndroid Build Coastguard Worker }
1162*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(HelpTest,UnknownOptionList2)1163*38e8c45fSAndroid Build Coastguard Worker TEST_F(HelpTest, UnknownOptionList2) {
1164*38e8c45fSAndroid Build Coastguard Worker     EXPECT_NE(0u, callMain(lshal, {"lshal", "list", "--unknown-option"}));
1165*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("unrecognized option"));
1166*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("(^|\n)list:($|\n)"))
1167*38e8c45fSAndroid Build Coastguard Worker         << "`lshal list --unknown-option` does not contain usage for 'list' command";
1168*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", out.str());
1169*38e8c45fSAndroid Build Coastguard Worker }
1170*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(HelpTest,UnknownOptionHelp1)1171*38e8c45fSAndroid Build Coastguard Worker TEST_F(HelpTest, UnknownOptionHelp1) {
1172*38e8c45fSAndroid Build Coastguard Worker     (void)callMain(lshal, {"lshal", "help", "help"});
1173*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("(^|\n)help:($|\n)"))
1174*38e8c45fSAndroid Build Coastguard Worker         << "`lshal help help` does not contain usage for 'help' command";
1175*38e8c45fSAndroid Build Coastguard Worker }
1176*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(HelpTest,UnknownOptionHelp2)1177*38e8c45fSAndroid Build Coastguard Worker TEST_F(HelpTest, UnknownOptionHelp2) {
1178*38e8c45fSAndroid Build Coastguard Worker     (void)callMain(lshal, {"lshal", "help", "--unknown-option"});
1179*38e8c45fSAndroid Build Coastguard Worker     EXPECT_THAT(err.str(), ContainsRegex("(^|\n)help:($|\n)"))
1180*38e8c45fSAndroid Build Coastguard Worker         << "`lshal help --unknown-option` does not contain usage for 'help' command";
1181*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ("", out.str());
1182*38e8c45fSAndroid Build Coastguard Worker }
1183*38e8c45fSAndroid Build Coastguard Worker 
1184*38e8c45fSAndroid Build Coastguard Worker } // namespace lshal
1185*38e8c45fSAndroid Build Coastguard Worker } // namespace android
1186*38e8c45fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)1187*38e8c45fSAndroid Build Coastguard Worker int main(int argc, char **argv) {
1188*38e8c45fSAndroid Build Coastguard Worker     ::testing::InitGoogleMock(&argc, argv);
1189*38e8c45fSAndroid Build Coastguard Worker     // Use _exit() to force terminate background threads in Timeout.h
1190*38e8c45fSAndroid Build Coastguard Worker     _exit(RUN_ALL_TESTS());
1191*38e8c45fSAndroid Build Coastguard Worker }
1192