You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.1 KiB
C
141 lines
3.1 KiB
C
#include "test.h"
|
|
|
|
#include "trie.h"
|
|
|
|
#include <sys/stat.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#define TEST_DB "/tmp/ffdb-test"
|
|
|
|
static bool test_result( bool result, const char* test_name )
|
|
{
|
|
if( result ) {
|
|
printf( "[ PASS ] %s\n", test_name );
|
|
} else {
|
|
printf( "[ FAIL ] %s\n", test_name );
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#define TEST( cond ) if( ((cond)) ) { printf( "\t[TEST] %s passed\n", #cond ); } else { printf( "\t[TEST] %s failed at " __FILE__ ":%d\n", #cond, __LINE__ ); result &= false; }
|
|
|
|
static void reset()
|
|
{
|
|
system( "rm -Rf " TEST_DB );
|
|
mkdir( TEST_DB, 0755 );
|
|
};
|
|
|
|
static bool test_1_simple_set()
|
|
{
|
|
bool result = true;
|
|
|
|
reset();
|
|
result &= ffdb_trie_set( TEST_DB, "https://example.com/actor", "T" );
|
|
result &= ffdb_trie_set( TEST_DB, "https://apogee.polaris-1.work/owner/actor", "T" );
|
|
|
|
return test_result( result, "ffdb test 1: simple set" );
|
|
}
|
|
|
|
static bool test_2_check_overwrite()
|
|
{
|
|
bool result = true;
|
|
|
|
reset();
|
|
|
|
TEST( ffdb_trie_set( TEST_DB, "633", "T" ) );
|
|
TEST( ffdb_trie_set( TEST_DB, "632", "T" ) );
|
|
TEST( ffdb_trie_set( TEST_DB, "633", "T" ) );
|
|
|
|
char* value;
|
|
TEST( value = ffdb_trie_get( TEST_DB, "633" ) );
|
|
TEST( 0 == strcmp(value,"T") );
|
|
free(value);
|
|
|
|
return test_result( result, "ffdb test 2: overwrite test" );
|
|
}
|
|
|
|
static bool test_3_consolidation_on_get()
|
|
{
|
|
reset();
|
|
bool result = true;
|
|
|
|
FILE* f = fopen(TEST_DB "/%ROOT|", "w");
|
|
fprintf(f,"{\"1\":2}\n");
|
|
fclose(f);
|
|
|
|
f = fopen( TEST_DB "/%ROOT|1", "w" );
|
|
fprintf(f,"{\"1\":\"T\",\"2\":\"F\"}\n");
|
|
fclose(f);
|
|
|
|
char* value = ffdb_trie_get( TEST_DB, "11" );
|
|
TEST( 0 == strcmp(value,"T") );
|
|
free(value);
|
|
|
|
value = ffdb_trie_get( TEST_DB, "12" );
|
|
TEST( 0 == strcmp(value,"F") );
|
|
free(value);
|
|
|
|
struct stat s = {0};
|
|
TEST( 0 != stat( TEST_DB "/%ROOT|1", &s ) );
|
|
TEST( 0 == stat( TEST_DB "/%ROOT|", &s ) );
|
|
|
|
return test_result( result, "ffdb test 3: consolidation on get" );
|
|
}
|
|
|
|
bool test_4_apogee_stub_corruption()
|
|
{
|
|
reset();
|
|
bool result = true;
|
|
|
|
TEST( ffdb_trie_set( TEST_DB, "992", "T" ) );
|
|
for( int i = 0; i < 3; ++i ) {
|
|
TEST( ffdb_trie_set( TEST_DB, "992", NULL ) );
|
|
}
|
|
TEST( ffdb_trie_set( TEST_DB, "993", NULL ) );
|
|
TEST( ffdb_trie_set( TEST_DB, "994", NULL ) );
|
|
TEST( ffdb_trie_set( TEST_DB, "995", "T" ) );
|
|
for( int i = 0; i < 5; ++i ) {
|
|
TEST( ffdb_trie_set( TEST_DB, "995", NULL ) );
|
|
}
|
|
for( int i = 0; i < 2; ++i ) {
|
|
TEST( ffdb_trie_set( TEST_DB, "994", NULL ) );
|
|
}
|
|
for( int i = 0; i < 2; ++i ) {
|
|
TEST( ffdb_trie_set( TEST_DB, "996", "T" ) );
|
|
}
|
|
TEST( ffdb_trie_set( TEST_DB, "997", NULL ) );
|
|
TEST( ffdb_trie_set( TEST_DB, "998", "T" ) );
|
|
|
|
char* value;
|
|
TEST( !( value = ffdb_trie_get( TEST_DB, "9966" ) ) );
|
|
free(value);
|
|
|
|
TEST( ffdb_trie_set( TEST_DB, "998", NULL ) );
|
|
|
|
TEST( !( value = ffdb_trie_get( TEST_DB, "9966" ) ) );
|
|
free(value);
|
|
|
|
return test_result( result, "ffdb test 4: apogee stub corruption" );
|
|
}
|
|
|
|
bool ffdb_test()
|
|
{
|
|
return true
|
|
&& test_1_simple_set()
|
|
&& test_2_check_overwrite()
|
|
&& test_3_consolidation_on_get()
|
|
&& test_4_apogee_stub_corruption()
|
|
;
|
|
}
|
|
|
|
#ifdef STANDALONE_TEST
|
|
int main()
|
|
{
|
|
return ffdb_test() ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
#endif
|
|
|