bogrep/
test_utils.rs

1use crate::utils;
2use lz4::block;
3use std::{io::Write, path::Path};
4
5pub fn create_compressed_json_file(compressed_bookmark_path: &Path) -> Result<(), anyhow::Error> {
6    if !compressed_bookmark_path.exists() {
7        let decompressed_bookmark_path = Path::new("test_data/bookmarks_firefox.json");
8        assert!(decompressed_bookmark_path.exists());
9
10        let decompressed_bookmarks = utils::read_file(decompressed_bookmark_path)?;
11        let compressed_bookmarks = compress_bookmarks(&decompressed_bookmarks);
12
13        let mut file = utils::create_file(compressed_bookmark_path)?;
14        file.write_all(&compressed_bookmarks)?;
15        file.flush()?;
16
17        assert!(compressed_bookmark_path.exists());
18    }
19
20    Ok(())
21}
22
23pub fn create_binary_plist_file(binary_bookmark_path: &Path) -> Result<(), anyhow::Error> {
24    if !binary_bookmark_path.exists() {
25        let bookmark_path = Path::new("test_data/bookmarks_safari_xml.plist");
26        let bookmark_file = utils::open_file(bookmark_path)?;
27        let parsed_bookmarks = plist::Value::from_reader_xml(&bookmark_file)?;
28
29        plist::to_file_binary(binary_bookmark_path, &parsed_bookmarks)?;
30
31        assert!(binary_bookmark_path.exists());
32    }
33
34    Ok(())
35}
36
37pub fn compress_bookmarks(decompressed_bookmarks: &[u8]) -> Vec<u8> {
38    let compressed_data = block::compress(decompressed_bookmarks, None, true).unwrap();
39
40    // Add non-standard header to data
41    let prefix: &[u8] = b"mozLz40\0";
42    let mut compressed_data_with_header = Vec::with_capacity(prefix.len() + compressed_data.len());
43    compressed_data_with_header.extend_from_slice(prefix);
44    compressed_data_with_header.extend_from_slice(&compressed_data);
45
46    compressed_data_with_header
47}
48
49#[cfg(test)]
50pub mod tests {
51    use super::*;
52    use crate::bookmark_reader::SourceOs;
53    use std::fs::{self, File};
54
55    const PROFILES_INI_LINUX: &str = r#"
56        [Profile2]
57        Name=bene
58        IsRelative=1
59        Path=profile3.username
60
61        [Profile1]
62        Name=bene
63        IsRelative=1
64        Path=profile2.username
65        Default=1
66            
67        [Profile0]
68        Name=default
69        IsRelative=1
70        Path=profile1.default
71    "#;
72
73    const PROFILES_INI_MACOS: &str = r#"
74        [Profile2]
75        Name=bene
76        IsRelative=1
77        Path=Profiles/profile3.username
78
79        [Profile1]
80        Name=bene
81        IsRelative=1
82        Path=Profiles/profile2.username
83        Default=1
84            
85        [Profile0]
86        Name=default
87        IsRelative=1
88        Path=Profiles/profile1.default
89    "#;
90
91    fn create_chromium_dirs(browser_dir: &Path) {
92        let default_profile_dir = browser_dir.join("Default");
93        let profile_dir = browser_dir.join("Profile 1");
94
95        fs::create_dir_all(&default_profile_dir).unwrap();
96        fs::create_dir_all(&profile_dir).unwrap();
97
98        let default_profile_file = default_profile_dir.join("Bookmarks");
99        let profile_file = profile_dir.join("Bookmarks");
100        File::create(default_profile_file).unwrap();
101        File::create(profile_file).unwrap();
102    }
103
104    fn create_safari_dirs(browser_dir: &Path) {
105        fs::create_dir_all(browser_dir).unwrap();
106        utils::create_file(&browser_dir.join("Bookmarks.plist")).unwrap();
107    }
108
109    fn create_firefox_dirs_linux(browser_dir: &Path) {
110        let profile_dir1 = browser_dir.join("profile1.default/bookmarkbackups");
111        let profile_dir2 = browser_dir.join("profile2.username/bookmarkbackups");
112        fs::create_dir_all(&profile_dir1).unwrap();
113        fs::create_dir_all(&profile_dir2).unwrap();
114        utils::create_file(&profile_dir1.join("bookmarks.jsonlz4")).unwrap();
115        utils::create_file(&profile_dir2.join("bookmarks.jsonlz4")).unwrap();
116        let mut file = utils::create_file(&browser_dir.join("profiles.ini")).unwrap();
117        file.write_all(PROFILES_INI_LINUX.as_bytes()).unwrap();
118        file.flush().unwrap();
119    }
120
121    fn create_firefox_dirs_macos(browser_dir: &Path) {
122        let profile_dir1 = browser_dir.join("Profiles/profile1.default/bookmarkbackups");
123        let profile_dir2 = browser_dir.join("Profiles/profile2.username/bookmarkbackups");
124        fs::create_dir_all(&profile_dir1).unwrap();
125        fs::create_dir_all(&profile_dir2).unwrap();
126        utils::create_file(&profile_dir1.join("bookmarks.jsonlz4")).unwrap();
127        utils::create_file(&profile_dir2.join("bookmarks.jsonlz4")).unwrap();
128        let mut file = utils::create_file(&browser_dir.join("profiles.ini")).unwrap();
129        file.write_all(PROFILES_INI_MACOS.as_bytes()).unwrap();
130        file.flush().unwrap();
131    }
132
133    pub fn create_test_files(home_dir: &Path, source_os: &SourceOs) {
134        match source_os {
135            SourceOs::Linux => {
136                let browser_dir = home_dir.join("snap/firefox/common/.mozilla/firefox");
137                create_firefox_dirs_linux(&browser_dir);
138
139                let browser_dir = home_dir.join(".mozilla/firefox");
140                create_firefox_dirs_linux(&browser_dir);
141
142                let browser_dir = home_dir.join("snap/chromium/common/chromium");
143                create_chromium_dirs(&browser_dir);
144
145                let browser_dir = home_dir.join(".config/google-chrome");
146                create_chromium_dirs(&browser_dir);
147
148                let browser_dir = home_dir.join(".config/microsoft-edge");
149                create_chromium_dirs(&browser_dir);
150            }
151            SourceOs::Macos => {
152                let browser_dir = home_dir.join("Library/Safari");
153                create_safari_dirs(&browser_dir);
154
155                let browser_dir = home_dir.join("Library/Application Support/Firefox");
156                create_firefox_dirs_macos(&browser_dir);
157
158                let browser_dir = home_dir.join("Library/Application Support/Google/Chrome");
159                create_chromium_dirs(&browser_dir);
160            }
161            SourceOs::Windows => {
162                let browser_dir = home_dir.join("AppData\\Local\\Google\\Chrome\\User Data");
163                create_chromium_dirs(&browser_dir);
164
165                let browser_dir = home_dir.join("AppData\\Local\\Microsoft\\Edge\\User Data");
166                create_chromium_dirs(&browser_dir);
167            }
168        }
169    }
170}