Skip to content

Instantly share code, notes, and snippets.

@RoboSparrow
Last active October 8, 2019 00:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RoboSparrow/dca42e54e51f5ee1e34fe36a13b3d876 to your computer and use it in GitHub Desktop.
Save RoboSparrow/dca42e54e51f5ee1e34fe36a13b3d876 to your computer and use it in GitHub Desktop.
surveysystem compare_session_line() tests
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
#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