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
9/// `cmprss tar --append` grows an existing tar archive with new entries and
10/// the resulting archive extracts both original and appended files.
11#[test]
12fn tar_append_adds_entry() -> Result<(), Box<dyn std::error::Error>> {
13 let original = create_test_file("original.txt", "original contents")?;
14 let extra = create_test_file("extra.txt", "appended contents")?;
15 let working_dir = create_working_dir()?;
16 let archive = working_dir.child("archive.tar");
17
18 Command::cargo_bin("cmprss")?
19 .arg("tar")
20 .arg(original.path())
21 .arg(archive.path())
22 .assert()
23 .success();
24 archive.assert(predicate::path::is_file());
25
26 Command::cargo_bin("cmprss")?
27 .arg("tar")
28 .arg("--append")
29 .arg(extra.path())
30 .arg(archive.path())
31 .assert()
32 .success();
33
34 Command::cargo_bin("cmprss")?
35 .arg("tar")
36 .arg("--extract")
37 .arg(archive.path())
38 .arg(working_dir.path())
39 .assert()
40 .success();
41
42 assert_files_equal(original.path(), &working_dir.child("original.txt"));
43 assert_files_equal(extra.path(), &working_dir.child("extra.txt"));
44 Ok(())
45}
46
47/// `cmprss zip --append` grows an existing zip archive with new entries.
48#[test]
49fn zip_append_adds_entry() -> Result<(), Box<dyn std::error::Error>> {
50 let original = create_test_file("original.txt", "original contents")?;
51 let extra = create_test_file("extra.txt", "appended contents")?;
52 let working_dir = create_working_dir()?;
53 let archive = working_dir.child("archive.zip");
54
55 Command::cargo_bin("cmprss")?
56 .arg("zip")
57 .arg(original.path())
58 .arg(archive.path())
59 .assert()
60 .success();
61 archive.assert(predicate::path::is_file());
62
63 Command::cargo_bin("cmprss")?
64 .arg("zip")
65 .arg("--append")
66 .arg(extra.path())
67 .arg(archive.path())
68 .assert()
69 .success();
70
71 Command::cargo_bin("cmprss")?
72 .arg("zip")
73 .arg("--extract")
74 .arg(archive.path())
75 .arg(working_dir.path())
76 .assert()
77 .success();
78
79 assert_files_equal(original.path(), &working_dir.child("original.txt"));
80 assert_files_equal(extra.path(), &working_dir.child("extra.txt"));
81 Ok(())
82}
83
84/// Appending to a stream codec (e.g. gzip) must fail cleanly — there's no
85/// notion of "entries" in a stream format.
86#[test]
87fn gzip_append_fails() -> Result<(), Box<dyn std::error::Error>> {
88 let working_dir = create_working_dir()?;
89 let archive = working_dir.child("data.gz");
90 let input = create_test_file("data.txt", "hello")?;
91
92 // Create a valid .gz to append to.
93 Command::cargo_bin("cmprss")?
94 .arg("gzip")
95 .arg(input.path())
96 .arg(archive.path())
97 .assert()
98 .success();
99
100 let extra = create_test_file("extra.txt", "more")?;
101 Command::cargo_bin("cmprss")?
102 .arg("gzip")
103 .arg("--append")
104 .arg(extra.path())
105 .arg(archive.path())
106 .assert()
107 .failure()
108 .stderr(predicate::str::contains("do not support --append"));
109 Ok(())
110}
111
112/// Appending to a compound pipeline like `tar.gz` must fail — it would
113/// require decompressing and recompressing the whole archive.
114#[test]
115fn tar_gz_append_fails() -> Result<(), Box<dyn std::error::Error>> {
116 let working_dir = create_working_dir()?;
117 let archive = working_dir.child("archive.tar.gz");
118 let input = create_test_file("data.txt", "hello")?;
119
120 Command::cargo_bin("cmprss")?
121 .arg("tar.gz")
122 .arg(input.path())
123 .arg(archive.path())
124 .assert()
125 .success();
126
127 let extra = create_test_file("extra.txt", "more")?;
128 Command::cargo_bin("cmprss")?
129 .arg("tar.gz")
130 .arg("--append")
131 .arg(extra.path())
132 .arg(archive.path())
133 .assert()
134 .failure()
135 .stderr(predicate::str::contains("compound archive"));
136 Ok(())
137}
138
139/// `--append` with a non-existent target must error rather than create a new
140/// archive.
141#[test]
142fn tar_append_missing_target_errors() -> Result<(), Box<dyn std::error::Error>> {
143 let working_dir = create_working_dir()?;
144 let missing = working_dir.child("missing.tar");
145 let extra = create_test_file("extra.txt", "x")?;
146
147 // Non-existent trailing path is normally treated as the output to create;
148 // --append should reject it instead.
149 Command::cargo_bin("cmprss")?
150 .arg("tar")
151 .arg("--append")
152 .arg(extra.path())
153 .arg(missing.path())
154 .assert()
155 .failure();
156 Ok(())
157}