Skip to main content

cc_teec/common/
vsock_define.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2025-2026 KylinSoft Co., Ltd. <https://www.kylinos.cn/>
3// See LICENSES for license details.
4
5#![allow(dead_code)]
6
7use std::env;
8
9/// 默认 VSOCK Server CID
10pub const DEFAULT_VSOCK_SERVER_CID: u32 = 103;
11
12/// 默认 VSOCK Port
13pub const DEFAULT_VSOCK_PORT: u32 = 9999;
14
15/// 获取 VSOCK Server CID
16///
17/// 优先从环境变量 `VSOCK_CID` 读取,如果未设置则使用默认值 103
18///
19/// # 示例
20/// ```no_run
21/// use cc_teec::common::vsock_define::get_vsock_cid;
22/// let cid = get_vsock_cid();
23/// println!("VSOCK CID: {}", cid);
24/// ```
25pub fn get_vsock_cid() -> u32 {
26    env::var("VSOCK_CID")
27        .ok()
28        .and_then(|s| s.parse().ok())
29        .unwrap_or(DEFAULT_VSOCK_SERVER_CID)
30}
31
32/// 获取 VSOCK Port
33///
34/// 优先从环境变量 `VSOCK_PORT` 读取,如果未设置则使用默认值 9999
35///
36/// # 示例
37/// ```no_run
38/// use cc_teec::common::vsock_define::get_vsock_port;
39/// let port = get_vsock_port();
40/// println!("VSOCK Port: {}", port);
41/// ```
42pub fn get_vsock_port() -> u32 {
43    env::var("VSOCK_PORT")
44        .ok()
45        .and_then(|s| s.parse().ok())
46        .unwrap_or(DEFAULT_VSOCK_PORT)
47}
48
49#[cfg(test)]
50mod tests {
51    use super::*;
52    use std::env;
53
54    #[test]
55    fn test_default_vsock_cid() {
56        // 清除环境变量,测试默认值
57        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
58        unsafe { env::remove_var("VSOCK_CID") };
59        let cid = get_vsock_cid();
60        assert_eq!(
61            cid, DEFAULT_VSOCK_SERVER_CID,
62            "默认 CID 应该为 {}",
63            DEFAULT_VSOCK_SERVER_CID
64        );
65    }
66
67    #[test]
68    fn test_default_vsock_port() {
69        // 清除环境变量,测试默认值
70        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
71        unsafe { env::remove_var("VSOCK_PORT") };
72        let port = get_vsock_port();
73        assert_eq!(
74            port, DEFAULT_VSOCK_PORT,
75            "默认 Port 应该为 {}",
76            DEFAULT_VSOCK_PORT
77        );
78    }
79
80    #[test]
81    fn test_custom_vsock_cid() {
82        // 保存旧值
83        let old_value = env::var("VSOCK_CID").ok();
84
85        // 设置自定义 CID
86        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
87        unsafe { env::set_var("VSOCK_CID", "200") };
88        let cid = get_vsock_cid();
89        assert_eq!(cid, 200, "自定义 CID 应该为 200");
90
91        // 恢复旧值或清除
92        match old_value {
93            Some(val) => unsafe { env::set_var("VSOCK_CID", val) },
94            None => unsafe { env::remove_var("VSOCK_CID") },
95        }
96    }
97
98    #[test]
99    fn test_custom_vsock_port() {
100        // 保存旧值
101        let old_value = env::var("VSOCK_PORT").ok();
102
103        // 设置自定义 Port
104        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
105        unsafe { env::set_var("VSOCK_PORT", "8888") };
106        let port = get_vsock_port();
107        assert_eq!(port, 8888, "自定义 Port 应该为 8888");
108
109        // 恢复旧值或清除
110        match old_value {
111            Some(val) => unsafe { env::set_var("VSOCK_PORT", val) },
112            None => unsafe { env::remove_var("VSOCK_PORT") },
113        }
114    }
115
116    #[test]
117    fn test_invalid_vsock_cid() {
118        // 保存旧值
119        let old_value = env::var("VSOCK_CID").ok();
120
121        // 设置无效值,应该回退到默认值
122        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
123        unsafe { env::set_var("VSOCK_CID", "invalid") };
124        let cid = get_vsock_cid();
125        assert_eq!(cid, DEFAULT_VSOCK_SERVER_CID, "无效 CID 应该回退到默认值");
126
127        // 恢复旧值或清除
128        match old_value {
129            Some(val) => unsafe { env::set_var("VSOCK_CID", val) },
130            None => unsafe { env::remove_var("VSOCK_CID") },
131        }
132    }
133
134    #[test]
135    fn test_invalid_vsock_port() {
136        // 保存旧值
137        let old_value = env::var("VSOCK_PORT").ok();
138
139        // 设置无效值,应该回退到默认值
140        // SAFETY: 在测试环境中修改环境变量是安全的,因为测试是单线程的
141        unsafe { env::set_var("VSOCK_PORT", "not_a_number") };
142        let port = get_vsock_port();
143        assert_eq!(port, DEFAULT_VSOCK_PORT, "无效 Port 应该回退到默认值");
144
145        // 恢复旧值或清除
146        match old_value {
147            Some(val) => unsafe { env::set_var("VSOCK_PORT", val) },
148            None => unsafe { env::remove_var("VSOCK_PORT") },
149        }
150    }
151}