1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker
15*cf78ab8cSAndroid Build Coastguard Worker //! Inspection and manipulation of the system environment.
16*cf78ab8cSAndroid Build Coastguard Worker
17*cf78ab8cSAndroid Build Coastguard Worker use std::env;
18*cf78ab8cSAndroid Build Coastguard Worker use std::path::PathBuf;
19*cf78ab8cSAndroid Build Coastguard Worker
20*cf78ab8cSAndroid Build Coastguard Worker /// Get or create the netsimd temporary directory.
21*cf78ab8cSAndroid Build Coastguard Worker ///
22*cf78ab8cSAndroid Build Coastguard Worker /// This is based on emu System.cpp android::base::getTempDir()
23*cf78ab8cSAndroid Build Coastguard Worker ///
24*cf78ab8cSAndroid Build Coastguard Worker /// Under Forge temp directory is `$ANDROID_TMP/android-$USER/netsimd`,
25*cf78ab8cSAndroid Build Coastguard Worker /// otherwise it is `$TMP/android-$USER/netsimd`
26*cf78ab8cSAndroid Build Coastguard Worker ///
netsimd_temp_dir() -> PathBuf27*cf78ab8cSAndroid Build Coastguard Worker pub fn netsimd_temp_dir() -> PathBuf {
28*cf78ab8cSAndroid Build Coastguard Worker let path = netsimd_temp_dir_pathbuf();
29*cf78ab8cSAndroid Build Coastguard Worker if !path.is_dir() {
30*cf78ab8cSAndroid Build Coastguard Worker std::fs::create_dir_all(&path).unwrap();
31*cf78ab8cSAndroid Build Coastguard Worker }
32*cf78ab8cSAndroid Build Coastguard Worker path
33*cf78ab8cSAndroid Build Coastguard Worker }
34*cf78ab8cSAndroid Build Coastguard Worker
35*cf78ab8cSAndroid Build Coastguard Worker /// Helper function for netsimd_temp_dir() to allow Read Only
36*cf78ab8cSAndroid Build Coastguard Worker /// Unit tests.
netsimd_temp_dir_pathbuf() -> PathBuf37*cf78ab8cSAndroid Build Coastguard Worker fn netsimd_temp_dir_pathbuf() -> PathBuf {
38*cf78ab8cSAndroid Build Coastguard Worker // allow Forge to override the system temp
39*cf78ab8cSAndroid Build Coastguard Worker let mut path = match env::var("ANDROID_TMP") {
40*cf78ab8cSAndroid Build Coastguard Worker Ok(var) => PathBuf::from(var),
41*cf78ab8cSAndroid Build Coastguard Worker _ => env::temp_dir(),
42*cf78ab8cSAndroid Build Coastguard Worker };
43*cf78ab8cSAndroid Build Coastguard Worker // On Windows the GetTempPath() is user-dependent so we don't need
44*cf78ab8cSAndroid Build Coastguard Worker // to append $USER to the result -- otherwise allow multiple users
45*cf78ab8cSAndroid Build Coastguard Worker // to co-exist on a system.
46*cf78ab8cSAndroid Build Coastguard Worker #[cfg(not(target_os = "windows"))]
47*cf78ab8cSAndroid Build Coastguard Worker {
48*cf78ab8cSAndroid Build Coastguard Worker let user = match env::var("USER") {
49*cf78ab8cSAndroid Build Coastguard Worker Ok(var) => format!("android-{}", var),
50*cf78ab8cSAndroid Build Coastguard Worker _ => "android".to_string(),
51*cf78ab8cSAndroid Build Coastguard Worker };
52*cf78ab8cSAndroid Build Coastguard Worker path.push(user);
53*cf78ab8cSAndroid Build Coastguard Worker };
54*cf78ab8cSAndroid Build Coastguard Worker // netsimd files are stored in their own directory
55*cf78ab8cSAndroid Build Coastguard Worker path.push("netsimd");
56*cf78ab8cSAndroid Build Coastguard Worker path
57*cf78ab8cSAndroid Build Coastguard Worker }
58*cf78ab8cSAndroid Build Coastguard Worker
59*cf78ab8cSAndroid Build Coastguard Worker #[cfg(not(target_os = "windows"))]
60*cf78ab8cSAndroid Build Coastguard Worker #[cfg(test)]
61*cf78ab8cSAndroid Build Coastguard Worker pub mod tests {
62*cf78ab8cSAndroid Build Coastguard Worker use super::netsimd_temp_dir_pathbuf;
63*cf78ab8cSAndroid Build Coastguard Worker use std::env;
64*cf78ab8cSAndroid Build Coastguard Worker use std::sync::Mutex;
65*cf78ab8cSAndroid Build Coastguard Worker
66*cf78ab8cSAndroid Build Coastguard Worker pub static ENV_MUTEX: Mutex<()> = Mutex::new(());
67*cf78ab8cSAndroid Build Coastguard Worker
68*cf78ab8cSAndroid Build Coastguard Worker #[test]
test_forge()69*cf78ab8cSAndroid Build Coastguard Worker fn test_forge() {
70*cf78ab8cSAndroid Build Coastguard Worker let _locked = ENV_MUTEX.lock();
71*cf78ab8cSAndroid Build Coastguard Worker env::set_var("ANDROID_TMP", "/tmp/forge");
72*cf78ab8cSAndroid Build Coastguard Worker env::set_var("USER", "ryle");
73*cf78ab8cSAndroid Build Coastguard Worker let tmp_dir = netsimd_temp_dir_pathbuf();
74*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(tmp_dir.to_str().unwrap(), "/tmp/forge/android-ryle/netsimd");
75*cf78ab8cSAndroid Build Coastguard Worker }
76*cf78ab8cSAndroid Build Coastguard Worker
77*cf78ab8cSAndroid Build Coastguard Worker #[test]
test_non_forge()78*cf78ab8cSAndroid Build Coastguard Worker fn test_non_forge() {
79*cf78ab8cSAndroid Build Coastguard Worker let _locked = ENV_MUTEX.lock();
80*cf78ab8cSAndroid Build Coastguard Worker let temp_dir = env::temp_dir();
81*cf78ab8cSAndroid Build Coastguard Worker env::remove_var("ANDROID_TMP");
82*cf78ab8cSAndroid Build Coastguard Worker env::set_var("USER", "ryle");
83*cf78ab8cSAndroid Build Coastguard Worker let netsimd_temp_dir = netsimd_temp_dir_pathbuf();
84*cf78ab8cSAndroid Build Coastguard Worker assert_eq!(
85*cf78ab8cSAndroid Build Coastguard Worker netsimd_temp_dir.to_str().unwrap(),
86*cf78ab8cSAndroid Build Coastguard Worker temp_dir.join("android-ryle/netsimd").to_str().unwrap()
87*cf78ab8cSAndroid Build Coastguard Worker );
88*cf78ab8cSAndroid Build Coastguard Worker }
89*cf78ab8cSAndroid Build Coastguard Worker }
90