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}