chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* test_zstd.c — Tests for zstd compression wrappers.
|
||||
*/
|
||||
#include "test_framework.h"
|
||||
|
||||
extern int cbm_zstd_compress(const char *src, int srcLen, char *dst, int dstCap, int level);
|
||||
extern int cbm_zstd_decompress(const char *src, int srcLen, char *dst, int dstCap);
|
||||
extern size_t cbm_zstd_compress_bound(int inputSize);
|
||||
|
||||
TEST(zstd_roundtrip) {
|
||||
const char *data = "Hello, zstd compression roundtrip test!";
|
||||
int len = (int)strlen(data);
|
||||
|
||||
size_t bound = cbm_zstd_compress_bound(len);
|
||||
ASSERT_GT((int)bound, 0);
|
||||
|
||||
char *cbuf = malloc(bound);
|
||||
ASSERT_NOT_NULL(cbuf);
|
||||
|
||||
int clen = cbm_zstd_compress(data, len, cbuf, (int)bound, 3);
|
||||
ASSERT_GT(clen, 0);
|
||||
|
||||
char *dbuf = malloc(len);
|
||||
ASSERT_NOT_NULL(dbuf);
|
||||
|
||||
int dlen = cbm_zstd_decompress(cbuf, clen, dbuf, len);
|
||||
ASSERT_EQ(dlen, len);
|
||||
ASSERT_MEM_EQ(dbuf, data, len);
|
||||
|
||||
free(cbuf);
|
||||
free(dbuf);
|
||||
PASS();
|
||||
}
|
||||
|
||||
TEST(zstd_roundtrip_large) {
|
||||
int len = 100000;
|
||||
char *data = malloc(len);
|
||||
ASSERT_NOT_NULL(data);
|
||||
|
||||
/* Repetitive data — should compress well */
|
||||
for (int i = 0; i < len; i++) {
|
||||
data[i] = "function_name_pattern_abcdef"[i % 28];
|
||||
}
|
||||
|
||||
size_t bound = cbm_zstd_compress_bound(len);
|
||||
char *cbuf = malloc(bound);
|
||||
ASSERT_NOT_NULL(cbuf);
|
||||
|
||||
int clen = cbm_zstd_compress(data, len, cbuf, (int)bound, 9);
|
||||
ASSERT_GT(clen, 0);
|
||||
/* Repetitive data should compress at least 2:1 */
|
||||
ASSERT_LT(clen, len / 2);
|
||||
|
||||
char *dbuf = malloc(len);
|
||||
ASSERT_NOT_NULL(dbuf);
|
||||
|
||||
int dlen = cbm_zstd_decompress(cbuf, clen, dbuf, len);
|
||||
ASSERT_EQ(dlen, len);
|
||||
ASSERT_MEM_EQ(dbuf, data, len);
|
||||
|
||||
free(data);
|
||||
free(cbuf);
|
||||
free(dbuf);
|
||||
PASS();
|
||||
}
|
||||
|
||||
TEST(zstd_compress_levels) {
|
||||
const char *data = "test data for different compression levels";
|
||||
int len = (int)strlen(data);
|
||||
size_t bound = cbm_zstd_compress_bound(len);
|
||||
char *cbuf = malloc(bound);
|
||||
ASSERT_NOT_NULL(cbuf);
|
||||
|
||||
/* Both level 3 (fast) and level 9 (best) should produce valid output */
|
||||
int clen3 = cbm_zstd_compress(data, len, cbuf, (int)bound, 3);
|
||||
ASSERT_GT(clen3, 0);
|
||||
|
||||
int clen9 = cbm_zstd_compress(data, len, cbuf, (int)bound, 9);
|
||||
ASSERT_GT(clen9, 0);
|
||||
|
||||
free(cbuf);
|
||||
PASS();
|
||||
}
|
||||
|
||||
TEST(zstd_decompress_too_small_output) {
|
||||
const char *data = "this is test data that will be compressed";
|
||||
int len = (int)strlen(data);
|
||||
size_t bound = cbm_zstd_compress_bound(len);
|
||||
char *cbuf = malloc(bound);
|
||||
ASSERT_NOT_NULL(cbuf);
|
||||
|
||||
int clen = cbm_zstd_compress(data, len, cbuf, (int)bound, 3);
|
||||
ASSERT_GT(clen, 0);
|
||||
|
||||
/* Try decompressing with too-small output buffer — should return 0 (error) */
|
||||
char small[4];
|
||||
int dlen = cbm_zstd_decompress(cbuf, clen, small, 4);
|
||||
ASSERT_EQ(dlen, 0);
|
||||
|
||||
free(cbuf);
|
||||
PASS();
|
||||
}
|
||||
|
||||
TEST(zstd_bound_positive) {
|
||||
ASSERT_GT((int)cbm_zstd_compress_bound(1), 0);
|
||||
ASSERT_GT((int)cbm_zstd_compress_bound(100), 0);
|
||||
ASSERT_GT((int)cbm_zstd_compress_bound(1000000), 0);
|
||||
PASS();
|
||||
}
|
||||
|
||||
SUITE(zstd) {
|
||||
RUN_TEST(zstd_roundtrip);
|
||||
RUN_TEST(zstd_roundtrip_large);
|
||||
RUN_TEST(zstd_compress_levels);
|
||||
RUN_TEST(zstd_decompress_too_small_output);
|
||||
RUN_TEST(zstd_bound_positive);
|
||||
}
|
||||
Reference in New Issue
Block a user