diff options
author | Andrei Homescu <ahomescu@google.com> | 2023-08-09 05:23:49 +0000 |
---|---|---|
committer | Steven Ray <stevenray@google.com> | 2024-04-10 16:50:57 -0700 |
commit | dfa78e45380f5163be3dd74769562eaaf7977c2d (patch) | |
tree | ccdae37cd34c555b62050fec59cbadf99cad05ec | |
parent | ab2daeca28b23a164a8bb5100e3e39a4092a7689 (diff) | |
download | native-dfa78e45380f5163be3dd74769562eaaf7977c2d.tar.gz |
libbinder_rs: Add Rust binderRpcTestService on Trusty
Add a minimal subset of binderRpcTestService for Trusty Rust testing.
Bug: 242243245
Test: com.android.trusty.rust.binder_rpc_test.test
Change-Id: Id32503b8895f7c8aadc3a244a6b5a210e559da11
-rw-r--r-- | libs/binder/trusty/rust/binder_rpc_test/main.rs | 13 | ||||
-rw-r--r-- | libs/binder/trusty/rust/binder_rpc_test/service/main.rs | 159 | ||||
-rw-r--r-- | libs/binder/trusty/rust/binder_rpc_test/service/manifest.json | 10 | ||||
-rw-r--r-- | libs/binder/trusty/rust/binder_rpc_test/service/rules.mk | 33 | ||||
-rw-r--r-- | libs/binder/trusty/usertests-inc.mk | 1 |
5 files changed, 213 insertions, 3 deletions
diff --git a/libs/binder/trusty/rust/binder_rpc_test/main.rs b/libs/binder/trusty/rust/binder_rpc_test/main.rs index a71ce2c26e..3c1e784418 100644 --- a/libs/binder/trusty/rust/binder_rpc_test/main.rs +++ b/libs/binder/trusty/rust/binder_rpc_test/main.rs @@ -23,14 +23,21 @@ use trusty_std::ffi::{CString, FallibleCString}; test::init!(); const SERVICE_PORT: &str = "com.android.trusty.binderRpcTestService.V1"; +const RUST_SERVICE_PORT: &str = "com.android.trusty.rust.binderRpcTestService.V1"; -fn get_service() -> Strong<dyn IBinderRpcTest> { - let port = CString::try_new(SERVICE_PORT).expect("Failed to allocate port name"); +fn get_service(port: &str) -> Strong<dyn IBinderRpcTest> { + let port = CString::try_new(port).expect("Failed to allocate port name"); RpcSession::new().setup_trusty_client(port.as_c_str()).expect("Failed to create session") } #[test] fn ping() { - let srv = get_service(); + let srv = get_service(SERVICE_PORT); + assert_eq!(srv.as_binder().ping_binder(), Ok(())); +} + +#[test] +fn ping_rust() { + let srv = get_service(RUST_SERVICE_PORT); assert_eq!(srv.as_binder().ping_binder(), Ok(())); } diff --git a/libs/binder/trusty/rust/binder_rpc_test/service/main.rs b/libs/binder/trusty/rust/binder_rpc_test/service/main.rs new file mode 100644 index 0000000000..b9a86bf240 --- /dev/null +++ b/libs/binder/trusty/rust/binder_rpc_test/service/main.rs @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use binder::{BinderFeatures, Interface, ParcelFileDescriptor, SpIBinder, Status, Strong}; +use binder_rpc_test_aidl::aidl::IBinderRpcCallback::IBinderRpcCallback; +use binder_rpc_test_aidl::aidl::IBinderRpcSession::IBinderRpcSession; +use binder_rpc_test_aidl::aidl::IBinderRpcTest::{BnBinderRpcTest, IBinderRpcTest}; +use rpcbinder::RpcServer; +use std::rc::Rc; +use tipc::{service_dispatcher, wrap_service, Manager, PortCfg}; + +const RUST_SERVICE_PORT: &str = "com.android.trusty.rust.binderRpcTestService.V1"; + +#[derive(Debug, Default)] +struct TestService; + +impl Interface for TestService {} + +impl IBinderRpcTest for TestService { + fn sendString(&self, _: &str) -> Result<(), Status> { + todo!() + } + fn doubleString(&self, _: &str) -> Result<String, Status> { + todo!() + } + fn getClientPort(&self) -> Result<i32, Status> { + todo!() + } + fn countBinders(&self) -> Result<Vec<i32>, Status> { + todo!() + } + fn getNullBinder(&self) -> Result<SpIBinder, Status> { + todo!() + } + fn pingMe(&self, _: &SpIBinder) -> Result<i32, Status> { + todo!() + } + fn repeatBinder(&self, _: Option<&SpIBinder>) -> Result<Option<SpIBinder>, Status> { + todo!() + } + fn holdBinder(&self, _: Option<&SpIBinder>) -> Result<(), Status> { + todo!() + } + fn getHeldBinder(&self) -> Result<Option<SpIBinder>, Status> { + todo!() + } + fn nestMe(&self, _: &Strong<(dyn IBinderRpcTest + 'static)>, _: i32) -> Result<(), Status> { + todo!() + } + fn alwaysGiveMeTheSameBinder(&self) -> Result<SpIBinder, Status> { + todo!() + } + fn openSession(&self, _: &str) -> Result<Strong<(dyn IBinderRpcSession + 'static)>, Status> { + todo!() + } + fn getNumOpenSessions(&self) -> Result<i32, Status> { + todo!() + } + fn lock(&self) -> Result<(), Status> { + todo!() + } + fn unlockInMsAsync(&self, _: i32) -> Result<(), Status> { + todo!() + } + fn lockUnlock(&self) -> Result<(), Status> { + todo!() + } + fn sleepMs(&self, _: i32) -> Result<(), Status> { + todo!() + } + fn sleepMsAsync(&self, _: i32) -> Result<(), Status> { + todo!() + } + fn doCallback( + &self, + _: &Strong<(dyn IBinderRpcCallback + 'static)>, + _: bool, + _: bool, + _: &str, + ) -> Result<(), Status> { + todo!() + } + fn doCallbackAsync( + &self, + _: &Strong<(dyn IBinderRpcCallback + 'static)>, + _: bool, + _: bool, + _: &str, + ) -> Result<(), Status> { + todo!() + } + fn die(&self, _: bool) -> Result<(), Status> { + todo!() + } + fn scheduleShutdown(&self) -> Result<(), Status> { + todo!() + } + fn useKernelBinderCallingId(&self) -> Result<(), Status> { + todo!() + } + fn echoAsFile(&self, _: &str) -> Result<ParcelFileDescriptor, Status> { + todo!() + } + fn concatFiles(&self, _: &[ParcelFileDescriptor]) -> Result<ParcelFileDescriptor, Status> { + todo!() + } + fn blockingSendFdOneway(&self, _: &ParcelFileDescriptor) -> Result<(), Status> { + todo!() + } + fn blockingRecvFd(&self) -> Result<ParcelFileDescriptor, Status> { + todo!() + } + fn blockingSendIntOneway(&self, _: i32) -> Result<(), Status> { + todo!() + } + fn blockingRecvInt(&self) -> Result<i32, Status> { + todo!() + } +} + +wrap_service!(TestRpcServer(RpcServer: UnbufferedService)); + +service_dispatcher! { + enum TestDispatcher { + TestRpcServer, + } +} + +fn main() { + let mut dispatcher = TestDispatcher::<1>::new().expect("Could not create test dispatcher"); + + let service = BnBinderRpcTest::new_binder(TestService::default(), BinderFeatures::default()); + let rpc_server = + TestRpcServer::new(RpcServer::new_per_session(move |_uuid| Some(service.as_binder()))); + + let cfg = PortCfg::new(RUST_SERVICE_PORT) + .expect("Could not create port config") + .allow_ta_connect() + .allow_ns_connect(); + dispatcher.add_service(Rc::new(rpc_server), cfg).expect("Could not add service to dispatcher"); + + Manager::<_, _, 1, 4>::new_with_dispatcher(dispatcher, []) + .expect("Could not create service manager") + .run_event_loop() + .expect("Test event loop failed"); +} diff --git a/libs/binder/trusty/rust/binder_rpc_test/service/manifest.json b/libs/binder/trusty/rust/binder_rpc_test/service/manifest.json new file mode 100644 index 0000000000..121ba112a8 --- /dev/null +++ b/libs/binder/trusty/rust/binder_rpc_test/service/manifest.json @@ -0,0 +1,10 @@ +{ + "uuid": "4741fc65-8b65-4893-ba55-b182c003c8b7", + "app_name": "rust_binder_rpc_test_service", + "min_heap": 16384, + "min_stack": 16384, + "mgmt_flags": { + "non_critical_app": true, + "restart_on_exit": true + } +} diff --git a/libs/binder/trusty/rust/binder_rpc_test/service/rules.mk b/libs/binder/trusty/rust/binder_rpc_test/service/rules.mk new file mode 100644 index 0000000000..1ddc382197 --- /dev/null +++ b/libs/binder/trusty/rust/binder_rpc_test/service/rules.mk @@ -0,0 +1,33 @@ +# Copyright (C) 2023 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +LOCAL_DIR := $(GET_LOCAL_DIR) +LIBBINDER_DIR := $(LOCAL_DIR)/../../../.. + +MODULE := $(LOCAL_DIR) + +MODULE_SRCS := $(LOCAL_DIR)/main.rs + +MODULE_CRATE_NAME := binder_rpc_test_service + +MODULE_LIBRARY_DEPS += \ + $(LIBBINDER_DIR)/trusty/rust \ + $(LIBBINDER_DIR)/trusty/rust/rpcbinder \ + $(LOCAL_DIR)/../aidl \ + trusty/user/base/lib/tipc/rust \ + +MANIFEST := $(LOCAL_DIR)/manifest.json + +include make/trusted_app.mk diff --git a/libs/binder/trusty/usertests-inc.mk b/libs/binder/trusty/usertests-inc.mk index 241e6683e7..833d209012 100644 --- a/libs/binder/trusty/usertests-inc.mk +++ b/libs/binder/trusty/usertests-inc.mk @@ -16,6 +16,7 @@ TRUSTY_USER_TESTS += \ frameworks/native/libs/binder/trusty/binderRpcTest \ frameworks/native/libs/binder/trusty/binderRpcTest/service \ + frameworks/native/libs/binder/trusty/rust/binder_rpc_test/service \ TRUSTY_RUST_USER_TESTS += \ frameworks/native/libs/binder/trusty/rust/binder_rpc_test \ |