| // Copyright 2022 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| use std::collections::hash_map::DefaultHasher; |
| use std::fs::File; |
| use std::hash::Hash; |
| use std::hash::Hasher; |
| use std::path::Path; |
| |
| use libchromeos::error; |
| use tempfile::TempDir; |
| |
| use super::Context; |
| use crate::command_runner::MockCommandRunner; |
| use crate::error::HwsecError; |
| |
| pub(crate) struct MockContext { |
| cmd_runner: MockCommandRunner, |
| temp_dir: TempDir, |
| } |
| |
| fn calculate_hash<T: Hash>(t: &T) -> u64 { |
| let mut s = DefaultHasher::new(); |
| t.hash(&mut s); |
| s.finish() |
| } |
| |
| impl MockContext { |
| pub fn new() -> Self { |
| Self { |
| cmd_runner: MockCommandRunner::new(), |
| temp_dir: TempDir::new().unwrap(), |
| } |
| } |
| fn get_mock_path_string(&mut self, path_str: &str) -> String { |
| let file_path_hash = calculate_hash(&path_str).to_string(); |
| format!("{}/{}", self.temp_dir.path().display(), file_path_hash) |
| } |
| |
| pub fn create_path(&mut self, path_str: &str) -> bool { |
| let new_path_string = self.get_mock_path_string(path_str); |
| File::create(new_path_string).is_ok() |
| } |
| } |
| |
| impl Context for MockContext { |
| type CommandRunner = MockCommandRunner; |
| fn cmd_runner(&mut self) -> &mut Self::CommandRunner { |
| &mut self.cmd_runner |
| } |
| |
| fn path_exists(&mut self, path_str: &str) -> bool { |
| let new_path_string = self.get_mock_path_string(path_str); |
| Path::new(&new_path_string).exists() |
| } |
| |
| fn read_file_to_string(&mut self, path_str: &str) -> Result<String, HwsecError> { |
| let new_path_string = self.get_mock_path_string(path_str); |
| |
| std::fs::read_to_string(new_path_string).map_err(|_| { |
| error!("Failed to read {}", path_str); |
| HwsecError::FileError |
| }) |
| } |
| |
| fn write_contents_to_file( |
| &mut self, |
| path_str: &str, |
| contents: &[u8], |
| ) -> Result<(), HwsecError> { |
| let new_path_string = self.get_mock_path_string(path_str); |
| |
| std::fs::write(new_path_string, contents).map_err(|_| { |
| error!("Failed to write {}", path_str); |
| HwsecError::FileError |
| }) |
| } |
| |
| fn sleep(&mut self, _sec: u64) { |
| // Don't sleep when performing unit tests |
| } |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use super::MockContext; |
| use crate::context::Context; |
| |
| #[test] |
| fn test_create_path() { |
| let mut mock_ctx = MockContext::new(); |
| assert!(mock_ctx.create_path("/test")); |
| assert!(mock_ctx.path_exists("/test")); |
| } |
| } |