/* Test of condition variables in multithreaded situations.
Copyright (C) 2008-2024 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see . */
#include
#include
#include
#include
#include
#include
#define uncompressed_body "x"
#define GZIP "\x1f\x8b\x08\x08\x48\x5d\x91\x5a\x00\x03\x78\x00\xab\x00\x00\x83\x16\xdc\x8c\x01\x00\x00\x00" // gzip
#define DEFLATE "\x78\x9c\xab\x00\x00\x00\x79\x00\x79" // deflate
#define BZIP2 "\x42\x5a\x68\x39\x31\x41\x59\x26\x53\x59\x77\x4b\xb0\x14\x00\x00\x00\x00\x80\x00\x40\x20\x00\x21\x18\x46\x82\xee\x48\xa7\x0a\x12\x0e\xe9\x76\x02\x80" // bzip2
#define XZ "\xfd\x37\x7a\x58\x5a\x00\x00\x04\xe6\xd6\xb4\x46\x02\x00\x21\x01\x16\x00\x00\x00\x74\x2f\xe5\xa3\x01\x00\x00\x78\x00\x00\x00\x00\x45\xae\xef\x83\xf8\xee\x16\x0a\x00\x01\x19\x01\xa5\x2c\x81\xcc\x1f\xb6\xf3\x7d\x01\x00\x00\x00\x00\x04\x59\x5a" // xz
#define LZMA "\x5d\x00\x00\x80\x00\xff\xff\xff\xff\xff\xff\xff\xff\x00\x3c\x41\xfb\xff\xff\xff\xe0\x00\x00\x00" // lzma
#define BR "\x21\x00\x00\x04\x78\x03" // br
#define ZSTD "\x28\xb5\x2f\xfd\x24\x01\x09\x00\x00\x78\x23\x11\x04\x83"
#define LZIP "\x4c\x5a\x49\x50\x01\x0c\x00\x3c\x41\xfb\xff\xff\xff\xe0\x00\x00\x00\x83\x16\xdc\x8c\x01\x00\x00\x00\x00\x00\x00\x00\x25\x00\x00\x00\x00\x00\x00\x00"
#define countof(a) (sizeof(a)/sizeof(*(a)))
static int
ok,
failed;
static void check(int result, int line, const char *msg)
{
if (result) {
ok++;
} else {
failed++;
wget_info_printf("L%d: %s\n", line, msg);
}
}
#define CHECK(e) check(!!(e), __LINE__, #e)
static const struct compression_test_data {
const char *body;
size_t body_len;
const char *type;
} test_data[] = {
#ifdef WITH_ZLIB
{ GZIP, sizeof(GZIP) - 1, "gzip" },
{ DEFLATE, sizeof(DEFLATE) - 1, "deflate" },
#endif
#ifdef WITH_BZIP2
{ BZIP2, sizeof(BZIP2) - 1, "bzip2" },
#endif
#ifdef WITH_LZMA
{ XZ, sizeof(XZ) - 1, "xz" },
{ LZMA, sizeof(LZMA) - 1, "lzma" },
#endif
#ifdef WITH_BROTLIDEC
{ BR, sizeof(BR) - 1, "br" },
#endif
#ifdef WITH_ZSTD
{ ZSTD, sizeof(ZSTD) - 1, "zstd" },
#endif
#ifdef WITH_LZIP
{ LZIP, sizeof(LZIP) - 1, "lzip" },
#endif
{ uncompressed_body, sizeof(uncompressed_body) - 1, "identity" },
};
static int get_decompressed(void *userdata, const char *data, size_t length)
{
wget_buffer_memcat((wget_buffer *)userdata, data, length);
return 0;
}
#include "../libwget/private.h"
int main(WGET_GCC_UNUSED int argc, const char **argv)
{
// if VALGRIND testing is enabled, we have to call ourselves with valgrind checking
const char *valgrind = getenv("VALGRIND_TESTS");
if (!valgrind || !*valgrind || !strcmp(valgrind, "0")) {
// fallthrough
}
else if (!strcmp(valgrind, "1")) {
char cmd[4096];
wget_snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS=\"\" valgrind --error-exitcode=301 --leak-check=yes --show-reachable=yes --track-origins=yes %s", argv[0]);
return system(cmd) != 0;
} else {
char cmd[4096];
wget_snprintf(cmd, sizeof(cmd), "VALGRIND_TESTS="" %s %s", valgrind, argv[0]);
return system(cmd) != 0;
}
wget_logger_set_stream(wget_get_logger(WGET_LOGGER_INFO), stderr);
wget_logger_set_stream(wget_get_logger(WGET_LOGGER_DEBUG), stderr);
wget_logger_set_stream(wget_get_logger(WGET_LOGGER_ERROR), stderr);
wget_buffer plain;
wget_decompressor *dc = NULL;
wget_buffer_init(&plain, NULL, sizeof(uncompressed_body) - 1);
for (unsigned it = 0; it < countof(test_data); it++) {
const struct compression_test_data *t = &test_data[it];
wget_buffer_reset(&plain);
wget_content_encoding content_encoding = wget_content_encoding_by_name(t->type);
CHECK((dc = wget_decompress_open(content_encoding, get_decompressed, &plain)));
if (dc) {
wget_decompress(dc, t->body, t->body_len);
wget_decompress_close(dc);
wget_info_printf("%s %zu %zu\n", t->type, plain.length, sizeof(uncompressed_body) - 1);
CHECK(plain.length == sizeof(uncompressed_body) - 1);
CHECK(memcmp(plain.data, uncompressed_body, sizeof(uncompressed_body) - 1) == 0);
}
}
wget_buffer_deinit(&plain);
if (failed) {
wget_info_printf("Summary: %d out of %d tests failed\n", failed, ok + failed);
return 1;
}
wget_info_printf("Summary: All %d tests passed\n", ok + failed);
return 0;
}