Last active
October 8, 2019 00:58
-
-
Save RoboSparrow/dca42e54e51f5ee1e34fe36a13b3d876 to your computer and use it in GitHub Desktop.
surveysystem compare_session_line() tests
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CC=gcc | |
CFLAGS=-I. -Wall -pedantic -Werror -Wshadow -Wstrict-aliasing -Wstrict-overflow -g | |
all: main.o | |
$(CC) -o main main.o | |
.PHONY: clean | |
clean: | |
rm -f ./*.o ./main ./test_config |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include <time.h> | |
#include <assert.h> | |
void report_result(int res, char *session_line, char *comparison_line) { | |
switch (res) { | |
case 0: | |
fprintf(stderr, " \033[39m[\033[32mPASS\033[39m] (%d): \"%s\" == \"%s\"\n", res, session_line, comparison_line); | |
break; | |
case -1: | |
fprintf(stderr, " \033[39m[\033[31mMISMATCH\033[39m] (%d): \"%s\" != \"%s\"\n", res, session_line, comparison_line); | |
case -2: | |
fprintf(stderr, " \033[39m[\033[31mTOO SHORT\033[39m] (%d): \"%s\" != \"%s\"\n", res, session_line, comparison_line); | |
break; | |
case -3: | |
fprintf(stderr, " \033[39m[\033[31mTOO LONG\033[39m] (%d): \"%s\" != \"%s\"\n", res, session_line, comparison_line); | |
break; | |
case -4: | |
fprintf(stderr, " \033[39m[\033[31m<UTIME> INVALID\033[39m] (%d): \"%s\" != \"%s\"\n", res, session_line, comparison_line); | |
break; | |
default: | |
fprintf(stderr, " \033[39m[\033[31;1;5mUNKNOWN REUTURN CODE\033[39;0m] (%d): \"%s\" != \"%s\"\n", res, session_line, comparison_line); | |
} | |
} | |
/** | |
* Compares survey session line with a comparsion string | |
* - the number of delimitors (Note, this includes escaped delimiters in fields, i.e "\:") | |
* - string matches between delimitors | |
* - custom validation via <KEYWORDS> | |
* Note that this function is not very practical in terms of deserializing lines due to ignoring escaped delimiters | |
* | |
* Return values: | |
* 0: OK, columns match | |
* -1: text compare error | |
* -2: session line too short (column count) | |
* -3: session line too long (column count) | |
* -4: session field <UTIME> is invalid (must be within the past hour from now) | |
*/ | |
int compare_session_line(char *session_line, char *comparison_line) { | |
// do not mutate arg strings | |
char *left_line = strdup(session_line); | |
char *right_line = strdup(comparison_line); | |
char *left_ptr; | |
char *right_ptr; | |
char *left = strtok_r(left_line, ":", &left_ptr); | |
char *right = strtok_r(right_line, ":", &right_ptr); | |
while(right) { | |
// match number of columns: session line too short | |
if(!left) { | |
return -2; | |
} | |
// validate <UTIME> keyword (unix timestamp) | |
if(!strcmp(right, "<UTIME>")) { | |
int now = (int) time(NULL); | |
int then = atoi(left); | |
if (now <= 0 || now < then || now - then > 8600) { | |
return -4; | |
} | |
return 0; | |
} | |
// compare column text | |
if(strcmp(left, right)) { | |
return -1; | |
} | |
left = strtok_r(NULL, ":", &left_ptr); | |
right = strtok_r(NULL, ":", &right_ptr); | |
} | |
// match number of columns: session line too long | |
if (left) { | |
return -3; | |
} | |
return 0; | |
} | |
int main() { | |
int res; | |
int now; | |
char *session_line; | |
char *comparison_line; | |
fprintf(stderr, "\nTesting column MISMATCH\n"); | |
session_line = strdup("question1:Hello World:0:0:0:0:0:0:0::0"); | |
comparison_line = strdup("0:Hello World:2:3:4:5:6:7:8:9:10"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -1); | |
fprintf(stderr, "\nTesting MATCH\n"); | |
session_line = strdup("question1:Hello World:0:0:0:0:0:0:0::0"); | |
comparison_line = strdup("question1:Hello World:0:0:0:0:0:0:0::0"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == 0); | |
fprintf(stderr, "\nTesting column MISMATCH in FIRST COL\n"); | |
session_line = strdup("question1:Hello World:0:0:0:0:0:0:0::0"); | |
comparison_line = strdup("question2:Hello World:0:0:0:0:0:0:0::0"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -1); | |
fprintf(stderr, "\nTesting column MISMATCH in LAST col\n"); | |
session_line = strdup("question1:Hello World:0:0:0:0:0:0:0::1"); | |
comparison_line = strdup("question1:Hello World:0:0:0:0:0:0:0::0"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -1); | |
fprintf(stderr, "\nTesting MATCH with <UTIME>\n"); | |
now = (int) time(NULL); | |
snprintf (session_line, 8192, "question1:Hello World:0:0:0:0:0:0:0::%d", now - 60); | |
comparison_line = strdup("question1:Hello World:0:0:0:0:0:0:0::<UTIME>"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == 0); | |
fprintf(stderr, "\nTesting MATCH with INVALID <UTIME>\n"); | |
now = (int) time(NULL); | |
snprintf (session_line, 8192, "question1:Hello World:0:0:0:0:0:0:0::%d", now - 10000); | |
comparison_line = strdup("question1:Hello World:0:0:0:0:0:0:0::<UTIME>"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -4); | |
fprintf(stderr, "\nTesting comparsion columns TOO SHORT\n"); | |
session_line = strdup("question2:Hello World:0:0:"); | |
comparison_line = strdup("question2:Hello World:0:0:0:0:0:0:0::0"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -2); | |
fprintf(stderr, "\nTesting comparsion columns TOO LONG\n"); | |
session_line = strdup("question2:Hello World:0:0:0:0:0:0:0::0:too long:"); | |
comparison_line = strdup("question2:Hello World:0:0:0:0:0:0:0::0"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -3); | |
fprintf(stderr, "\nTesting comparsion columns TOO SHORT: NO <UTIME> defined\n"); | |
session_line = strdup("question1:Hello World:0:0:0:0:0:0:0::"); | |
comparison_line = strdup("question1:Hello World:0:0:0:0:0:0:0::<UTIME>"); | |
res = compare_session_line(session_line, comparison_line); | |
report_result(res, session_line, comparison_line); | |
assert(res == -2); | |
fprintf(stderr, "\n-------- END --------\n"); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment