Merge pull request #30 from skysql/canonical_query_tests
Canonical query tests
This commit is contained in:
commit
2694c69186
64
query_classifier/test/canonical_tests/Makefile
Normal file
64
query_classifier/test/canonical_tests/Makefile
Normal file
@ -0,0 +1,64 @@
|
||||
# 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)
|
||||
cp $(ERRMSG)/errmsg.sys .
|
||||
$(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
|
101
query_classifier/test/canonical_tests/canonizer.c
Normal file
101
query_classifier/test/canonical_tests/canonizer.c
Normal file
@ -0,0 +1,101 @@
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
#include <query_classifier.h>
|
||||
#include <buffer.h>
|
||||
#include <mysql.h>
|
||||
|
||||
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 <input file> <output file>\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<lines;i++){
|
||||
parse_query(qbuff[i]);
|
||||
tok = skygw_get_canonical(qbuff[i]);
|
||||
write(fdout,tok,strlen(tok));
|
||||
write(fdout,"\n",1);
|
||||
gwbuf_free(qbuff[i]);
|
||||
}
|
||||
|
||||
close(fdin);
|
||||
close(fdout);
|
||||
|
||||
return 0;
|
||||
}
|
21
query_classifier/test/canonical_tests/canontest.sh
Executable file
21
query_classifier/test/canonical_tests/canontest.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#! /bin/sh
|
||||
if [[ $# -ne 4 ]]
|
||||
then
|
||||
echo "Usage: canontest.sh <logfile name> <input file> <output file> <expected output>"
|
||||
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
|
6
query_classifier/test/canonical_tests/expected.sql
Executable file
6
query_classifier/test/canonical_tests/expected.sql
Executable file
@ -0,0 +1,6 @@
|
||||
select sleep(?)
|
||||
select * from tst where lname='?'
|
||||
select ?,?,?,?,?,? from tst
|
||||
select * from tst where fname like '?'
|
||||
select * from tst where lname like '?' order by fname
|
||||
insert into tst values ("?","?"),("?",?),("?","?")
|
6
query_classifier/test/canonical_tests/input.sql
Executable file
6
query_classifier/test/canonical_tests/input.sql
Executable file
@ -0,0 +1,6 @@
|
||||
select sleep(2);
|
||||
select * from tst where lname='Doe';
|
||||
select 1,2,3,4,5,6 from tst;
|
||||
select * from tst where fname like '%a%';
|
||||
select * from tst where lname like '%e%' order by fname;
|
||||
insert into tst values ("John","Doe"),("Plato",null),("Nietzsche","");
|
@ -18,7 +18,7 @@ UTILS_PATH := $(ROOT_PATH)/utils
|
||||
TESTAPP = $(TESTPATH)/testmain
|
||||
|
||||
testall:buildtests
|
||||
|
||||
$(MAKE) -C canonical_tests testall
|
||||
testalllaters:
|
||||
$(MAKE) cleantests
|
||||
$(MAKE) DEBUG=Y DYNLIB=Y buildtests
|
||||
@ -80,4 +80,4 @@ ifeq ($?, 0)
|
||||
else
|
||||
@echo "Query Classifier FAILED" >> $(TESTLOG)
|
||||
endif
|
||||
@cat $(TESTLOG) >> $(TEST_MAXSCALE_LOG)
|
||||
@cat $(TESTLOG) >> $(TEST_MAXSCALE_LOG)
|
||||
|
Loading…
x
Reference in New Issue
Block a user