172 lines
4.5 KiB
C
172 lines
4.5 KiB
C
/* ----------------------------------------------------------------------------
|
|
* -- _____ ______ _____ -
|
|
* -- |_ _| | ____|/ ____| -
|
|
* -- | | _ __ | |__ | (___ Institute of Embedded Systems -
|
|
* -- | | | '_ \| __| \___ \ Zuercher Hochschule Winterthur -
|
|
* -- _| |_| | | | |____ ____) | (University of Applied Sciences) -
|
|
* -- |_____|_| |_|______|_____/ 8401 Winterthur, Switzerland -
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
/**
|
|
* @file
|
|
* @brief Test suite for the given package.
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <CUnit/Basic.h>
|
|
#include "test_utils.h"
|
|
|
|
#ifndef TARGET // must be given by the make file --> see test target
|
|
#error missing TARGET define
|
|
#endif
|
|
|
|
/// @brief The name of the STDOUT text file.
|
|
#define OUTFILE "stdout.txt"
|
|
/// @brief The name of the STDERR text file.
|
|
#define ERRFILE "stderr.txt"
|
|
/// @brief Some test output file
|
|
#define EMPTYFILE "EmptyFile.txt"
|
|
/// @brief Some test output file
|
|
#define NONEMPTYFILE "NonEmptyFile.txt"
|
|
/// @brief Some test output file
|
|
#define NONEMPTYFILE_NONLEND "NonEmptyFileNoNlEnd.txt"
|
|
|
|
// setup & teardown
|
|
static int setup(void)
|
|
{
|
|
remove_file_if_exists(OUTFILE);
|
|
remove_file_if_exists(ERRFILE);
|
|
remove_file_if_exists(EMPTYFILE);
|
|
remove_file_if_exists(NONEMPTYFILE);
|
|
remove_file_if_exists(NONEMPTYFILE_NONLEND);
|
|
// do nothing
|
|
return 0; // success
|
|
}
|
|
static int teardown(void)
|
|
{
|
|
// do nothing
|
|
return 0; // success
|
|
}
|
|
|
|
|
|
// tests
|
|
static void test_remove_file_that_exists(void)
|
|
{
|
|
// ** arrange **
|
|
|
|
// create a file
|
|
FILE *file = fopen(OUTFILE, "w");
|
|
CU_ASSERT_PTR_NOT_NULL(file);
|
|
CU_ASSERT_EQUAL(fclose(file), 0);
|
|
errno = 0;
|
|
|
|
// ** act **
|
|
remove_file_if_exists(OUTFILE);
|
|
|
|
// ** assert **
|
|
|
|
// make sure the file is removed
|
|
CU_ASSERT_EQUAL(errno, 0);
|
|
file = fopen(OUTFILE, "r");
|
|
CU_ASSERT_TRUE(!file && errno == ENOENT);
|
|
// cleanup gracefully
|
|
if (file) CU_ASSERT_EQUAL(fclose(file), 0);
|
|
errno = 0;
|
|
}
|
|
static void test_remove_file_that_does_not_exist(void)
|
|
{
|
|
// ** arrange **
|
|
remove_file_if_exists(OUTFILE);
|
|
// the file is now supposed to not exist any more --> see test_remove_file_that_exists test result
|
|
|
|
// ** act **
|
|
|
|
// call with a not existing file
|
|
remove_file_if_exists(OUTFILE);
|
|
// must not fail in any internal assertion
|
|
|
|
// ** assert **
|
|
|
|
// make sure the file is removed
|
|
CU_ASSERT_EQUAL(errno, 0);
|
|
FILE *file = fopen(OUTFILE, "r");
|
|
CU_ASSERT_TRUE(!file && errno == ENOENT);
|
|
// cleanup gracefully
|
|
if (file) CU_ASSERT_EQUAL(fclose(file), 0);
|
|
errno = 0;
|
|
}
|
|
|
|
static void test_assert_lines_empty_file(void)
|
|
{
|
|
// ** arrange **
|
|
|
|
// empty file
|
|
remove_file_if_exists(EMPTYFILE);
|
|
FILE *file = fopen(EMPTYFILE, "w");
|
|
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
|
CU_ASSERT_EQUAL(fclose(file), 0);
|
|
const char *lines[] = { NULL };
|
|
|
|
// ** act **
|
|
assert_lines(EMPTYFILE, lines, sizeof(lines)/sizeof(*lines));
|
|
|
|
// ** assert **
|
|
|
|
// no assertions should have happened within assert_lines(...)
|
|
}
|
|
static void test_assert_lines_non_empty_file(void)
|
|
{
|
|
// ** arrange **
|
|
|
|
// reference file
|
|
remove_file_if_exists(NONEMPTYFILE);
|
|
FILE *file = fopen(NONEMPTYFILE, "w");
|
|
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
|
CU_ASSERT_EQUAL(fprintf(file, "LINE1\n"), 6);
|
|
CU_ASSERT_EQUAL(fprintf(file, "LINE2\n"), 6);
|
|
CU_ASSERT_EQUAL(fclose(file), 0);
|
|
const char *lines[] = { "LINE1\n", "LINE2\n"};
|
|
|
|
// ** act **
|
|
assert_lines(NONEMPTYFILE, lines, sizeof(lines)/sizeof(*lines));
|
|
|
|
// ** assert **
|
|
|
|
// no assertions should have happened within assert_lines(...)
|
|
}
|
|
static void test_assert_lines_no_newline_at_the_end(void)
|
|
{
|
|
// ** arrange **
|
|
|
|
// reference file
|
|
remove_file_if_exists(NONEMPTYFILE_NONLEND);
|
|
FILE *file = fopen(NONEMPTYFILE_NONLEND, "w");
|
|
CU_ASSERT_PTR_NOT_NULL_FATAL(file);
|
|
CU_ASSERT_EQUAL(fprintf(file, "LINE1\n"), 6);
|
|
CU_ASSERT_EQUAL(fprintf(file, "LINE2"), 5);
|
|
CU_ASSERT_EQUAL(fclose(file), 0);
|
|
const char *lines[] = { "LINE1\n", "LINE2"};
|
|
|
|
// ** act **
|
|
assert_lines(NONEMPTYFILE_NONLEND, lines, sizeof(lines)/sizeof(*lines));
|
|
|
|
// ** assert **
|
|
|
|
// no assertions should have happened within assert_lines(...)
|
|
}
|
|
|
|
/**
|
|
* @brief Registers and runs the tests.
|
|
* @returns success (==0) or error (!= 0)
|
|
*/
|
|
int main(void)
|
|
{
|
|
TestMainBasic("PROGC Test Lib", setup, teardown
|
|
, test_remove_file_that_exists
|
|
, test_remove_file_that_does_not_exist
|
|
, test_assert_lines_empty_file
|
|
, test_assert_lines_non_empty_file
|
|
, test_assert_lines_no_newline_at_the_end
|
|
);
|
|
}
|