test: add test_base64.c
This commit is contained in:
parent
4c730f50f8
commit
c244d425ca
|
@ -1,4 +1,4 @@
|
||||||
SUBDIRS = lib tools
|
SUBDIRS = lib tools tests
|
||||||
|
|
||||||
if BUILD_FUSE
|
if BUILD_FUSE
|
||||||
SUBDIRS += fuse
|
SUBDIRS += fuse
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
noinst_LIBRARIES = libstpdfs.a
|
noinst_LIBRARIES = libstpdfs.a
|
||||||
libstpdfs_a_SOURCES = block.c superblock.c codec/base64.c
|
libstpdfs_a_SOURCES = block.c superblock.c codec/base64.c compression/lzp.c
|
|
@ -11,7 +11,7 @@ base64_encode(char *dest, const char *src, size_t srclen)
|
||||||
uint8_t a, b, c;
|
uint8_t a, b, c;
|
||||||
uint32_t triple;
|
uint32_t triple;
|
||||||
|
|
||||||
encodedlen = 4 * ((srclen + 2) / 3) + 4;
|
encodedlen = 4 * ((srclen + 2) / 3);
|
||||||
|
|
||||||
if (dest == NULL)
|
if (dest == NULL)
|
||||||
{
|
{
|
||||||
|
@ -39,5 +39,6 @@ base64_encode(char *dest, const char *src, size_t srclen)
|
||||||
dest[encodedlen - 2] = '=';
|
dest[encodedlen - 2] = '=';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dest[encodedlen] = 0;
|
||||||
return (encodedlen);
|
return (encodedlen);
|
||||||
}
|
}
|
|
@ -1,35 +1,5 @@
|
||||||
/*
|
|
||||||
; hash(h, x) (h = (h << 4) ^ x)
|
|
||||||
|
|
||||||
section '.code' code
|
|
||||||
|
|
||||||
; xor hash, hash
|
|
||||||
; xor mask, mask
|
|
||||||
; j = 1
|
|
||||||
; while (insz > 0)
|
|
||||||
; {
|
|
||||||
; if (ecx == 8)
|
|
||||||
; {
|
|
||||||
; mov [out], mask
|
|
||||||
; xor ecx, ecx
|
|
||||||
; xor mask, mask
|
|
||||||
; j = 1;
|
|
||||||
; }
|
|
||||||
; c = in[inpos++]
|
|
||||||
; if (c == table[hash])
|
|
||||||
; {
|
|
||||||
; mask |= 1 << ecx
|
|
||||||
; }
|
|
||||||
; else
|
|
||||||
; {
|
|
||||||
; table[hash] = c
|
|
||||||
; out[j] = c;
|
|
||||||
; }
|
|
||||||
; HASH(hash, c)
|
|
||||||
; ecx++;
|
|
||||||
; }
|
|
||||||
*/
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#define LZP_HASH_ORDER 16
|
#define LZP_HASH_ORDER 16
|
||||||
#define LZP_HASH_SIZE (1 << LZP_HASH_ORDER)
|
#define LZP_HASH_SIZE (1 << LZP_HASH_ORDER)
|
||||||
|
@ -37,21 +7,110 @@
|
||||||
#define HASH(h, x) ((h << 4) ^ x)
|
#define HASH(h, x) ((h << 4) ^ x)
|
||||||
|
|
||||||
void
|
void
|
||||||
lzp_compress()
|
lzp_compress(uint8_t *out, size_t *outsz, const uint8_t *in, size_t insz)
|
||||||
{
|
{
|
||||||
uint32_t hash = 0;
|
uint8_t c;
|
||||||
|
uint16_t hash = 0;
|
||||||
uint32_t mask = 0;
|
uint32_t mask = 0;
|
||||||
char c;
|
|
||||||
uint8_t table[LZP_HASH_SIZE] = { 0 };
|
uint8_t table[LZP_HASH_SIZE] = { 0 };
|
||||||
|
size_t i, j;
|
||||||
|
size_t inpos;
|
||||||
|
size_t outpos;
|
||||||
|
uint8_t buff[9];
|
||||||
|
|
||||||
while (1)
|
inpos = 0;
|
||||||
|
outpos = 0;
|
||||||
|
while (inpos < insz)
|
||||||
{
|
{
|
||||||
hash = HASH(hash, c);
|
j = 1;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (inpos >= insz)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = in[inpos++];
|
||||||
|
|
||||||
|
if (table[hash] == c)
|
||||||
|
{
|
||||||
|
mask |= 1 << i;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
table[hash] = c;
|
||||||
|
buff[j++] = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
hash = HASH(hash, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i > 0)
|
||||||
|
{
|
||||||
|
buff[0] = mask;
|
||||||
|
if (out != NULL)
|
||||||
|
{
|
||||||
|
memcpy(out + outpos, buff, j);
|
||||||
|
}
|
||||||
|
outpos += j;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*outsz = outpos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
lzp_decompress()
|
lzp_decompress(uint8_t *out, size_t *outsz, const uint8_t *in, size_t insz)
|
||||||
{
|
{
|
||||||
|
uint8_t c;
|
||||||
|
uint16_t hash = 0;
|
||||||
|
uint32_t mask = 0;
|
||||||
|
uint8_t table[LZP_HASH_SIZE] = { 0 };
|
||||||
|
size_t i, j;
|
||||||
|
size_t inpos;
|
||||||
|
size_t outpos;
|
||||||
|
uint8_t buff[9];
|
||||||
|
|
||||||
|
inpos = 0;
|
||||||
|
outpos = 0;
|
||||||
|
while (inpos < insz)
|
||||||
|
{
|
||||||
|
j = 0;
|
||||||
|
if (inpos >= insz)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask = in[inpos++];
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if ((mask & (1 << i)) != 0)
|
||||||
|
{
|
||||||
|
c = table[hash];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (inpos >= insz)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
c = in[inpos++];
|
||||||
|
table[hash] = c;
|
||||||
|
}
|
||||||
|
buff[j++] = c;
|
||||||
|
hash = HASH(hash, c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j > 0)
|
||||||
|
{
|
||||||
|
if (out != NULL)
|
||||||
|
{
|
||||||
|
memcpy(out + outpos, buff, j);
|
||||||
|
}
|
||||||
|
outpos += j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*outsz = outpos;
|
||||||
}
|
}
|
0
lib/xchacha12.c
Normal file
0
lib/xchacha12.c
Normal file
10
tests/Makefile.am
Normal file
10
tests/Makefile.am
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
AM_CPPFLAGS = -I$(top_srcdir)/lib
|
||||||
|
|
||||||
|
TESTS = test_lzp test_base64
|
||||||
|
check_PROGRAMS = test_lzp test_base64
|
||||||
|
|
||||||
|
LDADD = -lcmocka ../lib/libstpdfs.a
|
||||||
|
|
||||||
|
test_lzp_SOURCES = test_lzp.c
|
||||||
|
|
||||||
|
test_base64_SOURCES = test_base64.c
|
57
tests/test_base64.c
Normal file
57
tests/test_base64.c
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <cmocka.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
const char *simple_enc = "SGkh";
|
||||||
|
const char *simple_dec = "Hi!";
|
||||||
|
|
||||||
|
const char *with_pad_enc = "bGlnaHQgdw==";
|
||||||
|
const char *with_pad_dec = "light w";
|
||||||
|
|
||||||
|
size_t base64_encode(char *dest, const char *src, size_t srclen);
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_encode(void **state)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char enc[14];
|
||||||
|
|
||||||
|
len = base64_encode(enc, simple_dec, strlen(simple_dec));
|
||||||
|
|
||||||
|
assert_int_equal(strlen(simple_enc), len);
|
||||||
|
assert_string_equal(simple_enc, enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_encode_with_padding(void **state)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
char enc[14];
|
||||||
|
|
||||||
|
len = base64_encode(enc, with_pad_dec, strlen(with_pad_dec));
|
||||||
|
|
||||||
|
assert_int_equal(strlen(with_pad_enc), len);
|
||||||
|
assert_string_equal(with_pad_enc, enc);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_decode(void **state)
|
||||||
|
{
|
||||||
|
(void)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
const struct CMUnitTest tests[] = {
|
||||||
|
cmocka_unit_test(test_encode),
|
||||||
|
cmocka_unit_test(test_encode_with_padding),
|
||||||
|
cmocka_unit_test(test_decode),
|
||||||
|
};
|
||||||
|
|
||||||
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
}
|
25
tests/test_lzp.c
Normal file
25
tests/test_lzp.c
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <setjmp.h>
|
||||||
|
#include <cmocka.h>
|
||||||
|
|
||||||
|
static const char *uncompress_data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
|
||||||
|
"abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc"
|
||||||
|
"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccabcabcabcabcabcabcabcabcabcabcabcabcabcabc";
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_lzp(void **state)
|
||||||
|
{
|
||||||
|
(void)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(void)
|
||||||
|
{
|
||||||
|
const struct CMUnitTest tests[] = {
|
||||||
|
cmocka_unit_test(test_lzp),
|
||||||
|
};
|
||||||
|
|
||||||
|
return cmocka_run_group_tests(tests, NULL, NULL);
|
||||||
|
}
|
Loading…
Reference in a new issue