xref: /aosp_15_r20/system/secretkeeper/comm/tests/wire.rs (revision 3f8e9d82f4020c68ad19a99fc5fdc1fc90b79379)
1*3f8e9d82SAndroid Build Coastguard Worker /*
2*3f8e9d82SAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*3f8e9d82SAndroid Build Coastguard Worker  *
4*3f8e9d82SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*3f8e9d82SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*3f8e9d82SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*3f8e9d82SAndroid Build Coastguard Worker  *
8*3f8e9d82SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*3f8e9d82SAndroid Build Coastguard Worker  *
10*3f8e9d82SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*3f8e9d82SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*3f8e9d82SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*3f8e9d82SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*3f8e9d82SAndroid Build Coastguard Worker  * limitations under the License.
15*3f8e9d82SAndroid Build Coastguard Worker  */
16*3f8e9d82SAndroid Build Coastguard Worker 
17*3f8e9d82SAndroid Build Coastguard Worker //! Unit tests for testing serialization and deserialization of internal types.
18*3f8e9d82SAndroid Build Coastguard Worker 
19*3f8e9d82SAndroid Build Coastguard Worker use ciborium::value::Value;
20*3f8e9d82SAndroid Build Coastguard Worker use coset::{AsCborValue, CborSerializable};
21*3f8e9d82SAndroid Build Coastguard Worker use rdroidtest::rdroidtest;
22*3f8e9d82SAndroid Build Coastguard Worker use secretkeeper_comm::wire::{
23*3f8e9d82SAndroid Build Coastguard Worker     AidlErrorCode, ApiError, OpCode, PerformOpReq, PerformOpResponse, PerformOpSuccessRsp,
24*3f8e9d82SAndroid Build Coastguard Worker };
25*3f8e9d82SAndroid Build Coastguard Worker 
26*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_req_roundtrip()27*3f8e9d82SAndroid Build Coastguard Worker fn wire_req_roundtrip() {
28*3f8e9d82SAndroid Build Coastguard Worker     let tests = [
29*3f8e9d82SAndroid Build Coastguard Worker         PerformOpReq::SecretManagement(vec![]),
30*3f8e9d82SAndroid Build Coastguard Worker         PerformOpReq::SecretManagement(vec![1, 2, 3]),
31*3f8e9d82SAndroid Build Coastguard Worker         PerformOpReq::DeleteIds(vec![]),
32*3f8e9d82SAndroid Build Coastguard Worker         PerformOpReq::DeleteIds(vec![[1; 64], [2; 64]]),
33*3f8e9d82SAndroid Build Coastguard Worker         PerformOpReq::DeleteAll,
34*3f8e9d82SAndroid Build Coastguard Worker     ];
35*3f8e9d82SAndroid Build Coastguard Worker 
36*3f8e9d82SAndroid Build Coastguard Worker     for input in tests {
37*3f8e9d82SAndroid Build Coastguard Worker         let data = input.clone().to_vec().unwrap();
38*3f8e9d82SAndroid Build Coastguard Worker         let recovered = PerformOpReq::from_slice(&data).unwrap();
39*3f8e9d82SAndroid Build Coastguard Worker         assert_eq!(input, recovered);
40*3f8e9d82SAndroid Build Coastguard Worker     }
41*3f8e9d82SAndroid Build Coastguard Worker }
42*3f8e9d82SAndroid Build Coastguard Worker 
43*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_rsp_roundtrip()44*3f8e9d82SAndroid Build Coastguard Worker fn wire_rsp_roundtrip() {
45*3f8e9d82SAndroid Build Coastguard Worker     let tests = [
46*3f8e9d82SAndroid Build Coastguard Worker         PerformOpResponse::Success(PerformOpSuccessRsp::ProtectedResponse(vec![])),
47*3f8e9d82SAndroid Build Coastguard Worker         PerformOpResponse::Success(PerformOpSuccessRsp::ProtectedResponse(vec![1, 2, 3])),
48*3f8e9d82SAndroid Build Coastguard Worker         PerformOpResponse::Success(PerformOpSuccessRsp::Empty),
49*3f8e9d82SAndroid Build Coastguard Worker         PerformOpResponse::Failure(ApiError {
50*3f8e9d82SAndroid Build Coastguard Worker             err_code: AidlErrorCode::InternalError,
51*3f8e9d82SAndroid Build Coastguard Worker             msg: "msg".to_string(),
52*3f8e9d82SAndroid Build Coastguard Worker         }),
53*3f8e9d82SAndroid Build Coastguard Worker     ];
54*3f8e9d82SAndroid Build Coastguard Worker 
55*3f8e9d82SAndroid Build Coastguard Worker     for input in tests {
56*3f8e9d82SAndroid Build Coastguard Worker         let data = input.clone().to_vec().unwrap();
57*3f8e9d82SAndroid Build Coastguard Worker         let recovered = PerformOpResponse::from_slice(&data).unwrap();
58*3f8e9d82SAndroid Build Coastguard Worker         assert_eq!(input, recovered);
59*3f8e9d82SAndroid Build Coastguard Worker     }
60*3f8e9d82SAndroid Build Coastguard Worker }
61*3f8e9d82SAndroid Build Coastguard Worker 
62*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_req_deserialize_fail()63*3f8e9d82SAndroid Build Coastguard Worker fn wire_req_deserialize_fail() {
64*3f8e9d82SAndroid Build Coastguard Worker     let bogus_data = [0x99, 0x99];
65*3f8e9d82SAndroid Build Coastguard Worker     let result = PerformOpReq::from_slice(&bogus_data);
66*3f8e9d82SAndroid Build Coastguard Worker     assert!(result.is_err());
67*3f8e9d82SAndroid Build Coastguard Worker }
68*3f8e9d82SAndroid Build Coastguard Worker 
69*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_rsp_deserialize_fail()70*3f8e9d82SAndroid Build Coastguard Worker fn wire_rsp_deserialize_fail() {
71*3f8e9d82SAndroid Build Coastguard Worker     let bogus_data = [0x99, 0x99];
72*3f8e9d82SAndroid Build Coastguard Worker     let result = PerformOpReq::from_slice(&bogus_data);
73*3f8e9d82SAndroid Build Coastguard Worker     assert!(result.is_err());
74*3f8e9d82SAndroid Build Coastguard Worker }
75*3f8e9d82SAndroid Build Coastguard Worker 
76*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_opcode_out_of_range()77*3f8e9d82SAndroid Build Coastguard Worker fn wire_opcode_out_of_range() {
78*3f8e9d82SAndroid Build Coastguard Worker     let bignum = Value::Integer(999.into());
79*3f8e9d82SAndroid Build Coastguard Worker     let result = OpCode::from_cbor_value(bignum);
80*3f8e9d82SAndroid Build Coastguard Worker     assert!(result.is_err());
81*3f8e9d82SAndroid Build Coastguard Worker }
82*3f8e9d82SAndroid Build Coastguard Worker 
83*3f8e9d82SAndroid Build Coastguard Worker #[rdroidtest]
wire_rsp_errcode_out_of_range()84*3f8e9d82SAndroid Build Coastguard Worker fn wire_rsp_errcode_out_of_range() {
85*3f8e9d82SAndroid Build Coastguard Worker     let bogus_data = [
86*3f8e9d82SAndroid Build Coastguard Worker         0x82, // 2-arr
87*3f8e9d82SAndroid Build Coastguard Worker         0x19, 0x03, 0xe7, // int, value 999
88*3f8e9d82SAndroid Build Coastguard Worker         0x60, // 0-tstr
89*3f8e9d82SAndroid Build Coastguard Worker     ];
90*3f8e9d82SAndroid Build Coastguard Worker     // Invalid error codes get mapped to `InternalError`.
91*3f8e9d82SAndroid Build Coastguard Worker     let result = PerformOpResponse::from_slice(&bogus_data).unwrap();
92*3f8e9d82SAndroid Build Coastguard Worker     assert_eq!(
93*3f8e9d82SAndroid Build Coastguard Worker         result,
94*3f8e9d82SAndroid Build Coastguard Worker         PerformOpResponse::Failure(ApiError {
95*3f8e9d82SAndroid Build Coastguard Worker             err_code: AidlErrorCode::InternalError,
96*3f8e9d82SAndroid Build Coastguard Worker             msg: "".to_string(),
97*3f8e9d82SAndroid Build Coastguard Worker         })
98*3f8e9d82SAndroid Build Coastguard Worker     );
99*3f8e9d82SAndroid Build Coastguard Worker }
100