• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "binderRpcTest"
18 
19 #include <android-base/stringprintf.h>
20 #include <binder/RpcTransportTipcTrusty.h>
21 #include <trusty-gtest.h>
22 #include <trusty_ipc.h>
23 
24 #include "binderRpcTestFixture.h"
25 
26 namespace android {
27 
28 // Destructors need to be defined, even if pure virtual
~ProcessSession()29 ProcessSession::~ProcessSession() {}
30 
31 class TrustyProcessSession : public ProcessSession {
32 public:
~TrustyProcessSession()33     ~TrustyProcessSession() override {}
34 
setCustomExitStatusCheck(std::function<void (int wstatus)>)35     void setCustomExitStatusCheck(std::function<void(int wstatus)> /*f*/) override {
36         LOG_ALWAYS_FATAL("setCustomExitStatusCheck() not supported");
37     }
38 
terminate()39     void terminate() override { LOG_ALWAYS_FATAL("terminate() not supported"); }
40 };
41 
newFactory(RpcSecurity rpcSecurity)42 std::unique_ptr<RpcTransportCtxFactory> BinderRpc::newFactory(RpcSecurity rpcSecurity) {
43     switch (rpcSecurity) {
44         case RpcSecurity::RAW:
45             return RpcTransportCtxFactoryTipcTrusty::make();
46         default:
47             LOG_ALWAYS_FATAL("Unknown RpcSecurity %d", rpcSecurity);
48     }
49 }
50 
51 // This creates a new process serving an interface on a certain number of
52 // threads.
createRpcTestSocketServerProcessEtc(const BinderRpcOptions & options)53 std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc(
54         const BinderRpcOptions& options) {
55     LOG_ALWAYS_FATAL_IF(std::any_of(options.numIncomingConnectionsBySession.begin(),
56                                     options.numIncomingConnectionsBySession.end(),
57                                     [](size_t n) { return n != 0; }),
58                         "Non-zero incoming connections on Trusty");
59 
60     RpcSecurity rpcSecurity = std::get<1>(GetParam());
61     uint32_t clientVersion = std::get<2>(GetParam());
62     uint32_t serverVersion = std::get<3>(GetParam());
63 
64     auto ret = std::make_unique<TrustyProcessSession>();
65 
66     status_t status;
67     for (size_t i = 0; i < options.numSessions; i++) {
68         auto session = android::RpcSession::make(newFactory(rpcSecurity));
69 
70         EXPECT_TRUE(session->setProtocolVersion(clientVersion));
71         session->setMaxOutgoingConnections(options.numOutgoingConnections);
72         session->setFileDescriptorTransportMode(options.clientFileDescriptorTransportMode);
73 
74         status = session->setupPreconnectedClient({}, [&]() {
75             auto port = trustyIpcPort(serverVersion);
76             int rc = connect(port.c_str(), IPC_CONNECT_WAIT_FOR_PORT);
77             LOG_ALWAYS_FATAL_IF(rc < 0, "Failed to connect to service: %d", rc);
78             return base::unique_fd(rc);
79         });
80         if (options.allowConnectFailure && status != OK) {
81             ret->sessions.clear();
82             break;
83         }
84         LOG_ALWAYS_FATAL_IF(status != OK, "Failed to connect to service: %s",
85                             statusToString(status).c_str());
86         ret->sessions.push_back({session, session->getRootObject()});
87     }
88 
89     return ret;
90 }
91 
92 INSTANTIATE_TEST_CASE_P(Trusty, BinderRpc,
93                         ::testing::Combine(::testing::Values(SocketType::TIPC),
94                                            ::testing::Values(RpcSecurity::RAW),
95                                            ::testing::ValuesIn(testVersions()),
96                                            ::testing::ValuesIn(testVersions()),
97                                            ::testing::Values(false), ::testing::Values(true)),
98                         BinderRpc::PrintParamInfo);
99 
100 } // namespace android
101 
102 PORT_GTEST(BinderRpcTest, "com.android.trusty.binderRpcTest");
103