18e920a95Sopenharmony_ci/* 28e920a95Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 38e920a95Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 48e920a95Sopenharmony_ci * you may not use this file except in compliance with the License. 58e920a95Sopenharmony_ci * You may obtain a copy of the License at 68e920a95Sopenharmony_ci * 78e920a95Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 88e920a95Sopenharmony_ci * 98e920a95Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 108e920a95Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 118e920a95Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128e920a95Sopenharmony_ci * See the License for the specific language governing permissions and 138e920a95Sopenharmony_ci * limitations under the License. 148e920a95Sopenharmony_ci */ 158e920a95Sopenharmony_ciextern crate key_enable; 168e920a95Sopenharmony_ciextern crate ylong_json; 178e920a95Sopenharmony_ci 188e920a95Sopenharmony_ciuse std::thread; 198e920a95Sopenharmony_ciuse ylong_json::JsonValue; 208e920a95Sopenharmony_ciuse key_enable::cert_chain_utils::PemCollection; 218e920a95Sopenharmony_ciuse key_enable::cert_path_utils::TrustCertPath; 228e920a95Sopenharmony_ciuse key_enable::profile_utils::{UDID, get_udid, validate_bundle_and_distribution_type}; 238e920a95Sopenharmony_ci 248e920a95Sopenharmony_ci 258e920a95Sopenharmony_ci// pem_cert_file 268e920a95Sopenharmony_ciconst VALID_PEM_CERT: &str = "/data/test/tmp/valid_pem_cert.json"; 278e920a95Sopenharmony_ciconst NON_EXISTEND_PEM_CERT: &str = "/data/test/tmp/non_existent_cert_path.json"; 288e920a95Sopenharmony_ciconst INVALID_STRUCTURE_PEM_CERT: &str = "/data/test/tmp/invalid_structure_cert_path.json"; 298e920a95Sopenharmony_ciconst EMPTY_PEM_CERT: &str = "/data/test/tmp/empty_pem_cert.json"; 308e920a95Sopenharmony_ci// cert_path_file 318e920a95Sopenharmony_ciconst VALID_CERT_PATH: &str = "/data/test/tmp/valid_cert_path.json"; 328e920a95Sopenharmony_ciconst NON_EXISTEND_CERT_PATH: &str = "/data/test/tmp/non_existent_cert_path.json"; 338e920a95Sopenharmony_ciconst INVALID_STRUCTURE_CERT_PATH: &str = "/data/test/tmp/invalid_structure_cert_path.json"; 348e920a95Sopenharmony_ciconst EMPTY_CERT_PATH: &str = "/data/test/tmp/empty_cert_path.json"; 358e920a95Sopenharmony_ci 368e920a95Sopenharmony_ciconst ALLOWED_ROOT_CERT_MEMBER_NAMES: &[&str] = &[ 378e920a95Sopenharmony_ci "C=CN, O=Huawei, OU=Huawei CBG, CN=Huawei CBG Root CA G2", 388e920a95Sopenharmony_ci "C=CN, O=OpenHarmony, OU=OpenHarmony Team, CN=OpenHarmony Application Root CA", 398e920a95Sopenharmony_ci "C=CN, O=Huawei, OU=Huawei CBG, CN=Huawei CBG Root CA G2 Test", 408e920a95Sopenharmony_ci]; 418e920a95Sopenharmony_ci 428e920a95Sopenharmony_ci#[test] 438e920a95Sopenharmony_cifn test_load_pem_cert_from_valid_json_file() { 448e920a95Sopenharmony_ci // test is_debuggable true 458e920a95Sopenharmony_ci let mut root_cert = PemCollection::new(); 468e920a95Sopenharmony_ci root_cert.load_pem_certs_from_json_file(VALID_PEM_CERT, ALLOWED_ROOT_CERT_MEMBER_NAMES); 478e920a95Sopenharmony_ci assert_eq!(root_cert.pem_data.len(), 3); 488e920a95Sopenharmony_ci} 498e920a95Sopenharmony_ci 508e920a95Sopenharmony_ci#[test] 518e920a95Sopenharmony_cifn test_invalid_pem_cert_file_path() { 528e920a95Sopenharmony_ci let mut root_cert = PemCollection::new(); 538e920a95Sopenharmony_ci root_cert.load_pem_certs_from_json_file(NON_EXISTEND_PEM_CERT, ALLOWED_ROOT_CERT_MEMBER_NAMES); 548e920a95Sopenharmony_ci assert!(root_cert.pem_data.is_empty()); 558e920a95Sopenharmony_ci} 568e920a95Sopenharmony_ci 578e920a95Sopenharmony_ci#[test] 588e920a95Sopenharmony_cifn test_invalid_pem_cert_json_structure() { 598e920a95Sopenharmony_ci let mut root_cert = PemCollection::new(); 608e920a95Sopenharmony_ci root_cert 618e920a95Sopenharmony_ci .load_pem_certs_from_json_file(INVALID_STRUCTURE_PEM_CERT, ALLOWED_ROOT_CERT_MEMBER_NAMES); 628e920a95Sopenharmony_ci assert!(root_cert.pem_data.is_empty()); 638e920a95Sopenharmony_ci} 648e920a95Sopenharmony_ci 658e920a95Sopenharmony_ci#[test] 668e920a95Sopenharmony_cifn test_empty_pem_cert_json_file() { 678e920a95Sopenharmony_ci let mut root_cert = PemCollection::new(); 688e920a95Sopenharmony_ci root_cert.load_pem_certs_from_json_file(EMPTY_PEM_CERT, ALLOWED_ROOT_CERT_MEMBER_NAMES); 698e920a95Sopenharmony_ci assert!(root_cert.pem_data.is_empty()); 708e920a95Sopenharmony_ci} 718e920a95Sopenharmony_ci 728e920a95Sopenharmony_ci#[test] 738e920a95Sopenharmony_cifn test_successful_load_cert_path() { 748e920a95Sopenharmony_ci let mut cert_paths = TrustCertPath::new(); 758e920a95Sopenharmony_ci cert_paths.load_cert_path_from_json_file(VALID_CERT_PATH); 768e920a95Sopenharmony_ci assert_eq!(cert_paths.profile_signers.len(), 4); 778e920a95Sopenharmony_ci assert_eq!(cert_paths.app_sources.len(), 6); 788e920a95Sopenharmony_ci} 798e920a95Sopenharmony_ci#[test] 808e920a95Sopenharmony_cifn test_invalid_cert_path_file_path() { 818e920a95Sopenharmony_ci let mut cert_paths = TrustCertPath::new(); 828e920a95Sopenharmony_ci cert_paths.load_cert_path_from_json_file(NON_EXISTEND_CERT_PATH); 838e920a95Sopenharmony_ci assert!( 848e920a95Sopenharmony_ci cert_paths.app_sources.is_empty(), 858e920a95Sopenharmony_ci "Expected cert_paths.app_sources to be empty for an empty JSON file" 868e920a95Sopenharmony_ci ); 878e920a95Sopenharmony_ci} 888e920a95Sopenharmony_ci 898e920a95Sopenharmony_ci#[test] 908e920a95Sopenharmony_cifn test_invalid_cert_path_json_structure() { 918e920a95Sopenharmony_ci let mut cert_paths = TrustCertPath::new(); 928e920a95Sopenharmony_ci cert_paths.load_cert_path_from_json_file(INVALID_STRUCTURE_CERT_PATH); 938e920a95Sopenharmony_ci assert!( 948e920a95Sopenharmony_ci cert_paths.app_sources.is_empty(), 958e920a95Sopenharmony_ci "Expected cert_paths.app_sources to be empty for an empty JSON file" 968e920a95Sopenharmony_ci ); 978e920a95Sopenharmony_ci} 988e920a95Sopenharmony_ci 998e920a95Sopenharmony_ci#[test] 1008e920a95Sopenharmony_cifn test_empty_cert_path_json_file() { 1018e920a95Sopenharmony_ci let mut cert_paths = TrustCertPath::new(); 1028e920a95Sopenharmony_ci cert_paths.load_cert_path_from_json_file(EMPTY_CERT_PATH); 1038e920a95Sopenharmony_ci assert!( 1048e920a95Sopenharmony_ci cert_paths.app_sources.is_empty(), 1058e920a95Sopenharmony_ci "Expected cert_paths.app_sources to be empty for an empty JSON file" 1068e920a95Sopenharmony_ci ); 1078e920a95Sopenharmony_ci} 1088e920a95Sopenharmony_ci 1098e920a95Sopenharmony_ci#[test] 1108e920a95Sopenharmony_cifn test_parse_enterprise_profile() { 1118e920a95Sopenharmony_ci let profile_str = r#" 1128e920a95Sopenharmony_ci { 1138e920a95Sopenharmony_ci "version-name": "2.0.0", 1148e920a95Sopenharmony_ci "version-code": 2, 1158e920a95Sopenharmony_ci "app-distribution-type": "enterprise", 1168e920a95Sopenharmony_ci "uuid": "", 1178e920a95Sopenharmony_ci "validity": { 1188e920a95Sopenharmony_ci "not-before": 1, 1198e920a95Sopenharmony_ci "not-after": 2 1208e920a95Sopenharmony_ci }, 1218e920a95Sopenharmony_ci "type": "release", 1228e920a95Sopenharmony_ci "bundle-info": { 1238e920a95Sopenharmony_ci "developer-id": "", 1248e920a95Sopenharmony_ci "distribution-certificate": "", 1258e920a95Sopenharmony_ci "bundle-name": "com.test.enterprise", 1268e920a95Sopenharmony_ci "apl": "normal", 1278e920a95Sopenharmony_ci "app-feature": "test_app", 1288e920a95Sopenharmony_ci "app-identifier": "123123" 1298e920a95Sopenharmony_ci }, 1308e920a95Sopenharmony_ci "acls": { 1318e920a95Sopenharmony_ci "allowed-acls": [ 1328e920a95Sopenharmony_ci "" 1338e920a95Sopenharmony_ci ] 1348e920a95Sopenharmony_ci }, 1358e920a95Sopenharmony_ci "app-privilege-capabilities": [], 1368e920a95Sopenharmony_ci "permissions": { 1378e920a95Sopenharmony_ci "restricted-permissions": [ 1388e920a95Sopenharmony_ci "" 1398e920a95Sopenharmony_ci ] 1408e920a95Sopenharmony_ci } 1418e920a95Sopenharmony_ci } 1428e920a95Sopenharmony_ci "#; 1438e920a95Sopenharmony_ci let profile_json =JsonValue::from_text(profile_str).unwrap(); 1448e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&profile_json, true); 1458e920a95Sopenharmony_ci assert!(result.is_ok()); 1468e920a95Sopenharmony_ci} 1478e920a95Sopenharmony_ci 1488e920a95Sopenharmony_ci#[test] 1498e920a95Sopenharmony_cifn test_parse_enterprise_normal_profile() { 1508e920a95Sopenharmony_ci let profile_str = r#" 1518e920a95Sopenharmony_ci { 1528e920a95Sopenharmony_ci "version-name": "2.0.0", 1538e920a95Sopenharmony_ci "version-code": 2, 1548e920a95Sopenharmony_ci "app-distribution-type": "enterprise_normal", 1558e920a95Sopenharmony_ci "uuid": "", 1568e920a95Sopenharmony_ci "validity": { 1578e920a95Sopenharmony_ci "not-before": 1, 1588e920a95Sopenharmony_ci "not-after": 2 1598e920a95Sopenharmony_ci }, 1608e920a95Sopenharmony_ci "type": "release", 1618e920a95Sopenharmony_ci "bundle-info": { 1628e920a95Sopenharmony_ci "developer-id": "", 1638e920a95Sopenharmony_ci "distribution-certificate": "", 1648e920a95Sopenharmony_ci "bundle-name": "com.test.enterprise_normal", 1658e920a95Sopenharmony_ci "apl": "normal", 1668e920a95Sopenharmony_ci "app-feature": "test_app", 1678e920a95Sopenharmony_ci "app-identifier": "123123" 1688e920a95Sopenharmony_ci }, 1698e920a95Sopenharmony_ci "acls": { 1708e920a95Sopenharmony_ci "allowed-acls": [ 1718e920a95Sopenharmony_ci "" 1728e920a95Sopenharmony_ci ] 1738e920a95Sopenharmony_ci }, 1748e920a95Sopenharmony_ci "app-privilege-capabilities": [], 1758e920a95Sopenharmony_ci "permissions": { 1768e920a95Sopenharmony_ci "restricted-permissions": [ 1778e920a95Sopenharmony_ci "" 1788e920a95Sopenharmony_ci ] 1798e920a95Sopenharmony_ci } 1808e920a95Sopenharmony_ci } 1818e920a95Sopenharmony_ci "#; 1828e920a95Sopenharmony_ci let profile_json =JsonValue::from_text(profile_str).unwrap(); 1838e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&profile_json, true); 1848e920a95Sopenharmony_ci assert!(result.is_ok()); 1858e920a95Sopenharmony_ci} 1868e920a95Sopenharmony_ci 1878e920a95Sopenharmony_ci#[test] 1888e920a95Sopenharmony_cifn test_parse_enterprise_mdm_profile() { 1898e920a95Sopenharmony_ci let profile_str = r#" 1908e920a95Sopenharmony_ci { 1918e920a95Sopenharmony_ci "version-name": "2.0.0", 1928e920a95Sopenharmony_ci "version-code": 2, 1938e920a95Sopenharmony_ci "app-distribution-type": "enterprise_mdm", 1948e920a95Sopenharmony_ci "uuid": "", 1958e920a95Sopenharmony_ci "validity": { 1968e920a95Sopenharmony_ci "not-before": 1, 1978e920a95Sopenharmony_ci "not-after": 2 1988e920a95Sopenharmony_ci }, 1998e920a95Sopenharmony_ci "type": "release", 2008e920a95Sopenharmony_ci "bundle-info": { 2018e920a95Sopenharmony_ci "developer-id": "", 2028e920a95Sopenharmony_ci "distribution-certificate": "", 2038e920a95Sopenharmony_ci "bundle-name": "com.test.enterprise_mdm", 2048e920a95Sopenharmony_ci "apl": "normal", 2058e920a95Sopenharmony_ci "app-feature": "test_app", 2068e920a95Sopenharmony_ci "app-identifier": "123123" 2078e920a95Sopenharmony_ci }, 2088e920a95Sopenharmony_ci "acls": { 2098e920a95Sopenharmony_ci "allowed-acls": [ 2108e920a95Sopenharmony_ci "" 2118e920a95Sopenharmony_ci ] 2128e920a95Sopenharmony_ci }, 2138e920a95Sopenharmony_ci "app-privilege-capabilities": [], 2148e920a95Sopenharmony_ci "permissions": { 2158e920a95Sopenharmony_ci "restricted-permissions": [ 2168e920a95Sopenharmony_ci "" 2178e920a95Sopenharmony_ci ] 2188e920a95Sopenharmony_ci } 2198e920a95Sopenharmony_ci } 2208e920a95Sopenharmony_ci "#; 2218e920a95Sopenharmony_ci let profile_json =JsonValue::from_text(profile_str).unwrap(); 2228e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&profile_json, true); 2238e920a95Sopenharmony_ci assert!(result.is_ok()); 2248e920a95Sopenharmony_ci} 2258e920a95Sopenharmony_ci 2268e920a95Sopenharmony_ci#[test] 2278e920a95Sopenharmony_cifn test_parse_debug_profile() { 2288e920a95Sopenharmony_ci let profile_str = r#" 2298e920a95Sopenharmony_ci { 2308e920a95Sopenharmony_ci "version-name": "2.0.0", 2318e920a95Sopenharmony_ci "version-code": 2, 2328e920a95Sopenharmony_ci "app-distribution-type": "developer", 2338e920a95Sopenharmony_ci "uuid": "", 2348e920a95Sopenharmony_ci "validity": { 2358e920a95Sopenharmony_ci "not-before": 1, 2368e920a95Sopenharmony_ci "not-after": 2 2378e920a95Sopenharmony_ci }, 2388e920a95Sopenharmony_ci "type": "debug", 2398e920a95Sopenharmony_ci "bundle-info": { 2408e920a95Sopenharmony_ci "developer-id": "", 2418e920a95Sopenharmony_ci "development-certificate": "", 2428e920a95Sopenharmony_ci "bundle-name": "com.test.developer", 2438e920a95Sopenharmony_ci "apl": "normal", 2448e920a95Sopenharmony_ci "app-feature": "test_app", 2458e920a95Sopenharmony_ci "app-identifier": "123123" 2468e920a95Sopenharmony_ci }, 2478e920a95Sopenharmony_ci "acls": { 2488e920a95Sopenharmony_ci "allowed-acls": [ 2498e920a95Sopenharmony_ci "" 2508e920a95Sopenharmony_ci ] 2518e920a95Sopenharmony_ci }, 2528e920a95Sopenharmony_ci "app-privilege-capabilities": [], 2538e920a95Sopenharmony_ci "permissions": { 2548e920a95Sopenharmony_ci "restricted-permissions": [ 2558e920a95Sopenharmony_ci "" 2568e920a95Sopenharmony_ci ] 2578e920a95Sopenharmony_ci }, 2588e920a95Sopenharmony_ci "debug-info": { 2598e920a95Sopenharmony_ci "device-ids": [], 2608e920a95Sopenharmony_ci "device-id-type": "udid" 2618e920a95Sopenharmony_ci } 2628e920a95Sopenharmony_ci } 2638e920a95Sopenharmony_ci "#; 2648e920a95Sopenharmony_ci let udid = get_udid().expect("Failed to get UDID"); 2658e920a95Sopenharmony_ci let mut profile_json =JsonValue::from_text(profile_str).unwrap(); 2668e920a95Sopenharmony_ci profile_json["debug-info"]["device-ids"][0] = JsonValue::String(udid); 2678e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&profile_json, true); 2688e920a95Sopenharmony_ci assert!(result.is_ok()); 2698e920a95Sopenharmony_ci} 2708e920a95Sopenharmony_ci 2718e920a95Sopenharmony_ci#[test] 2728e920a95Sopenharmony_cifn test_parse_iternaltesting_profile() { 2738e920a95Sopenharmony_ci let profile_str = r#" 2748e920a95Sopenharmony_ci { 2758e920a95Sopenharmony_ci "version-name": "2.0.0", 2768e920a95Sopenharmony_ci "version-code": 2, 2778e920a95Sopenharmony_ci "app-distribution-type": "internaltesting", 2788e920a95Sopenharmony_ci "uuid": "", 2798e920a95Sopenharmony_ci "validity": { 2808e920a95Sopenharmony_ci "not-before": 1, 2818e920a95Sopenharmony_ci "not-after": 2 2828e920a95Sopenharmony_ci }, 2838e920a95Sopenharmony_ci "type": "release", 2848e920a95Sopenharmony_ci "bundle-info": { 2858e920a95Sopenharmony_ci "developer-id": "", 2868e920a95Sopenharmony_ci "distribution-certificate": "", 2878e920a95Sopenharmony_ci "bundle-name": "com.test.internaltesting", 2888e920a95Sopenharmony_ci "apl": "normal", 2898e920a95Sopenharmony_ci "app-feature": "test_app", 2908e920a95Sopenharmony_ci "app-identifier": "123123" 2918e920a95Sopenharmony_ci }, 2928e920a95Sopenharmony_ci "acls": { 2938e920a95Sopenharmony_ci "allowed-acls": [ 2948e920a95Sopenharmony_ci "" 2958e920a95Sopenharmony_ci ] 2968e920a95Sopenharmony_ci }, 2978e920a95Sopenharmony_ci "app-privilege-capabilities": [], 2988e920a95Sopenharmony_ci "permissions": { 2998e920a95Sopenharmony_ci "restricted-permissions": [ 3008e920a95Sopenharmony_ci "" 3018e920a95Sopenharmony_ci ] 3028e920a95Sopenharmony_ci }, 3038e920a95Sopenharmony_ci "debug-info": { 3048e920a95Sopenharmony_ci "device-ids": [], 3058e920a95Sopenharmony_ci "device-id-type": "udid" 3068e920a95Sopenharmony_ci } 3078e920a95Sopenharmony_ci } 3088e920a95Sopenharmony_ci "#; 3098e920a95Sopenharmony_ci let udid = get_udid().expect("Failed to get UDID"); 3108e920a95Sopenharmony_ci let mut profile_json =JsonValue::from_text(profile_str).unwrap(); 3118e920a95Sopenharmony_ci profile_json["debug-info"]["device-ids"][0] = JsonValue::String(udid); 3128e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&profile_json, true); 3138e920a95Sopenharmony_ci assert!(result.is_ok()); 3148e920a95Sopenharmony_ci} 3158e920a95Sopenharmony_ci 3168e920a95Sopenharmony_ci#[test] 3178e920a95Sopenharmony_cifn test_parse_invalid_profile() { 3188e920a95Sopenharmony_ci let no_type_profile = r#" 3198e920a95Sopenharmony_ci { 3208e920a95Sopenharmony_ci "version-name": "2.0.0", 3218e920a95Sopenharmony_ci "version-code": 2, 3228e920a95Sopenharmony_ci "app-distribution-type": "internaltesting", 3238e920a95Sopenharmony_ci "uuid": "", 3248e920a95Sopenharmony_ci "validity": { 3258e920a95Sopenharmony_ci "not-before": 1, 3268e920a95Sopenharmony_ci "not-after": 2 3278e920a95Sopenharmony_ci }, 3288e920a95Sopenharmony_ci "bundle-info": { 3298e920a95Sopenharmony_ci "developer-id": "", 3308e920a95Sopenharmony_ci "distribution-certificate": "", 3318e920a95Sopenharmony_ci "bundle-name": "com.test.internaltesting", 3328e920a95Sopenharmony_ci "apl": "normal", 3338e920a95Sopenharmony_ci "app-feature": "test_app", 3348e920a95Sopenharmony_ci "app-identifier": "123123" 3358e920a95Sopenharmony_ci }, 3368e920a95Sopenharmony_ci "acls": { 3378e920a95Sopenharmony_ci "allowed-acls": [ 3388e920a95Sopenharmony_ci "" 3398e920a95Sopenharmony_ci ] 3408e920a95Sopenharmony_ci }, 3418e920a95Sopenharmony_ci "app-privilege-capabilities": [], 3428e920a95Sopenharmony_ci "permissions": { 3438e920a95Sopenharmony_ci "restricted-permissions": [ 3448e920a95Sopenharmony_ci "" 3458e920a95Sopenharmony_ci ] 3468e920a95Sopenharmony_ci }, 3478e920a95Sopenharmony_ci "debug-info": { 3488e920a95Sopenharmony_ci "device-ids": [], 3498e920a95Sopenharmony_ci "device-id-type": "udid" 3508e920a95Sopenharmony_ci } 3518e920a95Sopenharmony_ci } 3528e920a95Sopenharmony_ci "#; 3538e920a95Sopenharmony_ci let no_distribution_profile = r#" 3548e920a95Sopenharmony_ci { 3558e920a95Sopenharmony_ci "version-name": "2.0.0", 3568e920a95Sopenharmony_ci "version-code": 2, 3578e920a95Sopenharmony_ci "uuid": "", 3588e920a95Sopenharmony_ci "validity": { 3598e920a95Sopenharmony_ci "not-before": 1, 3608e920a95Sopenharmony_ci "not-after": 2 3618e920a95Sopenharmony_ci }, 3628e920a95Sopenharmony_ci "type": "release", 3638e920a95Sopenharmony_ci "bundle-info": { 3648e920a95Sopenharmony_ci "developer-id": "", 3658e920a95Sopenharmony_ci "distribution-certificate": "", 3668e920a95Sopenharmony_ci "bundle-name": "com.test.internaltesting", 3678e920a95Sopenharmony_ci "apl": "normal", 3688e920a95Sopenharmony_ci "app-feature": "test_app", 3698e920a95Sopenharmony_ci "app-identifier": "123123" 3708e920a95Sopenharmony_ci }, 3718e920a95Sopenharmony_ci "acls": { 3728e920a95Sopenharmony_ci "allowed-acls": [ 3738e920a95Sopenharmony_ci "" 3748e920a95Sopenharmony_ci ] 3758e920a95Sopenharmony_ci }, 3768e920a95Sopenharmony_ci "app-privilege-capabilities": [], 3778e920a95Sopenharmony_ci "permissions": { 3788e920a95Sopenharmony_ci "restricted-permissions": [ 3798e920a95Sopenharmony_ci "" 3808e920a95Sopenharmony_ci ] 3818e920a95Sopenharmony_ci }, 3828e920a95Sopenharmony_ci "debug-info": { 3838e920a95Sopenharmony_ci "device-ids": [], 3848e920a95Sopenharmony_ci "device-id-type": "udid" 3858e920a95Sopenharmony_ci } 3868e920a95Sopenharmony_ci } 3878e920a95Sopenharmony_ci "#; 3888e920a95Sopenharmony_ci let no_debug_info_profile = r#" 3898e920a95Sopenharmony_ci { 3908e920a95Sopenharmony_ci "version-name": "2.0.0", 3918e920a95Sopenharmony_ci "version-code": 2, 3928e920a95Sopenharmony_ci "app-distribution-type": "internaltesting", 3938e920a95Sopenharmony_ci "uuid": "", 3948e920a95Sopenharmony_ci "validity": { 3958e920a95Sopenharmony_ci "not-before": 1, 3968e920a95Sopenharmony_ci "not-after": 2 3978e920a95Sopenharmony_ci }, 3988e920a95Sopenharmony_ci "type": "release", 3998e920a95Sopenharmony_ci "bundle-info": { 4008e920a95Sopenharmony_ci "developer-id": "", 4018e920a95Sopenharmony_ci "distribution-certificate": "", 4028e920a95Sopenharmony_ci "bundle-name": "com.test.internaltesting", 4038e920a95Sopenharmony_ci "apl": "normal", 4048e920a95Sopenharmony_ci "app-feature": "test_app", 4058e920a95Sopenharmony_ci "app-identifier": "123123" 4068e920a95Sopenharmony_ci }, 4078e920a95Sopenharmony_ci "acls": { 4088e920a95Sopenharmony_ci "allowed-acls": [ 4098e920a95Sopenharmony_ci "" 4108e920a95Sopenharmony_ci ] 4118e920a95Sopenharmony_ci }, 4128e920a95Sopenharmony_ci "app-privilege-capabilities": [], 4138e920a95Sopenharmony_ci "permissions": { 4148e920a95Sopenharmony_ci "restricted-permissions": [ 4158e920a95Sopenharmony_ci "" 4168e920a95Sopenharmony_ci ] 4178e920a95Sopenharmony_ci } 4188e920a95Sopenharmony_ci } 4198e920a95Sopenharmony_ci "#; 4208e920a95Sopenharmony_ci let udid = get_udid().expect("Failed to get UDID"); 4218e920a95Sopenharmony_ci let mut no_type_profile_json =JsonValue::from_text(no_type_profile).unwrap(); 4228e920a95Sopenharmony_ci no_type_profile_json["debug-info"]["device-ids"][0] = JsonValue::String(udid.clone()); 4238e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&no_type_profile_json, true); 4248e920a95Sopenharmony_ci assert!(result.is_err()); 4258e920a95Sopenharmony_ci 4268e920a95Sopenharmony_ci let mut no_distribution_profile_json =JsonValue::from_text(no_distribution_profile).unwrap(); 4278e920a95Sopenharmony_ci no_distribution_profile_json["debug-info"]["device-ids"][0] = JsonValue::String(udid.clone()); 4288e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&no_distribution_profile_json, true); 4298e920a95Sopenharmony_ci assert!(result.is_err()); 4308e920a95Sopenharmony_ci 4318e920a95Sopenharmony_ci let no_debug_info_profile_json =JsonValue::from_text(no_debug_info_profile).unwrap(); 4328e920a95Sopenharmony_ci let result = validate_bundle_and_distribution_type(&no_debug_info_profile_json, true); 4338e920a95Sopenharmony_ci assert!(result.is_err()); 4348e920a95Sopenharmony_ci} 4358e920a95Sopenharmony_ci 4368e920a95Sopenharmony_ci#[test] 4378e920a95Sopenharmony_cifn test_get_udid_once() { 4388e920a95Sopenharmony_ci let udid_from_get = get_udid().expect("Failed to get UDID"); 4398e920a95Sopenharmony_ci let udid_from_global = UDID.clone().expect("UDID is None"); 4408e920a95Sopenharmony_ci 4418e920a95Sopenharmony_ci assert_eq!(udid_from_get, udid_from_global); 4428e920a95Sopenharmony_ci} 4438e920a95Sopenharmony_ci 4448e920a95Sopenharmony_ci#[test] 4458e920a95Sopenharmony_cifn test_get_udid_concurrent() { 4468e920a95Sopenharmony_ci let num_threads = 10; 4478e920a95Sopenharmony_ci let mut handles = vec![]; 4488e920a95Sopenharmony_ci 4498e920a95Sopenharmony_ci for _ in 0..num_threads { 4508e920a95Sopenharmony_ci let handle = thread::spawn(|| { 4518e920a95Sopenharmony_ci let udid = get_udid().expect("Failed to get UDID"); 4528e920a95Sopenharmony_ci assert_eq!(udid, UDID.clone().expect("UDID is None")); 4538e920a95Sopenharmony_ci }); 4548e920a95Sopenharmony_ci handles.push(handle); 4558e920a95Sopenharmony_ci } 4568e920a95Sopenharmony_ci 4578e920a95Sopenharmony_ci for handle in handles { 4588e920a95Sopenharmony_ci handle.join().expect("Thread panicked"); 4598e920a95Sopenharmony_ci } 4608e920a95Sopenharmony_ci}