Skip to content

Commit 0462324

Browse files
authored
Add json support to gui (#1083)
* Add json support to gui * Cli support * Tests * Zip fixed * Always printing * Zip * Bound * Improved CI * More tests * Maybe * Different duplicate delete
1 parent 9b57382 commit 0462324

24 files changed

+909
-452
lines changed

.github/workflows/linux_cli.yml

+7-68
Original file line numberDiff line numberDiff line change
@@ -38,73 +38,12 @@ jobs:
3838
path: target/release/czkawka_cli
3939
if: ${{ matrix.type == 'release' }}
4040

41-
# Duplicate finder checks included and excluded directories
42-
# Others are just check delete files number
4341
- name: Linux Regression Test
4442
run: |
45-
wget https://github.com/qarmin/czkawka/releases/download/1.1.0/TestSuite.zip
46-
unzip TestSuite.zip -d TestSuite
47-
python3 misc/check_results.py TestSuite 15 8
48-
49-
50-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
51-
python3 misc/check_results.py TestSuite 7 8
52-
53-
rm -rf TestSuite
54-
unzip TestSuite.zip -d TestSuite
55-
56-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -D aen -m 1024
57-
python3 misc/check_results.py TestSuite 7 8
58-
59-
rm -rf TestSuite
60-
unzip TestSuite.zip -d TestSuite
61-
62-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -x TEXT -D aeo -m 1024
63-
python3 misc/check_results.py TestSuite 14 8
64-
65-
rm -rf TestSuite
66-
unzip TestSuite.zip -d TestSuite
67-
68-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -e "$(pwd)/TestSuite/SubFolder" -D aeo -m 1024
69-
python3 misc/check_results.py TestSuite 13 8
70-
71-
rm -rf TestSuite
72-
unzip TestSuite.zip -d TestSuite
73-
74-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -m 1500 -D aeo
75-
python3 misc/check_results.py TestSuite 8 8
76-
77-
rm -rf TestSuite
78-
unzip TestSuite.zip -d TestSuite
79-
80-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -m 1024
81-
python3 misc/check_results.py TestSuite 15 8
82-
target/release/czkawka_cli dup -d "$(pwd)/TestSuite" -R -D aeo -m 1024
83-
python3 misc/check_results.py TestSuite 13 8
84-
85-
86-
target/release/czkawka_cli big -d "$(pwd)/TestSuite"
87-
88-
rm -rf TestSuite
89-
unzip TestSuite.zip -d TestSuite
90-
91-
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite"
92-
python3 misc/check_results.py TestSuite 15 8
93-
target/release/czkawka_cli empty-files -d "$(pwd)/TestSuite" -D
94-
python3 misc/check_results.py TestSuite 13 8
95-
96-
rm -rf TestSuite
97-
unzip TestSuite.zip -d TestSuite
98-
99-
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite"
100-
python3 misc/check_results.py TestSuite 15 8
101-
target/release/czkawka_cli empty-folders -d "$(pwd)/TestSuite" -D
102-
python3 misc/check_results.py TestSuite 15 2
103-
104-
rm -rf TestSuite
105-
unzip TestSuite.zip -d TestSuite
106-
107-
target/release/czkawka_cli temp -d "$(pwd)/TestSuite"
108-
python3 misc/check_results.py TestSuite 15 8
109-
target/release/czkawka_cli temp -d "$(pwd)/TestSuite" -D
110-
python3 misc/check_results.py TestSuite 14 8
43+
wget https://github.com/qarmin/czkawka/releases/download/6.0.0/TestFiles.zip
44+
cd ci_tester
45+
cargo build --release
46+
cd ..
47+
48+
ci_tester/target/release/ci_tester target/release/czkawka_cli
49+
if: ${{ matrix.type == 'release' }}

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@ flatpak/
1313
*.profdata
1414
/lcov_report*
1515
/report
16+
ci_tester/target
17+
ci_tester/Cargo.lock
18+
czkawka_slint_gui/Cargo.lock

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ members = [
33
"czkawka_core",
44
"czkawka_cli",
55
"czkawka_gui",
6-
# "czkawka_slint_gui",
76
]
87
exclude = [
8+
"ci_tester",
99
"czkawka_slint_gui"
1010
]
1111
resolver = "2"

ci_tester/Cargo.toml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
[package]
2+
name = "ci_tester"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
state = "0.6.0"
10+
handsome_logger = "0.8.0"
11+
log = "0.4.20"

ci_tester/src/main.rs

+233
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,233 @@
1+
use log::info;
2+
use std::collections::BTreeSet;
3+
use std::fs;
4+
use std::process::Command;
5+
use std::process::Stdio;
6+
7+
#[derive(Default, Clone, Debug)]
8+
struct CollectedFiles {
9+
files: BTreeSet<String>,
10+
folders: BTreeSet<String>,
11+
symlinks: BTreeSet<String>,
12+
}
13+
14+
static CZKAWKA_PATH: state::InitCell<String> = state::InitCell::new();
15+
static COLLECTED_FILES: state::InitCell<CollectedFiles> = state::InitCell::new();
16+
17+
const ATTEMPTS: u32 = 10;
18+
19+
// App runs - ./ci_tester PATH_TO_CZKAWKA
20+
fn main() {
21+
handsome_logger::init().unwrap();
22+
let args: Vec<String> = std::env::args().collect();
23+
let path_to_czkawka = args[1].clone();
24+
CZKAWKA_PATH.set(path_to_czkawka);
25+
remove_test_dir();
26+
run_with_good_status(&["ls"], false);
27+
unzip_files();
28+
29+
let all_files = collect_all_files_and_dirs("TestFiles").unwrap();
30+
COLLECTED_FILES.set(all_files);
31+
remove_test_dir();
32+
33+
for _ in 0..ATTEMPTS {
34+
test_empty_files();
35+
test_smallest_files();
36+
test_biggest_files();
37+
test_empty_folders();
38+
test_temporary_files();
39+
test_symlinks_files();
40+
test_remove_duplicates_one_oldest();
41+
test_remove_duplicates_one_newest();
42+
test_remove_duplicates_all_expect_newest();
43+
test_remove_duplicates_all_expect_oldest();
44+
}
45+
46+
println!("Completed checking");
47+
}
48+
fn test_remove_duplicates_all_expect_oldest() {
49+
info!("test_remove_duplicates_all_expect_oldest");
50+
run_test(
51+
&["dup", "-d", "TestFiles", "-D", "AEO"],
52+
vec!["Images/A1.jpg", "Images/A5.jpg", "Music/M1.mp3", "Music/M2.mp3", "Videos/V1.mp4", "Videos/V5.mp4"],
53+
vec![],
54+
vec![],
55+
);
56+
}
57+
fn test_remove_duplicates_all_expect_newest() {
58+
info!("test_remove_duplicates_all_expect_newest");
59+
run_test(
60+
&["dup", "-d", "TestFiles", "-D", "AEN"],
61+
vec!["Images/A2.jpg", "Images/A5.jpg", "Music/M1.mp3", "Music/M5.mp3", "Videos/V1.mp4", "Videos/V2.mp4"],
62+
vec![],
63+
vec![],
64+
);
65+
}
66+
67+
fn test_remove_duplicates_one_newest() {
68+
info!("test_remove_duplicates_one_newest");
69+
run_test(
70+
&["dup", "-d", "TestFiles", "-D", "ON"],
71+
vec!["Images/A1.jpg", "Music/M2.mp3", "Videos/V5.mp4"],
72+
vec![],
73+
vec![],
74+
);
75+
}
76+
fn test_remove_duplicates_one_oldest() {
77+
info!("test_remove_duplicates_one_oldest");
78+
run_test(
79+
&["dup", "-d", "TestFiles", "-D", "OO"],
80+
vec!["Images/A2.jpg", "Music/M5.mp3", "Videos/V2.mp4"],
81+
vec![],
82+
vec![],
83+
);
84+
}
85+
86+
fn test_symlinks_files() {
87+
info!("test_symlinks_files");
88+
run_test(&["symlinks", "-d", "TestFiles", "-D"], vec![], vec![], vec!["Symlinks/EmptyFiles"]);
89+
}
90+
fn test_temporary_files() {
91+
info!("test_temporary_files");
92+
run_test(&["temp", "-d", "TestFiles", "-D"], vec!["Temporary/Boczze.cache"], vec![], vec![]);
93+
}
94+
fn test_empty_folders() {
95+
info!("test_empty_folders");
96+
run_test(
97+
&["empty-folders", "-d", "TestFiles", "-D"],
98+
vec![],
99+
vec!["EmptyFolders/One", "EmptyFolders/Two", "EmptyFolders/Two/TwoInside"],
100+
vec![],
101+
);
102+
}
103+
104+
fn test_biggest_files() {
105+
info!("test_biggest_files");
106+
run_test(
107+
&["big", "-d", "TestFiles", "-n", "6", "-D"],
108+
vec!["Music/M3.flac", "Music/M4.mp3", "Videos/V2.mp4", "Videos/V3.webm", "Videos/V1.mp4", "Videos/V5.mp4"],
109+
vec![],
110+
vec![],
111+
);
112+
}
113+
114+
fn test_smallest_files() {
115+
info!("test_smallest_files");
116+
run_test(
117+
&["big", "-d", "TestFiles", "-J", "-n", "5", "-D"],
118+
vec!["Broken/Br.jpg", "Broken/Br.mp3", "Broken/Br.pdf", "Broken/Br.zip", "EmptyFolders/ThreeButNot/KEKEKE"],
119+
vec![],
120+
vec![],
121+
);
122+
}
123+
124+
fn test_empty_files() {
125+
info!("test_empty_files");
126+
run_test(&["empty-files", "-d", "TestFiles", "-D"], vec!["EmptyFile"], vec![], vec![]);
127+
}
128+
129+
////////////////////////////////////
130+
////////////////////////////////////
131+
/////////HELPER FUNCTIONS///////////
132+
////////////////////////////////////
133+
////////////////////////////////////
134+
135+
fn run_test(arguments: &[&str], expected_files_differences: Vec<&'static str>, expected_folders_differences: Vec<&'static str>, expected_symlinks_differences: Vec<&'static str>) {
136+
unzip_files();
137+
// Add path_to_czkawka to arguments
138+
let mut all_arguments = vec![];
139+
all_arguments.push(CZKAWKA_PATH.get().as_str());
140+
all_arguments.extend_from_slice(arguments);
141+
run_with_good_status(&all_arguments, true);
142+
file_folder_diffs(
143+
COLLECTED_FILES.get(),
144+
expected_files_differences,
145+
expected_folders_differences,
146+
expected_symlinks_differences,
147+
);
148+
149+
remove_test_dir();
150+
}
151+
fn unzip_files() {
152+
run_with_good_status(&["unzip", "-X", "TestFiles.zip", "-d", "TestFiles"], false);
153+
}
154+
fn remove_test_dir() {
155+
let _ = fs::remove_dir_all("TestFiles");
156+
}
157+
158+
fn run_with_good_status(str_command: &[&str], print_messages: bool) {
159+
let mut command = Command::new(str_command[0]);
160+
let mut com = command.args(&str_command[1..]);
161+
if !print_messages {
162+
com = com.stderr(Stdio::piped()).stdout(Stdio::piped());
163+
}
164+
let status = com.spawn().expect("failed to execute process").wait().unwrap();
165+
assert!(status.success());
166+
}
167+
168+
fn file_folder_diffs(
169+
all_files: &CollectedFiles,
170+
mut expected_files_differences: Vec<&'static str>,
171+
mut expected_folders_differences: Vec<&'static str>,
172+
mut expected_symlinks_differences: Vec<&'static str>,
173+
) {
174+
let current_files = collect_all_files_and_dirs("TestFiles").unwrap();
175+
let mut diff_files = all_files
176+
.files
177+
.difference(&current_files.files)
178+
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
179+
.collect::<Vec<_>>();
180+
let mut diff_folders = all_files
181+
.folders
182+
.difference(&current_files.folders)
183+
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
184+
.collect::<Vec<_>>();
185+
let mut diff_symlinks = all_files
186+
.symlinks
187+
.difference(&current_files.symlinks)
188+
.map(|e| e.strip_prefix("TestFiles/").unwrap().to_string())
189+
.collect::<Vec<_>>();
190+
191+
expected_symlinks_differences.sort();
192+
expected_folders_differences.sort();
193+
expected_files_differences.sort();
194+
195+
diff_files.sort();
196+
diff_folders.sort();
197+
diff_symlinks.sort();
198+
199+
assert_eq!(diff_files, expected_files_differences);
200+
assert_eq!(diff_folders, expected_folders_differences);
201+
assert_eq!(diff_symlinks, expected_symlinks_differences);
202+
}
203+
204+
fn collect_all_files_and_dirs(dir: &str) -> std::io::Result<CollectedFiles> {
205+
let mut files = BTreeSet::new();
206+
let mut folders = BTreeSet::new();
207+
let mut symlinks = BTreeSet::new();
208+
209+
let mut folders_to_check = vec![dir.to_string()];
210+
while !folders_to_check.is_empty() {
211+
let folder = folders_to_check.pop().unwrap();
212+
let rd = fs::read_dir(folder)?;
213+
for entry in rd {
214+
let entry = entry?;
215+
let path = entry.path();
216+
217+
if path.is_dir() {
218+
folders.insert(path.display().to_string());
219+
folders_to_check.push(path.display().to_string());
220+
} else if path.is_symlink() {
221+
symlinks.insert(path.display().to_string());
222+
} else if path.is_file() {
223+
files.insert(path.display().to_string());
224+
} else {
225+
panic!("Unknown type of file {:?}", path);
226+
}
227+
}
228+
}
229+
230+
folders.remove(dir);
231+
// println!("Found {} files, {} folders and {} symlinks", files.len(), folders.len(), symlinks.len());
232+
Ok(CollectedFiles { files, folders, symlinks })
233+
}

0 commit comments

Comments
 (0)