@@ -14,7 +14,11 @@ if [[ -z "$MCPP_BIN" || ! -x "$MCPP_BIN" ]]; then
1414fi
1515
1616TMP=" $( mktemp -d) "
17- trap ' rm -rf "$TMP"' EXIT
17+ if [[ " ${MCPP_INDEX_KEEP_SMOKE_TMP:- 0} " == " 1" ]]; then
18+ echo " KEEP: $TMP "
19+ else
20+ trap ' rm -rf "$TMP"' EXIT
21+ fi
1822SMOKE_CACHE_DIR=" ${MCPP_INDEX_SMOKE_CACHE_DIR:- } "
1923SMOKE_XPKGS_DIR=" ${MCPP_INDEX_SMOKE_XPKGS_DIR:- } "
2024
@@ -102,6 +106,153 @@ int main() {
102106}
103107EOF
104108
109+ " $MCPP_BIN " build
110+ " $MCPP_BIN " run
111+
112+ mkdir -p " $TMP /compat-compression-standalone-smoke/src"
113+ cd " $TMP /compat-compression-standalone-smoke"
114+ cat > mcpp.toml << EOF
115+ [package]
116+ name = "compat-compression-standalone-smoke"
117+ version = "0.1.0"
118+
119+ [toolchain]
120+ default = "gcc@16.1.0"
121+
122+ [indices]
123+ compat = { path = "$ROOT " }
124+
125+ [dependencies.compat]
126+ zlib = "1.3.2"
127+ bzip2 = "1.0.8"
128+ lz4 = "1.10.0"
129+ xz = "5.8.3"
130+ zstd = "1.5.7"
131+
132+ [targets.compat-compression-standalone-smoke]
133+ kind = "bin"
134+ main = "src/main.cpp"
135+ EOF
136+
137+ if [[ -n " $SMOKE_CACHE_DIR " && -d " $SMOKE_CACHE_DIR " ]]; then
138+ mkdir -p .mcpp/.xlings/data/runtimedir
139+ find " $SMOKE_CACHE_DIR " -maxdepth 1 -type f \
140+ \( -name ' *.tar.gz' -o -name ' *.tar.xz' -o -name ' *.zip' \) \
141+ -exec cp -f {} .mcpp/.xlings/data/runtimedir/ \;
142+ fi
143+
144+ cat > src/main.cpp << 'EOF '
145+ #include <bzlib.h>
146+ #include <lz4.h>
147+ #include <lzma.h>
148+ #include <zlib.h>
149+ #include <zstd.h>
150+
151+ #include <cstdint>
152+ #include <cstring>
153+ #include <limits>
154+ #include <vector>
155+
156+ static bool same_bytes(const void* actual, size_t actual_size,
157+ const void* expected, size_t expected_size) {
158+ return actual_size == expected_size &&
159+ std::memcmp(actual, expected, expected_size) == 0;
160+ }
161+
162+ int main() {
163+ const uint8_t input[] = "mcpp compat compression smoke";
164+ const size_t input_size = sizeof(input) - 1;
165+
166+ uint8_t zlib_compressed[256] = {};
167+ uLongf zlib_compressed_size = sizeof(zlib_compressed);
168+ if (compress2(zlib_compressed, &zlib_compressed_size, input,
169+ static_cast<uLong>(input_size), Z_BEST_SPEED) != Z_OK) {
170+ return 1;
171+ }
172+ uint8_t zlib_output[sizeof(input)] = {};
173+ uLongf zlib_output_size = input_size;
174+ if (uncompress(zlib_output, &zlib_output_size, zlib_compressed,
175+ zlib_compressed_size) != Z_OK ||
176+ !same_bytes(zlib_output, zlib_output_size, input, input_size)) {
177+ return 2;
178+ }
179+
180+ char bzip2_compressed[256] = {};
181+ unsigned int bzip2_compressed_size = sizeof(bzip2_compressed);
182+ if (BZ2_bzBuffToBuffCompress(
183+ bzip2_compressed, &bzip2_compressed_size,
184+ const_cast<char*>(reinterpret_cast<const char*>(input)),
185+ static_cast<unsigned int>(input_size), 1, 0, 30) != BZ_OK) {
186+ return 3;
187+ }
188+ char bzip2_output[sizeof(input)] = {};
189+ unsigned int bzip2_output_size = input_size;
190+ if (BZ2_bzBuffToBuffDecompress(bzip2_output, &bzip2_output_size,
191+ bzip2_compressed, bzip2_compressed_size,
192+ 0, 0) != BZ_OK ||
193+ !same_bytes(bzip2_output, bzip2_output_size, input, input_size)) {
194+ return 4;
195+ }
196+
197+ char lz4_compressed[256] = {};
198+ const int lz4_compressed_size =
199+ LZ4_compress_default(reinterpret_cast<const char*>(input),
200+ lz4_compressed, static_cast<int>(input_size),
201+ sizeof(lz4_compressed));
202+ if (lz4_compressed_size <= 0) {
203+ return 5;
204+ }
205+ char lz4_output[sizeof(input)] = {};
206+ const int lz4_output_size =
207+ LZ4_decompress_safe(lz4_compressed, lz4_output, lz4_compressed_size,
208+ sizeof(lz4_output));
209+ if (lz4_output_size < 0 ||
210+ !same_bytes(lz4_output, static_cast<size_t>(lz4_output_size), input,
211+ input_size)) {
212+ return 6;
213+ }
214+
215+ std::vector<char> zstd_compressed(ZSTD_compressBound(input_size));
216+ const size_t zstd_compressed_size =
217+ ZSTD_compress(zstd_compressed.data(), zstd_compressed.size(), input,
218+ input_size, 1);
219+ if (ZSTD_isError(zstd_compressed_size)) {
220+ return 7;
221+ }
222+ std::vector<char> zstd_output(input_size);
223+ const size_t zstd_output_size =
224+ ZSTD_decompress(zstd_output.data(), zstd_output.size(),
225+ zstd_compressed.data(), zstd_compressed_size);
226+ if (ZSTD_isError(zstd_output_size) ||
227+ !same_bytes(zstd_output.data(), zstd_output_size, input, input_size)) {
228+ return 8;
229+ }
230+
231+ std::vector<uint8_t> xz_compressed(lzma_stream_buffer_bound(input_size));
232+ size_t xz_compressed_pos = 0;
233+ if (lzma_easy_buffer_encode(0, LZMA_CHECK_CRC64, nullptr, input,
234+ input_size, xz_compressed.data(),
235+ &xz_compressed_pos,
236+ xz_compressed.size()) != LZMA_OK) {
237+ return 9;
238+ }
239+ uint64_t xz_memlimit = std::numeric_limits<uint64_t>::max();
240+ size_t xz_input_pos = 0;
241+ size_t xz_output_pos = 0;
242+ std::vector<uint8_t> xz_output(input_size);
243+ if (lzma_stream_buffer_decode(&xz_memlimit, 0, nullptr,
244+ xz_compressed.data(), &xz_input_pos,
245+ xz_compressed_pos, xz_output.data(),
246+ &xz_output_pos, xz_output.size()) !=
247+ LZMA_OK ||
248+ !same_bytes(xz_output.data(), xz_output_pos, input, input_size)) {
249+ return 10;
250+ }
251+
252+ return 0;
253+ }
254+ EOF
255+
105256" $MCPP_BIN " build
106257" $MCPP_BIN " run
107258echo " OK"
0 commit comments