From 09312fefb321562f73b24e3b9c23d12de9172dd0 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 26 Apr 2022 16:54:06 -0700 Subject: [PATCH] ... --- Makefile.am | 7 +++--- test/integration/Makefile.am | 17 +++++++++----- test/integration/basic.test | Bin 50760 -> 79832 bytes test/integration/basic.test.c | 7 ------ test/integration/basic.tests.c | 28 +++++++++++++++++++++++ test/integration/test_macros.h | 3 +++ test/integration/test_utils.c | 40 +++++++++++++++++++++++++++++++++ test/integration/test_utils.h | 7 ++++++ test/unit/Makefile.am | 7 +++++- 9 files changed, 99 insertions(+), 17 deletions(-) delete mode 100644 test/integration/basic.test.c create mode 100644 test/integration/basic.tests.c diff --git a/Makefile.am b/Makefile.am index 9a1fc3c..978cc66 100644 --- a/Makefile.am +++ b/Makefile.am @@ -124,8 +124,9 @@ seederd_SOURCES += \ SUBDIRS = . test/unit test/integration bench -# test target/shortcuts +# recipes for integration/unit testing +# NOTE: integration requires all target +integration: all + $(MAKE) -C test/integration check unit: $(MAKE) -C test/unit check -integration: - $(MAKE) -C test/integration check diff --git a/test/integration/Makefile.am b/test/integration/Makefile.am index b610eef..a9f941d 100644 --- a/test/integration/Makefile.am +++ b/test/integration/Makefile.am @@ -1,5 +1,8 @@ +TEST_DIRECTORY = .test + AM_CPPFLAGS = \ - -DPREFIX=\".test\" \ + -DPREFIX=\"$(TEST_DIRECTORY)\" \ + -DSEEDERD=\"$(top_srcdir)/seederd\" \ -Wall \ -Werror @@ -13,18 +16,20 @@ AM_CPPFLAGS += \ -DNDEBUG endif -check_PROGRAMS = basic.test +check_PROGRAMS = basic.tests TESTS = $(check_PROGRAMS) if ENABLE_MEMCHECK LOG_COMPILER = $(VALGRIND) -AM_LOG_FLAGS = --leak-check=full -v --track-origins=yes --error-exitcode=1 +AM_LOG_FLAGS = --leak-check=full -v --trace-children=yes --track-origins=yes --error-exitcode=1 endif common_SOURCES = \ - $(seederd_SOURCES) \ test_utils.c -basic_test_SOURCES = \ +basic_tests_SOURCES = \ $(common_SOURCES) \ - basic.test.c + basic.tests.c + +clean-local: + -rm -rf $(TEST_DIRECTORY) diff --git a/test/integration/basic.test b/test/integration/basic.test index dce91021db2448de50be8c932cc3b6ce1e7f933e..508464c74b4818262b196d9e76d1901f48d33414 100755 GIT binary patch literal 79832 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 z zX+X6?nq<1%f6^2-^!al)||(iJyN!}eGT@Fx(5H$u5*7`Qz3l~bVP zmt#jzbXs1QUytaoKAEz9WB-Ervpfz6#Pj7Q5U`bC^0iqJ;@lq3&3yHgjpuMB zZ_kTpAHQsV#roH?9en!D-tHYGzeTm%Rn;YNJ`N42S8p}|KbYT~;D>3U0PK4Y zc_YE&cNqDm_(d}_3r)GQI9BtMiM?9;EqeoNl%{um4H2bsU+36oMwqA z-!$aM0n)NzRf5Ou^16L59L6Q4dhj)Hd{GHClvxkViB}$3`W1D;7EscE(&J_CGa;{#Ty8KsV9dt4cbr8w^K z?u6&urC9tNjn{?sR{T9r<_azT`q;n3?94d-0^R7`KpaR+&4|m%b|)GMX>M1B?^7gW zQqxLX#T9XEZIt+l!+?6@v$Iu`zBf+M@i^Fu_2CdV**OUb?(FO&e4b*0G0v6h#e$`! zstf!I3Vf`F7+*%o$?|_2g~JeZ5VF(U?yOREVd?nsE{>inEp=jPtFau-m{PKaGkZe1 z*A)-+diSsko_igQUB^$nD_!2>i;Y^&6 zf%^RD_4toG=k{=Uyiz-HIOcJuxu~GFveLYU)8|SjHl4|t*!5y@J;TW)g;1t1w4Ck~ zm6j=qs6_AiRsE^#*U;N&!IhqxfaWv3tQp2JM4cEe!-*Lp9f=Q~J3c2FDz1!VOeboW zAHLVyuK0K?va0veQZw9o8}8DZ>8=D%X25**-`(Uqj8g@!9sEV#PieGY*-|#JG{Fvj za4gZ+_gxwv3KYh+KL2TUM{ES@>-#f}p;}O(UB5T@w~C81wf*`&PNQyL-)4o_>ccN^ zylN`3U*GR(%vBxc?HD(;K7Kj(m7$N#0Gt;>(lq68jmPJ-M+p5)0KX-lGFFC8gB&X;JvAKlfDnSil6sc?DBeF<0p{8kJ}~s z`o8PNe^LJ;bQycPef@jG9i@Lk*{|bMx2yfQ9J&g)TJ6s522wCn5rU$DWtwEg-zoDagY=yv>j{;HA5j~Sv30Zul>A0x=vL%Dv*h7t*6=dgJI|KSh3QttvjX^?6P6^(680O zufY4>z+&4q+T26`wFtk~EdC%9Q0)5Ml)l}6?W6rlopuK(V^iyEd|c_5mNJadKl(X+ zR2=H#S}$;4=f36<3wQ&GlBEKG>D(EAIv(`-kMonw#o!?BTln>d+YZ{>=k2de#HT;C NwO?|GO~JNn`~&Eu72f~= literal 50760 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 diff --git a/test/integration/basic.test.c b/test/integration/basic.test.c deleted file mode 100644 index b6a16a3..0000000 --- a/test/integration/basic.test.c +++ /dev/null @@ -1,7 +0,0 @@ -#include - -int main(); - -int main() { - return EXIT_SUCCESS; -} diff --git a/test/integration/basic.tests.c b/test/integration/basic.tests.c new file mode 100644 index 0000000..0bf86c1 --- /dev/null +++ b/test/integration/basic.tests.c @@ -0,0 +1,28 @@ +#include + +int main(); +void basic_test(); + +int main() { + setup_env(); + + basic_test(); + + reset_env(); + + return EXIT_SUCCESS; +} + +void basic_test() { + char *opts[] = { + SEEDERD, + "--watch-directory", + TEST_DIRECTORY_1, + "--log-file=" TEST_DIRECTORY "/basic.test.seederd.log", + NULL + }; + + run_and_exit_successfully(opts); + + reset_env(); +} diff --git a/test/integration/test_macros.h b/test/integration/test_macros.h index e229fe5..4206257 100644 --- a/test/integration/test_macros.h +++ b/test/integration/test_macros.h @@ -1,4 +1,7 @@ #ifndef __TEST_MACROS_H_ #define __TEST_MACROS_H_ +#define TEST_DIRECTORY PREFIX +#define TEST_DIRECTORY_1 TEST_DIRECTORY "/test" + #endif diff --git a/test/integration/test_utils.c b/test/integration/test_utils.c index 331953b..ed3cda2 100644 --- a/test/integration/test_utils.c +++ b/test/integration/test_utils.c @@ -1,16 +1,56 @@ #include +static void create_test_directory(const char*); + void clean_env() { system("rm -rf " PREFIX); } +static void create_test_directory(const char *directory) { + assert(mkdir(directory,0700)==0); +} + void reset_env() { clean_env(); setup_env(); } +pid_t run(char *const opts[]) { + pid_t pid = fork(); + + assert(pid!=-1); + if(pid==0) { /* child */ + execve(SEEDERD,opts,NULL); + assert(0); + } + + return pid; +} + +void run_and_exit_successfully(char *const opts[]) { + int status; + + pid_t child_pid = run(opts); + + // wait 5 seconds for startup + sleep(5); + + // verify still running + assert(0==waitpid(child_pid,&status,WNOHANG)); + + // SIGINT to shutdown + assert(0==kill(child_pid,SIGINT)); + + // verify child process exited successfully + assert(child_pid==waitpid(child_pid,&status,0)); + assert(WIFEXITED(status)); +} + void setup_env() { clean_env(); srand(time(NULL)); + + create_test_directory(TEST_DIRECTORY); + create_test_directory(TEST_DIRECTORY_1); } diff --git a/test/integration/test_utils.h b/test/integration/test_utils.h index 4e9eb0d..0640a7c 100644 --- a/test/integration/test_utils.h +++ b/test/integration/test_utils.h @@ -4,12 +4,19 @@ #include #include +#include #include #include +#include +#include +#include #include +#include void clean_env(); void reset_env(); +pid_t run(char*const[]); +void run_and_exit_successfully(char*const[]); void setup_env(); #endif diff --git a/test/unit/Makefile.am b/test/unit/Makefile.am index 050f8ea..e31546e 100644 --- a/test/unit/Makefile.am +++ b/test/unit/Makefile.am @@ -1,5 +1,7 @@ +TEST_DIRECTORY = .test + AM_CPPFLAGS = \ - -DPREFIX=\".test\" \ + -DPREFIX=\"$(TEST_DIRECTORY)\" \ -Wall \ -Werror @@ -219,3 +221,6 @@ watch_tests_SOURCES = \ watch_tests_CPPFLAGS = $(AM_CPPFLAGS) \ -DWATCH_SRC_FILE="$(top_srcdir)/src/watch.c" + +clean-local: + -rm -rf $(TEST_DIRECTORY) -- 2.30.2