From 25f37b77f0b505175bec1cbff0d51b416c6ae1d7 Mon Sep 17 00:00:00 2001 From: Jarmo Isotalo Date: Wed, 8 May 2013 12:33:11 +0300 Subject: [PATCH] init --- README.md | 0 private/.tmcignore | 0 private/template_project/Makefile | 22 ++ .../nbproject/Package-Default.bash | 75 ++++++ .../nbproject/configurations.xml | 51 ++++ .../nbproject/private/Default.properties | 0 .../nbproject/private/configurations.xml | 39 +++ .../nbproject/private/private.xml | 11 + .../template_project/nbproject/project.xml | 23 ++ private/template_project/src/Makefile | 13 + private/template_project/src/main.c | 6 + private/template_project/test/Makefile | 17 ++ private/template_project/test/tmc-check.c | 233 ++++++++++++++++++ private/template_project/test/tmc-check.h | 58 +++++ scripts/create-project | 45 ++++ viikko1/demoTehtava/Makefile | 25 ++ .../nbproject/Package-Default.bash | 75 ++++++ .../demoTehtava/nbproject/configurations.xml | 51 ++++ .../nbproject/private/Default.properties | 0 .../nbproject/private/configurations.xml | 39 +++ .../demoTehtava/nbproject/private/private.xml | 11 + viikko1/demoTehtava/nbproject/project.xml | 23 ++ viikko1/demoTehtava/src/Makefile | 13 + viikko1/demoTehtava/src/main.c | 6 + viikko1/demoTehtava/src/tested.c | 9 + viikko1/demoTehtava/src/tested.h | 5 + viikko1/demoTehtava/test/Makefile | 20 ++ viikko1/demoTehtava/test/test | Bin 0 -> 15192 bytes viikko1/demoTehtava/test/test-file.c | 20 ++ viikko1/demoTehtava/test/tmc-check.c | 233 ++++++++++++++++++ viikko1/demoTehtava/test/tmc-check.h | 58 +++++ .../demoTehtava/test/tmc_available_points.txt | 2 + .../demoTehtava/test/tmc_memory_test_info.txt | 0 viikko1/demoTehtava/test/tmc_test_results.xml | 24 ++ 34 files changed, 1207 insertions(+) create mode 100644 README.md create mode 100644 private/.tmcignore create mode 100644 private/template_project/Makefile create mode 100644 private/template_project/nbproject/Package-Default.bash create mode 100644 private/template_project/nbproject/configurations.xml create mode 100644 private/template_project/nbproject/private/Default.properties create mode 100644 private/template_project/nbproject/private/configurations.xml create mode 100644 private/template_project/nbproject/private/private.xml create mode 100644 private/template_project/nbproject/project.xml create mode 100644 private/template_project/src/Makefile create mode 100644 private/template_project/src/main.c create mode 100644 private/template_project/test/Makefile create mode 100644 private/template_project/test/tmc-check.c create mode 100644 private/template_project/test/tmc-check.h create mode 100755 scripts/create-project create mode 100644 viikko1/demoTehtava/Makefile create mode 100644 viikko1/demoTehtava/nbproject/Package-Default.bash create mode 100644 viikko1/demoTehtava/nbproject/configurations.xml create mode 100644 viikko1/demoTehtava/nbproject/private/Default.properties create mode 100644 viikko1/demoTehtava/nbproject/private/configurations.xml create mode 100644 viikko1/demoTehtava/nbproject/private/private.xml create mode 100644 viikko1/demoTehtava/nbproject/project.xml create mode 100644 viikko1/demoTehtava/src/Makefile create mode 100644 viikko1/demoTehtava/src/main.c create mode 100644 viikko1/demoTehtava/src/tested.c create mode 100644 viikko1/demoTehtava/src/tested.h create mode 100644 viikko1/demoTehtava/test/Makefile create mode 100755 viikko1/demoTehtava/test/test create mode 100644 viikko1/demoTehtava/test/test-file.c create mode 100644 viikko1/demoTehtava/test/tmc-check.c create mode 100644 viikko1/demoTehtava/test/tmc-check.h create mode 100644 viikko1/demoTehtava/test/tmc_available_points.txt create mode 100644 viikko1/demoTehtava/test/tmc_memory_test_info.txt create mode 100644 viikko1/demoTehtava/test/tmc_test_results.xml diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/private/.tmcignore b/private/.tmcignore new file mode 100644 index 0000000..e69de29 diff --git a/private/template_project/Makefile b/private/template_project/Makefile new file mode 100644 index 0000000..570c07d --- /dev/null +++ b/private/template_project/Makefile @@ -0,0 +1,22 @@ +MAIN_DIR = src +TEST_DIR = test + +.PHONY: main test + +all: main test + +main: + $(MAKE) -C $(MAIN_DIR) + +test: + $(MAKE) -C $(TEST_DIR) + +clean: + $(MAKE) -C $(MAIN_DIR) clean + $(MAKE) -C $(TEST_DIR) clean + +run-main: + $(MAKE) -C $(MAIN_DIR) run + +run-test: + $(MAKE) -C $(TEST_DIR) run diff --git a/private/template_project/nbproject/Package-Default.bash b/private/template_project/nbproject/Package-Default.bash new file mode 100644 index 0000000..0d70205 --- /dev/null +++ b/private/template_project/nbproject/Package-Default.bash @@ -0,0 +1,75 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-MacOSX +CND_CONF=Default +CND_DISTDIR=dist +CND_BUILDDIR=build +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=MissingOutputInProject +OUTPUT_BASENAME=MissingOutputInProject +PACKAGE_TOP_DIR=setready-AES/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/setready-AES" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/setready-AES.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/setready-AES.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/private/template_project/nbproject/configurations.xml b/private/template_project/nbproject/configurations.xml new file mode 100644 index 0000000..26cce7f --- /dev/null +++ b/private/template_project/nbproject/configurations.xml @@ -0,0 +1,51 @@ + + + + + + main.c + + + tmc-check.c + tmc-check.h + + + + Makefile + + + ^(nbproject)$ + + . + + Makefile + + + + LOCAL_SOURCES + default + + + + + + . + ${MAKE} -f Makefile + ${MAKE} -f Makefile clean + + + + + + + + + + + + + + diff --git a/private/template_project/nbproject/private/Default.properties b/private/template_project/nbproject/private/Default.properties new file mode 100644 index 0000000..e69de29 diff --git a/private/template_project/nbproject/private/configurations.xml b/private/template_project/nbproject/private/configurations.xml new file mode 100644 index 0000000..736456b --- /dev/null +++ b/private/template_project/nbproject/private/configurations.xml @@ -0,0 +1,39 @@ + + + Makefile + + + + localhost + 4 + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + . + true + 0 + 0 + + + + + + diff --git a/private/template_project/nbproject/private/private.xml b/private/template_project/nbproject/private/private.xml new file mode 100644 index 0000000..1c50948 --- /dev/null +++ b/private/template_project/nbproject/private/private.xml @@ -0,0 +1,11 @@ + + + + true + + + 0 + 0 + + + diff --git a/private/template_project/nbproject/project.xml b/private/template_project/nbproject/project.xml new file mode 100644 index 0000000..a9c4bed --- /dev/null +++ b/private/template_project/nbproject/project.xml @@ -0,0 +1,23 @@ + + + org.netbeans.modules.cnd.makeproject + + + template_project + c + + h + UTF-8 + + + . + + + + Default + 0 + + + + + diff --git a/private/template_project/src/Makefile b/private/template_project/src/Makefile new file mode 100644 index 0000000..05a27b6 --- /dev/null +++ b/private/template_project/src/Makefile @@ -0,0 +1,13 @@ +SRC_FILES=main.c + +all: main + +main: $(SRC_FILES) + gcc -Wall -o $@ $(SRC_FILES) + +clean: + rm -f main + +run: main + # Running our main function from file main.c + ./main diff --git a/private/template_project/src/main.c b/private/template_project/src/main.c new file mode 100644 index 0000000..1662620 --- /dev/null +++ b/private/template_project/src/main.c @@ -0,0 +1,6 @@ +#include + +int main( int argc, const char* argv[] ) +{ + printf( "\nHello World\n" ); +} \ No newline at end of file diff --git a/private/template_project/test/Makefile b/private/template_project/test/Makefile new file mode 100644 index 0000000..e36e266 --- /dev/null +++ b/private/template_project/test/Makefile @@ -0,0 +1,17 @@ +CHECK_CFLAGS=$(shell pkg-config --cflags check) +CHECK_LDFLAGS=$(shell pkg-config --libs check) +SRC_FILES=tmc-check.c + +all: test + +test: $(SRC_FILES) + gcc $(CHECK_CFLAGS) -Wall -o $@ $(SRC_FILES) $(CHECK_LDFLAGS) + +clean: + # rm -f test tmc_available_points.txt tmc_test_results.xml valgrind.log + +run: test + # Printing available points + ./test --print-available-points + # Running test. There should be one success and one failure. + ./test diff --git a/private/template_project/test/tmc-check.c b/private/template_project/test/tmc-check.c new file mode 100644 index 0000000..1bc0b37 --- /dev/null +++ b/private/template_project/test/tmc-check.c @@ -0,0 +1,233 @@ + +#include "tmc-check.h" +#include +#include +#include +#include + +typedef struct SuitePoints +{ + Suite *s; + const char *s_name; + const char *points; + struct SuitePoints *next; +} SuitePoints; + +typedef struct PointsAssoc +{ + TCase *tc; + const char *tc_name; + const char *points; + struct PointsAssoc *next; +} PointsAssoc; + +typedef struct PointsList +{ + char *point; + struct PointsList *next; +} PointsList; + +typedef struct MemTest +{ + const char *tf_name; + int check_leaks; + int max_bytes_allocated; // Value -1 will represent no max_alloc check + struct MemTest *next; +} MemTest; + +static PointsAssoc *points_assocs = NULL; +static SuitePoints *suite_points = NULL; +static PointsList *all_points = NULL; +static MemTest *memtests = NULL; + +static void parse_points(const char *points, PointsList **target_list); +static void add_to_point_set(const char *point, ssize_t len, PointsList **target_list); +static int points_list_contains(const PointsList *list, const char *point, ssize_t len); + +void _tmc_register_memtest(const char *tf_name, int check_leaks, int max_bytes_allocated) +{ + MemTest *memtest = malloc(sizeof(MemTest)); + memtest->tf_name = tf_name; + memtest->check_leaks = check_leaks; + memtest->max_bytes_allocated = max_bytes_allocated; + + memtest->next = memtests; + memtests = memtest; +} + +void tmc_set_tcase_points(TCase *tc, const char *tc_name, const char *points) +{ + PointsAssoc *pa = (PointsAssoc*)malloc(sizeof(PointsAssoc)); + pa->tc = tc; + pa->tc_name = tc_name; + pa->points = points; + pa->next = points_assocs; + points_assocs = pa; + + parse_points(points, &all_points); +} + +void _tmc_register_test(Suite *s, TFun tf, const char *fname, const char *points) +{ + TCase *tc = tcase_create(fname); + tmc_set_tcase_points(tc, fname, points); + _tcase_add_test(tc, tf, fname, 0, 0, 0, 1); + suite_add_tcase(s, tc); +} + +void tmc_set_suite_points(Suite *s, const char *s_name, const char *points) +{ + SuitePoints *sp = (SuitePoints*) malloc(sizeof(SuitePoints)); + sp->s = s; + sp->points = points; + sp->s_name = s_name; + sp->next = suite_points; + suite_points = sp; + + parse_points(points, &all_points); +} + +Suite* tmc_suite_create(const char *name, const char *points) +{ + Suite *s = suite_create(name); + tmc_set_suite_points(s, name, points); + return s; +} + +int tmc_run_tests(int argc, const char **argv, Suite *s) +{ + int i; + for (i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--print-available-points") == 0) { + return tmc_print_available_points(stdout, '\n'); + } + + if (strcmp(argv[i], "--print-memory-tests") == 0) { + return tmc_print_memory_tests(stdout, ' ', '\n'); + } + } + + FILE *points_file = fopen("tmc_available_points.txt", "wb"); + FILE *memtest_file = fopen("tmc_memory_test_info.txt", "wb"); + if (tmc_print_suite_points(points_file) != 0) { + fclose(points_file); + return EXIT_FAILURE; + } + if (tmc_print_test_points(points_file) != 0) { + fclose(points_file); + return EXIT_FAILURE; + } + if (tmc_print_memory_tests(memtest_file, ' ', '\n') != 0) { + fclose(memtest_file); + return EXIT_FAILURE; + } + fclose(points_file); + fclose(memtest_file); + + SRunner *sr = srunner_create(s); + srunner_set_xml(sr, "tmc_test_results.xml"); + srunner_run_all(sr, CK_VERBOSE); + srunner_free(sr); + + return EXIT_SUCCESS; +} + +int tmc_print_available_points(FILE *f, char delimiter) +{ + const PointsList *pl = all_points; + while (pl != NULL) { + fputs(pl->point, f); + fputc(delimiter, f); + pl = pl->next; + } + fflush(f); + return 0; +} + +int tmc_print_memory_tests(FILE *f, char attr_delimiter, char line_delimiter) +{ + const MemTest *mt = memtests; + while (mt != NULL) { + fputs(mt->tf_name, f); + fputc(attr_delimiter, f); + fprintf(f, "%d", mt->check_leaks); + fputc(attr_delimiter, f); + fprintf(f, "%d", mt->max_bytes_allocated); + fputc(line_delimiter, f); + mt = mt->next; + } + fflush(f); + return 0; +} + +int tmc_print_test_points(FILE *f) +{ + const PointsAssoc *pa = points_assocs; + while (pa != NULL) { + fprintf(f, "[test] %s %s\n", pa->tc_name, pa->points); + pa = pa->next; + } + fflush(f); + return 0; +} + +int tmc_print_suite_points(FILE *f) +{ + const SuitePoints *sp = suite_points; + while (sp != NULL) { + fprintf(f, "[suite] %s %s\n", sp->s_name, sp->points); + sp = sp->next; + } + fflush(f); + return 0; +} + +static void parse_points(const char *points, PointsList **target_list) +{ + const char *p = points; + const char *q = p; + while (*q != '\0') { + if (isspace(*q)) { + const ssize_t len = q - p; + + if (!isspace(*p)) { + add_to_point_set(p, len, target_list); + } + + p = q + 1; + q = p; + } else { + q++; + } + } + + if (!isspace(*p) && q > p) { + const ssize_t len = q - p; + add_to_point_set(p, len, target_list); + } +} + +static void add_to_point_set(const char *point, ssize_t len, PointsList **target_list) +{ + if (!points_list_contains(*target_list, point, len)) { + PointsList *pl = (PointsList*)malloc(sizeof(PointsList)); + pl->point = malloc(len + 1); + memcpy(pl->point, point, len); + pl->point[len] = '\0'; + pl->next = *target_list; + *target_list = pl; + } +} + +static int points_list_contains(const PointsList *list, const char *point, ssize_t len) +{ + const PointsList *pl = all_points; + while (pl != NULL) { + if (strncmp(pl->point, point, len) == 0) { + return 1; + } + pl = pl->next; + } + return 0; +} + diff --git a/private/template_project/test/tmc-check.h b/private/template_project/test/tmc-check.h new file mode 100644 index 0000000..8100cbb --- /dev/null +++ b/private/template_project/test/tmc-check.h @@ -0,0 +1,58 @@ + +#include +#include + +/***** Main API *****/ + +/** A shorthand to make one test suite with the given points */ +Suite* tmc_suite_create(const char *name, const char *points); + +/** A shorthand to make a one function testcase with the given points into a suite. */ +#define tmc_register_test(suite, tf, points) _tmc_register_test((suite), (tf), "" # tf, points) +void _tmc_register_test(Suite *s, TFun tf, const char *fname, const char *points); + +/** A shorthand to make one memory test for a test function with given parameters */ +#define tmc_register_memtest(tf, check_leaks, max_bytes_allocated) _tmc_register_memtest("" # tf, check_leaks, max_bytes_allocated) +void _tmc_register_memtest(const char *tf_name, int chek_leaks, int max_bytes_allocated); + +/** A shorthand for registering a test with memtest at the same time */ +#define tmc_register_test_with_memtest(suite, tf, points, check_leaks, max_bytes_allocated) tmc_register_test(suite, tf, points); tmc_register_memtest(tf, check_leaks, max_bytes_allocated) + +/** + * Runs a test suite so that tmc_test_results.xml and tmc_test_points.txt are created. + * + * To be called from main() after creating the Suite. + * + * If --print-available-points is given, it only outputs all available points + * (in an undefined order) to stdout and exits. + * + * Returns an error code that can be returned from main. + * Normally this will be 0 even if test fail. + */ +int tmc_run_tests(int argc, const char **argv, Suite *s); + + +/***** Low-level API *****/ + +/** + * Set the points of a test case. + * + * This is a lower level alternative to using tmc_register_test. + */ +void tmc_set_tcase_points(TCase *tc, const char *tc_name, const char *points); + +/** + * Set the points of a test suite + * + * This is a lower level alternative to using tmc_suite_create. + */ +void tmc_set_suite_points (Suite *s, const char *s_name, const char *points); + +/** Prints all registered points once (in no particular order) to the given file. */ +int tmc_print_available_points(FILE *f, char delimiter); +int tmc_print_memory_tests(FILE *f, char attr_delimiter, char line_delimiter); + +/** Prints lines like "[test] testname pointname1 pointname2" to the given file. */ +int tmc_print_test_points(FILE *f); +/** Prints lines with "[suite] suitename pointname1 pointname2" to given file */ +int tmc_print_suite_points(FILE *f); \ No newline at end of file diff --git a/scripts/create-project b/scripts/create-project new file mode 100755 index 0000000..d681496 --- /dev/null +++ b/scripts/create-project @@ -0,0 +1,45 @@ +#!/usr/bin/env ruby +require 'fileutils' + +include FileUtils +cd File.dirname(File.dirname(__FILE__)) + +if !ARGV[0] || ['-h', '--help'].include?(ARGV[0]) + puts"Creates a new project from the project template." + puts + puts "Usage: #{__FILE__} [category/]project-name" + puts + exit 0 +end + +def gsub_in_file!(filename, search, replacement) + text = File.read(filename) + text.gsub!(search, replacement) + File.open(filename, 'wb') {|f| f.write(text) } +end + + +dest_path = ARGV[0] + +dest_category = dest_path.split('/').reverse.drop(1).reverse.join('/') +dest_name = dest_path.split('/').last + +template_name = 'template_project' +template_path = "private/#{template_name}" + +puts "Copying from #{template_path} to #{dest_path}" +mkdir_p dest_category unless dest_category.empty? +cp_r template_path, dest_path + +puts "Replacing occurrences of #{template_name} with #{dest_name}" +files_with_project_name = [ + 'nbproject/project.xml' +] +for file in files_with_project_name + puts " in #{dest_path}/#{file}" + gsub_in_file!("#{dest_path}/#{file}", template_name, dest_name) +end + +puts +puts "Done!" +puts diff --git a/viikko1/demoTehtava/Makefile b/viikko1/demoTehtava/Makefile new file mode 100644 index 0000000..ed79bd8 --- /dev/null +++ b/viikko1/demoTehtava/Makefile @@ -0,0 +1,25 @@ +MAIN_DIR = src +TEST_DIR = test + +.PHONY: main test + +all: main test + +main: + $(MAKE) -C $(MAIN_DIR) + +test: + $(MAKE) -C $(TEST_DIR) + +clean: + $(MAKE) -C $(MAIN_DIR) clean + $(MAKE) -C $(TEST_DIR) clean + +get-points: + $(MAKE) -C $(TEST_DIR) get-points + +run-main: + $(MAKE) -C $(MAIN_DIR) run + +run-test: + $(MAKE) -C $(TEST_DIR) run diff --git a/viikko1/demoTehtava/nbproject/Package-Default.bash b/viikko1/demoTehtava/nbproject/Package-Default.bash new file mode 100644 index 0000000..0d70205 --- /dev/null +++ b/viikko1/demoTehtava/nbproject/Package-Default.bash @@ -0,0 +1,75 @@ +#!/bin/bash -x + +# +# Generated - do not edit! +# + +# Macros +TOP=`pwd` +CND_PLATFORM=GNU-MacOSX +CND_CONF=Default +CND_DISTDIR=dist +CND_BUILDDIR=build +NBTMPDIR=${CND_BUILDDIR}/${CND_CONF}/${CND_PLATFORM}/tmp-packaging +TMPDIRNAME=tmp-packaging +OUTPUT_PATH=MissingOutputInProject +OUTPUT_BASENAME=MissingOutputInProject +PACKAGE_TOP_DIR=setready-AES/ + +# Functions +function checkReturnCode +{ + rc=$? + if [ $rc != 0 ] + then + exit $rc + fi +} +function makeDirectory +# $1 directory path +# $2 permission (optional) +{ + mkdir -p "$1" + checkReturnCode + if [ "$2" != "" ] + then + chmod $2 "$1" + checkReturnCode + fi +} +function copyFileToTmpDir +# $1 from-file path +# $2 to-file path +# $3 permission +{ + cp "$1" "$2" + checkReturnCode + if [ "$3" != "" ] + then + chmod $3 "$2" + checkReturnCode + fi +} + +# Setup +cd "${TOP}" +mkdir -p ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package +rm -rf ${NBTMPDIR} +mkdir -p ${NBTMPDIR} + +# Copy files and create directories and links +cd "${TOP}" +makeDirectory "${NBTMPDIR}/setready-AES" +copyFileToTmpDir "${OUTPUT_PATH}" "${NBTMPDIR}/${PACKAGE_TOP_DIR}bin/${OUTPUT_BASENAME}" 0755 + + +# Generate tar file +cd "${TOP}" +rm -f ${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/setready-AES.tar +cd ${NBTMPDIR} +tar -vcf ../../../../${CND_DISTDIR}/${CND_CONF}/${CND_PLATFORM}/package/setready-AES.tar * +checkReturnCode + +# Cleanup +cd "${TOP}" +rm -rf ${NBTMPDIR} diff --git a/viikko1/demoTehtava/nbproject/configurations.xml b/viikko1/demoTehtava/nbproject/configurations.xml new file mode 100644 index 0000000..26cce7f --- /dev/null +++ b/viikko1/demoTehtava/nbproject/configurations.xml @@ -0,0 +1,51 @@ + + + + + + main.c + + + tmc-check.c + tmc-check.h + + + + Makefile + + + ^(nbproject)$ + + . + + Makefile + + + + LOCAL_SOURCES + default + + + + + + . + ${MAKE} -f Makefile + ${MAKE} -f Makefile clean + + + + + + + + + + + + + + diff --git a/viikko1/demoTehtava/nbproject/private/Default.properties b/viikko1/demoTehtava/nbproject/private/Default.properties new file mode 100644 index 0000000..e69de29 diff --git a/viikko1/demoTehtava/nbproject/private/configurations.xml b/viikko1/demoTehtava/nbproject/private/configurations.xml new file mode 100644 index 0000000..736456b --- /dev/null +++ b/viikko1/demoTehtava/nbproject/private/configurations.xml @@ -0,0 +1,39 @@ + + + Makefile + + + + localhost + 4 + + + + + + + + + + + + + + + gdb + + + + "${OUTPUT_PATH}" + + "${OUTPUT_PATH}" + . + true + 0 + 0 + + + + + + diff --git a/viikko1/demoTehtava/nbproject/private/private.xml b/viikko1/demoTehtava/nbproject/private/private.xml new file mode 100644 index 0000000..1c50948 --- /dev/null +++ b/viikko1/demoTehtava/nbproject/private/private.xml @@ -0,0 +1,11 @@ + + + + true + + + 0 + 0 + + + diff --git a/viikko1/demoTehtava/nbproject/project.xml b/viikko1/demoTehtava/nbproject/project.xml new file mode 100644 index 0000000..a6ea3e9 --- /dev/null +++ b/viikko1/demoTehtava/nbproject/project.xml @@ -0,0 +1,23 @@ + + + org.netbeans.modules.cnd.makeproject + + + demoTehtava + c + + h + UTF-8 + + + . + + + + Default + 0 + + + + + diff --git a/viikko1/demoTehtava/src/Makefile b/viikko1/demoTehtava/src/Makefile new file mode 100644 index 0000000..5247a67 --- /dev/null +++ b/viikko1/demoTehtava/src/Makefile @@ -0,0 +1,13 @@ +SRC_FILES=main.c tested.c + +all: main + +main: $(SRC_FILES) + gcc -Wall -o $@ $(SRC_FILES) + +clean: + rm -f main + +run: main + # Running our main function from file main.c + ./main diff --git a/viikko1/demoTehtava/src/main.c b/viikko1/demoTehtava/src/main.c new file mode 100644 index 0000000..1662620 --- /dev/null +++ b/viikko1/demoTehtava/src/main.c @@ -0,0 +1,6 @@ +#include + +int main( int argc, const char* argv[] ) +{ + printf( "\nHello World\n" ); +} \ No newline at end of file diff --git a/viikko1/demoTehtava/src/tested.c b/viikko1/demoTehtava/src/tested.c new file mode 100644 index 0000000..d0cbc12 --- /dev/null +++ b/viikko1/demoTehtava/src/tested.c @@ -0,0 +1,9 @@ +#include "tested.h" + +int my_sum_function(int a, int b) { + /* BEGIN SOLUTION */ + return a + b; + /* END SOLUTION */ + + /* STUB: return 0 */ +} \ No newline at end of file diff --git a/viikko1/demoTehtava/src/tested.h b/viikko1/demoTehtava/src/tested.h new file mode 100644 index 0000000..4809781 --- /dev/null +++ b/viikko1/demoTehtava/src/tested.h @@ -0,0 +1,5 @@ +#ifndef TESTED_H +#define TESTED_H +int my_sum_function(int a, int b); +#endif /* TESTED_H */ + diff --git a/viikko1/demoTehtava/test/Makefile b/viikko1/demoTehtava/test/Makefile new file mode 100644 index 0000000..98484e5 --- /dev/null +++ b/viikko1/demoTehtava/test/Makefile @@ -0,0 +1,20 @@ +CHECK_CFLAGS=$(shell pkg-config --cflags check) +CHECK_LDFLAGS=$(shell pkg-config --libs check) +SRC_FILES=tmc-check.c test-file.c ../src/tested.c + +all: test + +test: $(SRC_FILES) + gcc $(CHECK_CFLAGS) -Wall -o $@ $(SRC_FILES) $(CHECK_LDFLAGS) + +clean: + # rm -f test tmc_available_points.txt tmc_test_results.xml valgrind.log + +get-points: + ./test --print-available-points + +run: test + # Printing available points + ./test --print-available-points + # Running test. There should be one success and one failure. + ./test diff --git a/viikko1/demoTehtava/test/test b/viikko1/demoTehtava/test/test new file mode 100755 index 0000000000000000000000000000000000000000..6234d2e36399afa7ca0b55a15d89ff69e3397871 GIT binary patch literal 15192 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 literal 0 HcmV?d00001 diff --git a/viikko1/demoTehtava/test/test-file.c b/viikko1/demoTehtava/test/test-file.c new file mode 100644 index 0000000..f6239e4 --- /dev/null +++ b/viikko1/demoTehtava/test/test-file.c @@ -0,0 +1,20 @@ +#include +#include "tmc-check.h" +#include "../src/tested.h" +#include + + +START_TEST(my_first) +{ + fail_unless(my_sum_function(1, 2) == 3, "My own sum function should sum 1 and 2 resulting in 3"); +} +END_TEST + +int main(int argc, const char* argv[]) +{ + Suite *s = suite_create("Test suite"); + + tmc_register_test(s, my_first_test, "1.1"); + + return tmc_run_tests(argc, argv, s); +} diff --git a/viikko1/demoTehtava/test/tmc-check.c b/viikko1/demoTehtava/test/tmc-check.c new file mode 100644 index 0000000..1bc0b37 --- /dev/null +++ b/viikko1/demoTehtava/test/tmc-check.c @@ -0,0 +1,233 @@ + +#include "tmc-check.h" +#include +#include +#include +#include + +typedef struct SuitePoints +{ + Suite *s; + const char *s_name; + const char *points; + struct SuitePoints *next; +} SuitePoints; + +typedef struct PointsAssoc +{ + TCase *tc; + const char *tc_name; + const char *points; + struct PointsAssoc *next; +} PointsAssoc; + +typedef struct PointsList +{ + char *point; + struct PointsList *next; +} PointsList; + +typedef struct MemTest +{ + const char *tf_name; + int check_leaks; + int max_bytes_allocated; // Value -1 will represent no max_alloc check + struct MemTest *next; +} MemTest; + +static PointsAssoc *points_assocs = NULL; +static SuitePoints *suite_points = NULL; +static PointsList *all_points = NULL; +static MemTest *memtests = NULL; + +static void parse_points(const char *points, PointsList **target_list); +static void add_to_point_set(const char *point, ssize_t len, PointsList **target_list); +static int points_list_contains(const PointsList *list, const char *point, ssize_t len); + +void _tmc_register_memtest(const char *tf_name, int check_leaks, int max_bytes_allocated) +{ + MemTest *memtest = malloc(sizeof(MemTest)); + memtest->tf_name = tf_name; + memtest->check_leaks = check_leaks; + memtest->max_bytes_allocated = max_bytes_allocated; + + memtest->next = memtests; + memtests = memtest; +} + +void tmc_set_tcase_points(TCase *tc, const char *tc_name, const char *points) +{ + PointsAssoc *pa = (PointsAssoc*)malloc(sizeof(PointsAssoc)); + pa->tc = tc; + pa->tc_name = tc_name; + pa->points = points; + pa->next = points_assocs; + points_assocs = pa; + + parse_points(points, &all_points); +} + +void _tmc_register_test(Suite *s, TFun tf, const char *fname, const char *points) +{ + TCase *tc = tcase_create(fname); + tmc_set_tcase_points(tc, fname, points); + _tcase_add_test(tc, tf, fname, 0, 0, 0, 1); + suite_add_tcase(s, tc); +} + +void tmc_set_suite_points(Suite *s, const char *s_name, const char *points) +{ + SuitePoints *sp = (SuitePoints*) malloc(sizeof(SuitePoints)); + sp->s = s; + sp->points = points; + sp->s_name = s_name; + sp->next = suite_points; + suite_points = sp; + + parse_points(points, &all_points); +} + +Suite* tmc_suite_create(const char *name, const char *points) +{ + Suite *s = suite_create(name); + tmc_set_suite_points(s, name, points); + return s; +} + +int tmc_run_tests(int argc, const char **argv, Suite *s) +{ + int i; + for (i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--print-available-points") == 0) { + return tmc_print_available_points(stdout, '\n'); + } + + if (strcmp(argv[i], "--print-memory-tests") == 0) { + return tmc_print_memory_tests(stdout, ' ', '\n'); + } + } + + FILE *points_file = fopen("tmc_available_points.txt", "wb"); + FILE *memtest_file = fopen("tmc_memory_test_info.txt", "wb"); + if (tmc_print_suite_points(points_file) != 0) { + fclose(points_file); + return EXIT_FAILURE; + } + if (tmc_print_test_points(points_file) != 0) { + fclose(points_file); + return EXIT_FAILURE; + } + if (tmc_print_memory_tests(memtest_file, ' ', '\n') != 0) { + fclose(memtest_file); + return EXIT_FAILURE; + } + fclose(points_file); + fclose(memtest_file); + + SRunner *sr = srunner_create(s); + srunner_set_xml(sr, "tmc_test_results.xml"); + srunner_run_all(sr, CK_VERBOSE); + srunner_free(sr); + + return EXIT_SUCCESS; +} + +int tmc_print_available_points(FILE *f, char delimiter) +{ + const PointsList *pl = all_points; + while (pl != NULL) { + fputs(pl->point, f); + fputc(delimiter, f); + pl = pl->next; + } + fflush(f); + return 0; +} + +int tmc_print_memory_tests(FILE *f, char attr_delimiter, char line_delimiter) +{ + const MemTest *mt = memtests; + while (mt != NULL) { + fputs(mt->tf_name, f); + fputc(attr_delimiter, f); + fprintf(f, "%d", mt->check_leaks); + fputc(attr_delimiter, f); + fprintf(f, "%d", mt->max_bytes_allocated); + fputc(line_delimiter, f); + mt = mt->next; + } + fflush(f); + return 0; +} + +int tmc_print_test_points(FILE *f) +{ + const PointsAssoc *pa = points_assocs; + while (pa != NULL) { + fprintf(f, "[test] %s %s\n", pa->tc_name, pa->points); + pa = pa->next; + } + fflush(f); + return 0; +} + +int tmc_print_suite_points(FILE *f) +{ + const SuitePoints *sp = suite_points; + while (sp != NULL) { + fprintf(f, "[suite] %s %s\n", sp->s_name, sp->points); + sp = sp->next; + } + fflush(f); + return 0; +} + +static void parse_points(const char *points, PointsList **target_list) +{ + const char *p = points; + const char *q = p; + while (*q != '\0') { + if (isspace(*q)) { + const ssize_t len = q - p; + + if (!isspace(*p)) { + add_to_point_set(p, len, target_list); + } + + p = q + 1; + q = p; + } else { + q++; + } + } + + if (!isspace(*p) && q > p) { + const ssize_t len = q - p; + add_to_point_set(p, len, target_list); + } +} + +static void add_to_point_set(const char *point, ssize_t len, PointsList **target_list) +{ + if (!points_list_contains(*target_list, point, len)) { + PointsList *pl = (PointsList*)malloc(sizeof(PointsList)); + pl->point = malloc(len + 1); + memcpy(pl->point, point, len); + pl->point[len] = '\0'; + pl->next = *target_list; + *target_list = pl; + } +} + +static int points_list_contains(const PointsList *list, const char *point, ssize_t len) +{ + const PointsList *pl = all_points; + while (pl != NULL) { + if (strncmp(pl->point, point, len) == 0) { + return 1; + } + pl = pl->next; + } + return 0; +} + diff --git a/viikko1/demoTehtava/test/tmc-check.h b/viikko1/demoTehtava/test/tmc-check.h new file mode 100644 index 0000000..8100cbb --- /dev/null +++ b/viikko1/demoTehtava/test/tmc-check.h @@ -0,0 +1,58 @@ + +#include +#include + +/***** Main API *****/ + +/** A shorthand to make one test suite with the given points */ +Suite* tmc_suite_create(const char *name, const char *points); + +/** A shorthand to make a one function testcase with the given points into a suite. */ +#define tmc_register_test(suite, tf, points) _tmc_register_test((suite), (tf), "" # tf, points) +void _tmc_register_test(Suite *s, TFun tf, const char *fname, const char *points); + +/** A shorthand to make one memory test for a test function with given parameters */ +#define tmc_register_memtest(tf, check_leaks, max_bytes_allocated) _tmc_register_memtest("" # tf, check_leaks, max_bytes_allocated) +void _tmc_register_memtest(const char *tf_name, int chek_leaks, int max_bytes_allocated); + +/** A shorthand for registering a test with memtest at the same time */ +#define tmc_register_test_with_memtest(suite, tf, points, check_leaks, max_bytes_allocated) tmc_register_test(suite, tf, points); tmc_register_memtest(tf, check_leaks, max_bytes_allocated) + +/** + * Runs a test suite so that tmc_test_results.xml and tmc_test_points.txt are created. + * + * To be called from main() after creating the Suite. + * + * If --print-available-points is given, it only outputs all available points + * (in an undefined order) to stdout and exits. + * + * Returns an error code that can be returned from main. + * Normally this will be 0 even if test fail. + */ +int tmc_run_tests(int argc, const char **argv, Suite *s); + + +/***** Low-level API *****/ + +/** + * Set the points of a test case. + * + * This is a lower level alternative to using tmc_register_test. + */ +void tmc_set_tcase_points(TCase *tc, const char *tc_name, const char *points); + +/** + * Set the points of a test suite + * + * This is a lower level alternative to using tmc_suite_create. + */ +void tmc_set_suite_points (Suite *s, const char *s_name, const char *points); + +/** Prints all registered points once (in no particular order) to the given file. */ +int tmc_print_available_points(FILE *f, char delimiter); +int tmc_print_memory_tests(FILE *f, char attr_delimiter, char line_delimiter); + +/** Prints lines like "[test] testname pointname1 pointname2" to the given file. */ +int tmc_print_test_points(FILE *f); +/** Prints lines with "[suite] suitename pointname1 pointname2" to given file */ +int tmc_print_suite_points(FILE *f); \ No newline at end of file diff --git a/viikko1/demoTehtava/test/tmc_available_points.txt b/viikko1/demoTehtava/test/tmc_available_points.txt new file mode 100644 index 0000000..89538e3 --- /dev/null +++ b/viikko1/demoTehtava/test/tmc_available_points.txt @@ -0,0 +1,2 @@ +[test] my_first_real_test 1.2 +[test] my_first_test 1.1 diff --git a/viikko1/demoTehtava/test/tmc_memory_test_info.txt b/viikko1/demoTehtava/test/tmc_memory_test_info.txt new file mode 100644 index 0000000..e69de29 diff --git a/viikko1/demoTehtava/test/tmc_test_results.xml b/viikko1/demoTehtava/test/tmc_test_results.xml new file mode 100644 index 0000000..f9cf2c6 --- /dev/null +++ b/viikko1/demoTehtava/test/tmc_test_results.xml @@ -0,0 +1,24 @@ + + + 2013-05-08 12:07:36 + + Test suite + + . + test-file.c:8 + my_first_test + 0 + my_first_test + Passed + + + . + test-file.c:14 + my_first_real_test + 0 + my_first_real_test + Passed + + + 0.000000 +