1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2022 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 #define LOG_TAG "binderRpcTest"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcTransportTipcTrusty.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <trusty-gtest.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <trusty_ipc.h>
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker #include "binderRpcTestFixture.h"
24*38e8c45fSAndroid Build Coastguard Worker
25*38e8c45fSAndroid Build Coastguard Worker using android::binder::unique_fd;
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker namespace android {
28*38e8c45fSAndroid Build Coastguard Worker
29*38e8c45fSAndroid Build Coastguard Worker // Destructors need to be defined, even if pure virtual
~ProcessSession()30*38e8c45fSAndroid Build Coastguard Worker ProcessSession::~ProcessSession() {}
31*38e8c45fSAndroid Build Coastguard Worker
32*38e8c45fSAndroid Build Coastguard Worker class TrustyProcessSession : public ProcessSession {
33*38e8c45fSAndroid Build Coastguard Worker public:
~TrustyProcessSession()34*38e8c45fSAndroid Build Coastguard Worker ~TrustyProcessSession() override {}
35*38e8c45fSAndroid Build Coastguard Worker
setCustomExitStatusCheck(std::function<void (int wstatus)>)36*38e8c45fSAndroid Build Coastguard Worker void setCustomExitStatusCheck(std::function<void(int wstatus)> /*f*/) override {
37*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("setCustomExitStatusCheck() not supported");
38*38e8c45fSAndroid Build Coastguard Worker }
39*38e8c45fSAndroid Build Coastguard Worker
terminate()40*38e8c45fSAndroid Build Coastguard Worker void terminate() override { LOG_ALWAYS_FATAL("terminate() not supported"); }
41*38e8c45fSAndroid Build Coastguard Worker };
42*38e8c45fSAndroid Build Coastguard Worker
newFactory(RpcSecurity rpcSecurity)43*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<RpcTransportCtxFactory> BinderRpc::newFactory(RpcSecurity rpcSecurity) {
44*38e8c45fSAndroid Build Coastguard Worker switch (rpcSecurity) {
45*38e8c45fSAndroid Build Coastguard Worker case RpcSecurity::RAW:
46*38e8c45fSAndroid Build Coastguard Worker return RpcTransportCtxFactoryTipcTrusty::make();
47*38e8c45fSAndroid Build Coastguard Worker default:
48*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("Unknown RpcSecurity %d", static_cast<int>(rpcSecurity));
49*38e8c45fSAndroid Build Coastguard Worker }
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker
52*38e8c45fSAndroid Build Coastguard Worker // This creates a new process serving an interface on a certain number of
53*38e8c45fSAndroid Build Coastguard Worker // threads.
createRpcTestSocketServerProcessEtc(const BinderRpcOptions & options)54*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc(
55*38e8c45fSAndroid Build Coastguard Worker const BinderRpcOptions& options) {
56*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(std::any_of(options.numIncomingConnectionsBySession.begin(),
57*38e8c45fSAndroid Build Coastguard Worker options.numIncomingConnectionsBySession.end(),
58*38e8c45fSAndroid Build Coastguard Worker [](size_t n) { return n != 0; }),
59*38e8c45fSAndroid Build Coastguard Worker "Non-zero incoming connections on Trusty");
60*38e8c45fSAndroid Build Coastguard Worker
61*38e8c45fSAndroid Build Coastguard Worker RpcSecurity rpcSecurity = GetParam().security;
62*38e8c45fSAndroid Build Coastguard Worker uint32_t clientVersion = GetParam().clientVersion;
63*38e8c45fSAndroid Build Coastguard Worker uint32_t serverVersion = GetParam().serverVersion;
64*38e8c45fSAndroid Build Coastguard Worker
65*38e8c45fSAndroid Build Coastguard Worker auto ret = std::make_unique<TrustyProcessSession>();
66*38e8c45fSAndroid Build Coastguard Worker
67*38e8c45fSAndroid Build Coastguard Worker status_t status;
68*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < options.numSessions; i++) {
69*38e8c45fSAndroid Build Coastguard Worker auto session = android::RpcSession::make(newFactory(rpcSecurity));
70*38e8c45fSAndroid Build Coastguard Worker
71*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(session->setProtocolVersion(clientVersion));
72*38e8c45fSAndroid Build Coastguard Worker session->setMaxOutgoingConnections(options.numOutgoingConnections);
73*38e8c45fSAndroid Build Coastguard Worker session->setFileDescriptorTransportMode(options.clientFileDescriptorTransportMode);
74*38e8c45fSAndroid Build Coastguard Worker
75*38e8c45fSAndroid Build Coastguard Worker status = session->setupPreconnectedClient({}, [&]() {
76*38e8c45fSAndroid Build Coastguard Worker auto port = trustyIpcPort(serverVersion);
77*38e8c45fSAndroid Build Coastguard Worker int rc = connect(port.c_str(), IPC_CONNECT_WAIT_FOR_PORT);
78*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(rc < 0, "Failed to connect to service: %d", rc);
79*38e8c45fSAndroid Build Coastguard Worker return unique_fd(rc);
80*38e8c45fSAndroid Build Coastguard Worker });
81*38e8c45fSAndroid Build Coastguard Worker if (options.allowConnectFailure && status != OK) {
82*38e8c45fSAndroid Build Coastguard Worker ret->sessions.clear();
83*38e8c45fSAndroid Build Coastguard Worker break;
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(status != OK, "Failed to connect to service: %s",
86*38e8c45fSAndroid Build Coastguard Worker statusToString(status).c_str());
87*38e8c45fSAndroid Build Coastguard Worker ret->sessions.push_back({session, session->getRootObject()});
88*38e8c45fSAndroid Build Coastguard Worker }
89*38e8c45fSAndroid Build Coastguard Worker
90*38e8c45fSAndroid Build Coastguard Worker return ret;
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker
getTrustyBinderRpcParams()93*38e8c45fSAndroid Build Coastguard Worker static std::vector<BinderRpc::ParamType> getTrustyBinderRpcParams() {
94*38e8c45fSAndroid Build Coastguard Worker std::vector<BinderRpc::ParamType> ret;
95*38e8c45fSAndroid Build Coastguard Worker
96*38e8c45fSAndroid Build Coastguard Worker for (const auto& clientVersion : testVersions()) {
97*38e8c45fSAndroid Build Coastguard Worker for (const auto& serverVersion : testVersions()) {
98*38e8c45fSAndroid Build Coastguard Worker ret.push_back(BinderRpc::ParamType{
99*38e8c45fSAndroid Build Coastguard Worker .type = SocketType::TIPC,
100*38e8c45fSAndroid Build Coastguard Worker .security = RpcSecurity::RAW,
101*38e8c45fSAndroid Build Coastguard Worker .clientVersion = clientVersion,
102*38e8c45fSAndroid Build Coastguard Worker .serverVersion = serverVersion,
103*38e8c45fSAndroid Build Coastguard Worker // TODO: should we test both versions here?
104*38e8c45fSAndroid Build Coastguard Worker .singleThreaded = false,
105*38e8c45fSAndroid Build Coastguard Worker .noKernel = true,
106*38e8c45fSAndroid Build Coastguard Worker });
107*38e8c45fSAndroid Build Coastguard Worker }
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker
110*38e8c45fSAndroid Build Coastguard Worker return ret;
111*38e8c45fSAndroid Build Coastguard Worker }
112*38e8c45fSAndroid Build Coastguard Worker
113*38e8c45fSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Trusty, BinderRpc, ::testing::ValuesIn(getTrustyBinderRpcParams()),
114*38e8c45fSAndroid Build Coastguard Worker BinderRpc::PrintParamInfo);
115*38e8c45fSAndroid Build Coastguard Worker
116*38e8c45fSAndroid Build Coastguard Worker } // namespace android
117*38e8c45fSAndroid Build Coastguard Worker
118*38e8c45fSAndroid Build Coastguard Worker PORT_GTEST(BinderRpcTest, "com.android.trusty.binderRpcTest");
119