Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0ddb45ba authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "libbinder_rs: Add Rust binderRpcTestService on Trusty" into main am: 5da9a27d

parents bdc26fab 5da9a27d
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -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(()));
}
+159 −0
Original line number Diff line number Diff line
/*
 * 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");
}
+10 −0
Original line number Diff line number Diff line
{
    "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
    }
}
+33 −0
Original line number Diff line number Diff line
# 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
+1 −0
Original line number Diff line number Diff line
@@ -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 \