From bf75c6b2d547070f2207d81a7c1bf4379dd98142 Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Mon, 25 May 2015 18:03:46 +0200
Subject: [PATCH] Made some C tests run with valgrind, corrected two found
 library errors and augmented numerous tests to clean up properly.

---
 Makefile                                           |  1 +
 lib/c/2014/Makefile                                |  2 +-
 lib/c/2014/labcomm2014_decoder.c                   | 13 ++++++++-----
 lib/c/2014/test/test_labcomm.c                     | 14 ++++++++++++--
 lib/c/2014/test/test_labcomm_basic_type_encoding.c |  6 +++++-
 lib/c/2014/test/test_labcomm_copy.c                | 13 ++++++++++++-
 lib/c/2014/test/test_labcomm_pthread_scheduler.c   | 10 +++++++++-
 lib/c/2014/test/test_labcomm_renaming_decoder.c    |  3 +++
 lib/c/2014/test/test_labcomm_renaming_encoder.c    | 14 +++++++++++---
 test/Makefile                                      |  3 ++-
 test/relay_gen_c.py                                |  2 ++
 11 files changed, 66 insertions(+), 15 deletions(-)

diff --git a/Makefile b/Makefile
index 07c4765..10bc7d4 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
 SUBDIRS=compiler lib test examples packaging
 export LABCOMM_JAR=$(shell pwd)/compiler/labcomm2014_compiler.jar
 export LABCOMM=java -jar $(LABCOMM_JAR) 
+export VALGRIND=valgrind --leak-check=full --error-exitcode=1
 
 UNAME_S=$(shell uname -s)
 
diff --git a/lib/c/2014/Makefile b/lib/c/2014/Makefile
index 81c0244..741f5e3 100644
--- a/lib/c/2014/Makefile
+++ b/lib/c/2014/Makefile
@@ -108,7 +108,7 @@ endif
 # rules invoked by 'test'
 .PHONY: run-test-%
 run-test-%: $(TEST_DIR)/gen/% | $(TEST_DIR)/gen
-	$<
+	$(VALGRIND) $<
 
 .PRECIOUS: $(TEST_DIR)/gen/%
 
diff --git a/lib/c/2014/labcomm2014_decoder.c b/lib/c/2014/labcomm2014_decoder.c
index f822288..9ed6329 100644
--- a/lib/c/2014/labcomm2014_decoder.c
+++ b/lib/c/2014/labcomm2014_decoder.c
@@ -160,7 +160,7 @@ static int decode_sample_def_or_ref(struct labcomm2014_decoder *d, int kind)
   signature.name = labcomm2014_read_string(d->reader);
   if (d->reader->error < 0) {
     result = d->reader->error;
-    goto out;
+    goto free_signature_name;
   }
   signature.size = labcomm2014_read_packed32(d->reader);
   if (d->reader->error < 0) {
@@ -198,7 +198,9 @@ static int decode_sample_def_or_ref(struct labcomm2014_decoder *d, int kind)
 free_signature_signature:
   labcomm2014_memory_free(d->memory, 1,  signature.signature);
 free_signature_name:
-  labcomm2014_memory_free(d->memory, 0, signature.name);
+  if (signature.name) {
+    labcomm2014_memory_free(d->memory, 0, signature.name);
+  }
 out:
   return result;
 }
@@ -337,15 +339,16 @@ static int do_decode_one(struct labcomm2014_decoder *d)
     char *version = labcomm2014_read_string(d->reader);
     if (d->reader->error < 0) {
       result = d->reader->error;
-      goto out;
-    }
-    if (strcmp(version, CURRENT_VERSION) == 0) {
+    } else if (strcmp(version, CURRENT_VERSION) == 0) {
       result = LABCOMM_VERSION;
       d->version_ok = 1;
     } else {
       result = -ECONNRESET;
     }  
     labcomm2014_memory_free(d->memory, 1,  version);
+    if (result < 0) {
+      goto out;
+    }
   } else if (! d->version_ok) {
     DEBUG_FPRINTF(stderr, "No VERSION %d %d\n", remote_index, length);
     result = -ECONNRESET;
diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c
index de36a7f..0b0fbf3 100644
--- a/lib/c/2014/test/test_labcomm.c
+++ b/lib/c/2014/test/test_labcomm.c
@@ -171,7 +171,9 @@ static test_sample_test_var decoder_var = {
 
 void handle_test_var(test_sample_test_var *v, void *ctx)
 {
-  decoder_var.a[0] = v->a[0];  
+  if (v->n_0 * v->n_2 > 0) {
+    decoder_var.a[0] = v->a[0];
+  }
 }
 
 int test_decode_one(struct labcomm2014_decoder *decoder)
@@ -229,7 +231,7 @@ static void test_encode_decode(struct labcomm2014_encoder *encoder,
   }
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   int i;
   struct labcomm2014_decoder *decoder = labcomm2014_decoder_new(
@@ -273,5 +275,13 @@ int main(void)
     test_encode_decode(encoder, decoder, 4+i, 0, (1<<(7*i)));
   }
   test_encode_decode(encoder, decoder, 8, 0, 4294967295);
+
+  labcomm2014_encoder_free(encoder);
+  labcomm2014_decoder_free(decoder);
   return 0;
 }
+
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_basic_type_encoding.c b/lib/c/2014/test/test_labcomm_basic_type_encoding.c
index 29079df..b7cf2b1 100644
--- a/lib/c/2014/test/test_labcomm_basic_type_encoding.c
+++ b/lib/c/2014/test/test_labcomm_basic_type_encoding.c
@@ -91,7 +91,7 @@ static void writer_assert(char *type,
   }
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   TEST_WRITE_READ(packed32, packed32, "%d", 0x0, 1, "\x00");
   TEST_WRITE_READ(packed32, packed32, "%d", 0x7f, 1, "\x7f");
@@ -141,3 +141,7 @@ int main(void)
   return 0;
 }
 
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_copy.c b/lib/c/2014/test/test_labcomm_copy.c
index 173f152..fc4bbfe 100644
--- a/lib/c/2014/test/test_labcomm_copy.c
+++ b/lib/c/2014/test/test_labcomm_copy.c
@@ -70,7 +70,7 @@ static void handle_as(more_types_AS *v, void *context)
   labcomm2014_copy_more_types_AS(labcomm2014_default_memory, context, v);
 }
 
-int main(int argc, char **argv)
+int do_test(int argc, char **argv)
 {
   struct labcomm2014_encoder *encoder;
   struct labcomm2014_decoder *decoder;
@@ -284,4 +284,15 @@ int main(int argc, char **argv)
   puts("NS deallocated ok");
   labcomm2014_copy_free_more_types_AS(labcomm2014_default_memory, &cache_as);
   puts("AS deallocated ok");
+
+  labcomm2014_copy_free_generated_encoding_R(labcomm2014_default_memory,
+                                             &cache_r);
+  puts("R deallocated ok");
+
+  return 0;
+}
+
+int main(int argc, char **argv)
+{
+  return do_test(argc, argv);
 }
diff --git a/lib/c/2014/test/test_labcomm_pthread_scheduler.c b/lib/c/2014/test/test_labcomm_pthread_scheduler.c
index aa7c5f0..c801308 100644
--- a/lib/c/2014/test/test_labcomm_pthread_scheduler.c
+++ b/lib/c/2014/test/test_labcomm_pthread_scheduler.c
@@ -40,6 +40,7 @@ static void func(void *arg)
   if (func_arg->i == 999) {
     labcomm2014_scheduler_wakeup(func_arg->scheduler);
   }
+  free(func_arg);
 }
 
 void enqueue(struct labcomm2014_scheduler *scheduler, 
@@ -56,7 +57,7 @@ void enqueue(struct labcomm2014_scheduler *scheduler,
   }
 }
 
-int main(int argc, char *argv[])
+static int do_test(int argc, char *argv[])
 {
   struct labcomm2014_scheduler *scheduler;
   struct labcomm2014_time *time;
@@ -78,5 +79,12 @@ int main(int argc, char *argv[])
   labcomm2014_scheduler_sleep(scheduler, NULL);
   labcomm2014_scheduler_sleep(scheduler, time);
 
+  labcomm2014_time_free(time);
+  labcomm2014_scheduler_free(scheduler);
   return 0;
 }
+
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_renaming_decoder.c b/lib/c/2014/test/test_labcomm_renaming_decoder.c
index 9cafa7c..b0c4bd5 100644
--- a/lib/c/2014/test/test_labcomm_renaming_decoder.c
+++ b/lib/c/2014/test/test_labcomm_renaming_decoder.c
@@ -169,7 +169,10 @@ int main(int argc, char **argv)
          labcomm2014_decoder_get_sample_ref(
            suffix_decoder, labcomm2014_signature_generated_encoding_R));
 
+  labcomm2014_decoder_free(suffix_decoder);
+  labcomm2014_decoder_free(prefix_decoder);
   labcomm2014_decoder_free(decoder);
+
   close(fd);
   unlink(DATA_FILE);
 }
diff --git a/lib/c/2014/test/test_labcomm_renaming_encoder.c b/lib/c/2014/test/test_labcomm_renaming_encoder.c
index 227574b..ece917b 100644
--- a/lib/c/2014/test/test_labcomm_renaming_encoder.c
+++ b/lib/c/2014/test/test_labcomm_renaming_encoder.c
@@ -26,7 +26,7 @@
 #include "labcomm2014_private.h"
 #include "labcomm2014_default_error_handler.h"
 #include "labcomm2014_default_memory.h"
-#include "labcomm2014_pthread_scheduler.h"
+#include "labcomm2014_default_scheduler.h"
 #include "labcomm2014_renaming.h"
 #include "labcomm2014_renaming_encoder.h"
 #include "test/gen/generated_encoding.h"
@@ -193,7 +193,7 @@ void dump_encoder(struct labcomm2014_encoder *encoder)
   printf("\n");
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   struct labcomm2014_encoder *encoder, *prefix, *suffix;
   int i;
@@ -206,7 +206,7 @@ int main(void)
     &buffer_writer, 
     labcomm2014_default_error_handler,
     labcomm2014_default_memory,
-    labcomm2014_pthread_scheduler_new(labcomm2014_default_memory));
+    labcomm2014_default_scheduler);
   prefix = labcomm2014_renaming_encoder_new(encoder,
                                             labcomm2014_renaming_prefix,
                                             "p.");
@@ -277,6 +277,14 @@ int main(void)
   labcomm2014_encode_generated_encoding_V(suffix);
   EXPECT({VARIABLE(5), 0x00 });
 
+  labcomm2014_encoder_free(suffix);
+  labcomm2014_encoder_free(prefix);
+  labcomm2014_encoder_free(encoder);
+
   return 0;
 }
 
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/test/Makefile b/test/Makefile
index dc3b8b7..dab650b 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -26,7 +26,8 @@ test_%: gen/%/signatures.py \
 		./test_encoder_decoder.py \
 		--signatures=gen/$*/signatures.py \
 		--test tee gen/$*/testdata \
-		--test gen/$*/c_relay /dev/stdin /dev/stdout \
+		--test $(shell echo $(VALGRIND) | sed -e 's/[-][-]/\\\\--/g') \
+		       gen/$*/c_relay /dev/stdin /dev/stdout \
 		--test mono gen/$*/cs_relay.exe /dev/stdin /dev/stdout \
 		--test java \\-cp gen/$*:../lib/java/labcomm2014.jar java_relay \
 			    /dev/stdin /dev/stdout
diff --git a/test/relay_gen_c.py b/test/relay_gen_c.py
index 4d05064..2706d34 100755
--- a/test/relay_gen_c.py
+++ b/test/relay_gen_c.py
@@ -74,6 +74,8 @@ if __name__ == '__main__':
        """ % { 'func': func, 'arg': arg }))
     result.extend(split_match('^[^|]*\|(.*)$', """
       |  labcomm2014_decoder_run(d);
+      |  labcomm2014_decoder_free(d);
+      |  labcomm2014_encoder_free(e);
       |  return 0;
       |}
     """))
-- 
GitLab