From 73707cc9da989d523023cd3ac2411a2863d461fa Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 22 Aug 2014 20:44:26 +0300 Subject: [PATCH 1/2] canonical query tests for query classifier --- .../test/canonical_tests/Makefile | 63 +++++++++++ .../test/canonical_tests/canonizer.c | 101 ++++++++++++++++++ .../test/canonical_tests/canontest.sh | 21 ++++ .../test/canonical_tests/errmsg.sys | Bin 0 -> 47264 bytes .../test/canonical_tests/expected.sql | 6 ++ .../test/canonical_tests/input.sql | 6 ++ query_classifier/test/makefile | 4 +- 7 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 query_classifier/test/canonical_tests/Makefile create mode 100644 query_classifier/test/canonical_tests/canonizer.c create mode 100755 query_classifier/test/canonical_tests/canontest.sh create mode 100644 query_classifier/test/canonical_tests/errmsg.sys create mode 100755 query_classifier/test/canonical_tests/expected.sql create mode 100755 query_classifier/test/canonical_tests/input.sql diff --git a/query_classifier/test/canonical_tests/Makefile b/query_classifier/test/canonical_tests/Makefile new file mode 100644 index 000000000..a416e1aa9 --- /dev/null +++ b/query_classifier/test/canonical_tests/Makefile @@ -0,0 +1,63 @@ +# cleantests - clean local and subdirectories' tests +# buildtests - build all local and subdirectories' tests +# runtests - run all local tests +# testall - clean, build and run local and subdirectories' tests + +include ../../../build_gateway.inc +include ../../../makefile.inc +include ../../../test.inc + +CC = gcc +CPP = g++ + +TESTPATH := $(shell pwd) +TESTLOG := $(TESTPATH)/testqclass.log +QUERY_CLASSIFIER_PATH := $(ROOT_PATH)/query_classifier +LOG_MANAGER_PATH := $(ROOT_PATH)/log_manager +UTILS_PATH := $(ROOT_PATH)/utils +CORE_PATH := $(ROOT_PATH)/server/core +TESTAPP = $(TESTPATH)/canonizer + +LDFLAGS=-L$(QUERY_CLASSIFIER_PATH) \ + -L$(LOG_MANAGER_PATH) \ + -L$(EMBEDDED_LIB) \ + -Wl,-rpath,$(DEST)/lib \ + -Wl,-rpath,$(EMBEDDED_LIB) \ + -Wl,-rpath,$(LOG_MANAGER_PATH) \ + -Wl,-rpath,$(QUERY_CLASSIFIER_PATH) + +LIBS=-lpthread -lquery_classifier -lz -ldl -lssl -laio -lcrypt -lcrypto -lrt \ + -llog_manager $(UTILS_PATH)/skygw_utils.o $(CORE_PATH)/buffer.o $(CORE_PATH)/atomic.o $(CORE_PATH)/spinlock.o + +CFLAGS=$ -g $(MYSQL_HEADERS) \ + -I$(QUERY_CLASSIFIER_PATH) \ + $(MYSQL_HEADERS) \ + -I$(ROOT_PATH)/server/include \ + -I$(UTILS_PATH) + +EMBFLAGS=$(shell mysql_config --cflags --libmysqld-libs) + + +testall: + $(MAKE) cleantests + $(MAKE) buildtests + $(MAKE) runtests + +cleantests: + - $(DEL) *.o + - $(DEL) *~ + - $(DEL) canonizer + - $(DEL) aria_log* + - $(DEL) ib* + +buildtests: $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) $(EMBFLAGS) $(LIBS) canonizer.c -o $(TESTAPP) + +runtests: + @echo "" > $(TESTLOG) + @echo "-------------------------------" >> $(TESTLOG) + @echo $(shell date) >> $(TESTLOG) + @echo "Canonical Query Tests" >> $(TESTLOG) + @echo "-------------------------------" >> $(TESTLOG) + @echo "" >> $(TESTLOG) + ./canontest.sh $(TESTLOG) input.sql output.sql expected.sql diff --git a/query_classifier/test/canonical_tests/canonizer.c b/query_classifier/test/canonical_tests/canonizer.c new file mode 100644 index 000000000..a4c9df90f --- /dev/null +++ b/query_classifier/test/canonical_tests/canonizer.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include + +static char* server_options[] = { + "SkySQL Gateway", + "--datadir=./", + "--language=./", + "--skip-innodb", + "--default-storage-engine=myisam", + NULL +}; + +const int num_elements = (sizeof(server_options) / sizeof(char *)) - 1; + +static char* server_groups[] = { + "embedded", + "server", + "server", + NULL +}; + +int main(int argc, char** argv) +{ + + int fdin,fdout,i=0,fnamelen,fsz,lines = 0; + unsigned int psize; + GWBUF** qbuff; + char *qin, *outnm, *buffer, *tok; + + if(argc != 3){ + printf("Usage: canonizer \n"); + return 1; + } + + + + bool failed = mysql_library_init(num_elements, server_options, server_groups); + + if(failed){ + printf("Embedded server init failed.\n"); + return 1; + } + + fnamelen = strlen(argv[1]) + 16; + fdin = open(argv[1],O_RDONLY); + fsz = lseek(fdin,0,SEEK_END); + lseek(fdin,0,SEEK_SET); + + if(!(buffer = malloc(sizeof(char)*fsz))){ + printf("Error: Failed to allocate memory."); + return 1; + } + + read(fdin,buffer,fsz); + tok = strpbrk(buffer,"\n"); + lines = 1; + + while((tok = strpbrk(tok + 1,"\n"))){ + lines++; + } + + qbuff = malloc(sizeof(GWBUF*)*lines); + + i = 0; + tok = strtok(buffer,"\n"); + + while(tok){ + qin = strdup(tok); + psize = strlen(qin); + qbuff[i] = gwbuf_alloc(psize + 6); + *(qbuff[i]->sbuf->data + 0) = (unsigned char)psize; + *(qbuff[i]->sbuf->data + 1) = (unsigned char)(psize>>8); + *(qbuff[i]->sbuf->data + 2) = (unsigned char)(psize>>16); + *(qbuff[i]->sbuf->data + 4) = 0x03; + memcpy(qbuff[i]->sbuf->data + 5,qin,psize); + *(qbuff[i]->sbuf->data + 5 + psize) = 0x00; + tok = strtok(NULL,"\n"); + free(qin); + i++; + } + + fdout = open(argv[2],O_TRUNC|O_CREAT|O_WRONLY,S_IRWXU|S_IXGRP|S_IXOTH); + + for(i = 0;i " + exit 0 +fi +TESTLOG=$1 +INPUT=$2 +OUTPUT=$3 +EXPECTED=$4 +DIFFLOG=diff.out +$PWD/canonizer $INPUT $OUTPUT +diff $OUTPUT $EXPECTED > $DIFFLOG +if [ $? -eq 0 ] +then + echo "PASSED" >> $TESTLOG +else + echo "FAILED" >> $TESTLOG + echo "Diff output: " >> $TESTLOG + cat $DIFFLOG >> $TESTLOG +fi diff --git a/query_classifier/test/canonical_tests/errmsg.sys b/query_classifier/test/canonical_tests/errmsg.sys new file mode 100644 index 0000000000000000000000000000000000000000..70ec93c1dba02ce8ec5c73bf88e40abb59ab8c45 GIT binary patch literal 47264 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 $(TESTLOG) endif - @cat $(TESTLOG) >> $(TEST_MAXSCALE_LOG) \ No newline at end of file + @cat $(TESTLOG) >> $(TEST_MAXSCALE_LOG) From 662b4b00ee37eba78c5a5294b8098266f8148658 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 22 Aug 2014 20:50:54 +0300 Subject: [PATCH 2/2] the errmsg.sys file is now copied during test building --- query_classifier/test/canonical_tests/Makefile | 1 + .../test/canonical_tests/errmsg.sys | Bin 47264 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 query_classifier/test/canonical_tests/errmsg.sys diff --git a/query_classifier/test/canonical_tests/Makefile b/query_classifier/test/canonical_tests/Makefile index a416e1aa9..6db90ac17 100644 --- a/query_classifier/test/canonical_tests/Makefile +++ b/query_classifier/test/canonical_tests/Makefile @@ -51,6 +51,7 @@ cleantests: - $(DEL) ib* buildtests: $(OBJS) + cp $(ERRMSG)/errmsg.sys . $(CC) $(CFLAGS) $(LDFLAGS) $(EMBFLAGS) $(LIBS) canonizer.c -o $(TESTAPP) runtests: diff --git a/query_classifier/test/canonical_tests/errmsg.sys b/query_classifier/test/canonical_tests/errmsg.sys deleted file mode 100644 index 70ec93c1dba02ce8ec5c73bf88e40abb59ab8c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47264 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