this repo has no description
1use assert_cmd::prelude::*;
2use assert_fs::prelude::*;
3use predicates::prelude::*;
4use std::process::Command;
5
6mod common;
7use common::*;
8
9mod list {
10 use super::*;
11
12 /// `cmprss --list archive.tar` prints every entry's path, one per line.
13 #[test]
14 fn tar_archive() -> Result<(), Box<dyn std::error::Error>> {
15 let working_dir = create_working_dir()?;
16 let a = working_dir.child("alpha.txt");
17 a.write_str("alpha")?;
18 let b = working_dir.child("beta.txt");
19 b.write_str("beta")?;
20
21 let mut pack = Command::cargo_bin("cmprss")?;
22 pack.current_dir(&working_dir)
23 .args(["tar", "alpha.txt", "beta.txt", "out.tar"]);
24 pack.assert().success();
25
26 let mut list = Command::cargo_bin("cmprss")?;
27 list.current_dir(&working_dir).args(["--list", "out.tar"]);
28 list.assert()
29 .success()
30 .stdout(predicate::str::contains("alpha.txt"))
31 .stdout(predicate::str::contains("beta.txt"));
32 Ok(())
33 }
34
35 /// `cmprss --list archive.zip` enumerates file names via ZipArchive.
36 #[test]
37 fn zip_archive() -> Result<(), Box<dyn std::error::Error>> {
38 let working_dir = create_working_dir()?;
39 let a = working_dir.child("first.txt");
40 a.write_str("first")?;
41 let b = working_dir.child("second.txt");
42 b.write_str("second")?;
43
44 let mut pack = Command::cargo_bin("cmprss")?;
45 pack.current_dir(&working_dir)
46 .args(["zip", "first.txt", "second.txt", "out.zip"]);
47 pack.assert().success();
48
49 let mut list = Command::cargo_bin("cmprss")?;
50 list.current_dir(&working_dir).args(["--list", "out.zip"]);
51 list.assert()
52 .success()
53 .stdout(predicate::str::contains("first.txt"))
54 .stdout(predicate::str::contains("second.txt"));
55 Ok(())
56 }
57
58 /// Pipelines whose innermost layer is a container format list through
59 /// the in-memory pipe plumbing shared with extract.
60 #[test]
61 fn tar_gz_archive() -> Result<(), Box<dyn std::error::Error>> {
62 let working_dir = create_working_dir()?;
63 let a = working_dir.child("inside.txt");
64 a.write_str("inside")?;
65
66 let mut pack = Command::cargo_bin("cmprss")?;
67 pack.current_dir(&working_dir)
68 .args(["tar", "inside.txt", "out.tar"]);
69 pack.assert().success();
70
71 let mut gz = Command::cargo_bin("cmprss")?;
72 gz.current_dir(&working_dir)
73 .args(["gzip", "out.tar", "out.tar.gz"]);
74 gz.assert().success();
75
76 let mut list = Command::cargo_bin("cmprss")?;
77 list.current_dir(&working_dir)
78 .args(["--list", "out.tar.gz"]);
79 list.assert()
80 .success()
81 .stdout(predicate::str::contains("inside.txt"));
82 Ok(())
83 }
84
85 /// Stream codecs (gzip, xz, …) don't carry multiple entries — listing
86 /// must fail loudly rather than silently doing nothing.
87 #[test]
88 fn gzip_stream_rejects_list() -> Result<(), Box<dyn std::error::Error>> {
89 let working_dir = create_working_dir()?;
90 let a = working_dir.child("doc.txt");
91 a.write_str("doc")?;
92
93 let mut pack = Command::cargo_bin("cmprss")?;
94 pack.current_dir(&working_dir)
95 .args(["gzip", "doc.txt", "doc.txt.gz"]);
96 pack.assert().success();
97
98 let mut list = Command::cargo_bin("cmprss")?;
99 list.current_dir(&working_dir)
100 .args(["--list", "doc.txt.gz"]);
101 list.assert()
102 .failure()
103 .stderr(predicate::str::contains("cannot be listed"));
104 Ok(())
105 }
106}