From 4032fd5cbc34eb90c9de916ef20fcd0a0ededf6a Mon Sep 17 00:00:00 2001 From: Ueli Niederer Date: Sun, 8 Mar 2020 00:37:49 +0100 Subject: [PATCH] Make sure that existing messages for a test case are not overwritten --- CuTest.c | 10 +++-- CuTestTest.c | 119 ++++++++++++++++++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 42 deletions(-) diff --git a/CuTest.c b/CuTest.c index bec2438..f7446b0 100644 --- a/CuTest.c +++ b/CuTest.c @@ -158,9 +158,13 @@ static void CuFailInternal(CuTest* tc, const char* file, int line, CuString* str CuStringInsert(string, buf, 0); tc->failed = 1; - free(tc->message); - tc->message = CuStringNew(); - CuStringAppend(tc->message, string->buffer); + if (NULL != tc->message) { + CuStringAppend(tc->message, "\n"); + } + else { + tc->message = CuStringNew(); + } + CuStringAppend(tc->message, string->buffer); if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); } diff --git a/CuTestTest.c b/CuTestTest.c index e075186..b4c00a7 100644 --- a/CuTestTest.c +++ b/CuTestTest.c @@ -170,24 +170,30 @@ void TestCuTestInit(CuTest *tc) void TestCuAssert(CuTest* tc) { + CuTest tc1; + CuTestInit(&tc1, "MyTest", TestPasses); + CuAssert(&tc1, "test 1", 5 == 4 + 1); + CuAssertTrue(tc, !tc1.failed); + CuAssertTrue(tc, tc1.message == NULL); + CuTest tc2; CuTestInit(&tc2, "MyTest", TestPasses); - - CuAssert(&tc2, "test 1", 5 == 4 + 1); - CuAssertTrue(tc, !tc2.failed); - CuAssertTrue(tc, tc2.message == NULL); - CuAssert(&tc2, "test 2", 0); CuAssertTrue(tc, tc2.failed); CompareAsserts(tc, "CuAssert didn't fail", "test 2", tc2.message); - CuAssert(&tc2, "test 3", 1); - CuAssertTrue(tc, tc2.failed); - CompareAsserts(tc, "CuAssert didn't fail", "test 2", tc2.message); + CuTest tc3; + CuTestInit(&tc3, "MyTest", TestPasses); + CuAssert(&tc3, "test 2", 0); + CuAssert(&tc3, "test 3", 1); + CuAssertTrue(tc, tc3.failed); + CompareAsserts(tc, "CuAssert didn't fail", "test 2", tc3.message); - CuAssert(&tc2, "test 4", 0); - CuAssertTrue(tc, tc2.failed); - CompareAsserts(tc, "CuAssert didn't fail", "test 4", tc2.message); + CuTest tc4; + CuTestInit(&tc4, "MyTest", TestPasses); + CuAssert(&tc4, "test 4", 0); + CuAssertTrue(tc, tc4.failed); + CompareAsserts(tc, "CuAssert didn't fail", "test 4", tc4.message); } @@ -528,18 +534,21 @@ void TestFail(CuTest* tc) void TestAssertStrEquals(CuTest* tc) { jmp_buf buf; - CuTest *tc2 = CuTestNew("TestAssertStrEquals", zTestFails); const char* expected = "expected but was "; const char *expectedMsg = "some text: expected but was "; - tc2->jumpBuf = &buf; + CuTest *tc1 = CuTestNew("TestAssertStrEquals", zTestFails); + tc1->jumpBuf = &buf; if (setjmp(buf) == 0) { - CuAssertStrEquals(tc2, "hello", "world"); + CuAssertStrEquals(tc1, "hello", "world"); } - CuAssertTrue(tc, tc2->failed); - CompareAsserts(tc, "CuAssertStrEquals failed", expected, tc2->message); + CuAssertTrue(tc, tc1->failed); + CompareAsserts(tc, "CuAssertStrEquals failed", expected, tc1->message); + + CuTest *tc2 = CuTestNew("TestAssertStrEquals", zTestFails); + tc2->jumpBuf = &buf; if (setjmp(buf) == 0) { CuAssertStrEquals_Msg(tc2, "some text", "hello", "world"); @@ -571,18 +580,21 @@ void TestAssertStrEquals_NULL(CuTest* tc) void TestAssertStrEquals_FailNULLStr(CuTest* tc) { jmp_buf buf; - CuTest *tc2 = CuTestNew("TestAssertStrEquals_FailNULLStr", zTestFails); const char* expected = "expected but was "; const char *expectedMsg = "some text: expected but was "; - tc2->jumpBuf = &buf; + CuTest *tc1 = CuTestNew("TestAssertStrEquals_FailNULLStr", zTestFails); + tc1->jumpBuf = &buf; if (setjmp(buf) == 0) { - CuAssertStrEquals(tc2, "hello", NULL); + CuAssertStrEquals(tc1, "hello", NULL); } - CuAssertTrue(tc, tc2->failed); - CompareAsserts(tc, "CuAssertStrEquals_FailNULLStr failed", expected, tc2->message); + CuAssertTrue(tc, tc1->failed); + CompareAsserts(tc, "CuAssertStrEquals_FailNULLStr failed", expected, tc1->message); + + CuTest *tc2 = CuTestNew("TestAssertStrEquals_FailNULLStr", zTestFails); + tc2->jumpBuf = &buf; if (setjmp(buf) == 0) { CuAssertStrEquals_Msg(tc2, "some text", "hello", NULL); @@ -594,18 +606,20 @@ void TestAssertStrEquals_FailNULLStr(CuTest* tc) void TestAssertStrEquals_FailStrNULL(CuTest* tc) { jmp_buf buf; - CuTest *tc2 = CuTestNew("TestAssertStrEquals_FailStrNULL", zTestFails); - const char* expected = "expected but was "; const char *expectedMsg = "some text: expected but was "; - tc2->jumpBuf = &buf; + CuTest *tc1 = CuTestNew("TestAssertStrEquals_FailStrNULL", zTestFails); + tc1->jumpBuf = &buf; if (setjmp(buf) == 0) { - CuAssertStrEquals(tc2, NULL, "hello"); + CuAssertStrEquals(tc1, NULL, "hello"); } - CuAssertTrue(tc, tc2->failed); - CompareAsserts(tc, "CuAssertStrEquals_FailStrNULL failed", expected, tc2->message); + CuAssertTrue(tc, tc1->failed); + CompareAsserts(tc, "CuAssertStrEquals_FailStrNULL failed", expected, tc1->message); + + CuTest *tc2 = CuTestNew("TestAssertStrEquals_FailStrNULL", zTestFails); + tc2->jumpBuf = &buf; if (setjmp(buf) == 0) { CuAssertStrEquals_Msg(tc2, "some text", NULL, "hello"); @@ -617,16 +631,19 @@ void TestAssertStrEquals_FailStrNULL(CuTest* tc) void TestAssertIntEquals(CuTest* tc) { jmp_buf buf; - CuTest *tc2 = CuTestNew("TestAssertIntEquals", zTestFails); + CuTest *tc1 = CuTestNew("TestAssertIntEquals", zTestFails); const char* expected = "expected <42> but was <32>"; const char* expectedMsg = "some text: expected <42> but was <32>"; - tc2->jumpBuf = &buf; + tc1->jumpBuf = &buf; if (setjmp(buf) == 0) { - CuAssertIntEquals(tc2, 42, 32); + CuAssertIntEquals(tc1, 42, 32); } - CuAssertTrue(tc, tc2->failed); - CompareAsserts(tc, "CuAssertIntEquals failed", expected, tc2->message); + CuAssertTrue(tc, tc1->failed); + CompareAsserts(tc, "CuAssertIntEquals failed", expected, tc1->message); + + CuTest *tc2 = CuTestNew("TestAssertIntEquals", zTestFails); + tc2->jumpBuf = &buf; if (setjmp(buf) == 0) { CuAssertIntEquals_Msg(tc2, "some text", 42, 32); @@ -663,13 +680,15 @@ void TestAssertDblEquals(CuTest* tc) } CuAssertTrue(tc, tc2->failed); CompareAsserts(tc, "CuAssertDblEquals failed", expected, tc2->message); - tc2->jumpBuf = &buf; + + CuTest *tc3 = CuTestNew("TestAssertDblEquals", zTestFails); + tc3->jumpBuf = &buf; if (setjmp(buf) == 0) { - CuAssertDblEquals_Msg(tc2, "some text", x, y, 0.001); + CuAssertDblEquals_Msg(tc3, "some text", x, y, 0.001); } - CuAssertTrue(tc, tc2->failed); - CompareAsserts(tc, "CuAssertDblEquals failed", expectedMsg, tc2->message); + CuAssertTrue(tc, tc3->failed); + CompareAsserts(tc, "CuAssertDblEquals failed", expectedMsg, tc3->message); } /*-------------------------------------------------------------------------* @@ -763,7 +782,7 @@ static void FrameMockSetup(CuTest *tc) { TestPhaseRecord(&TestMockData.tracker, SETUP); - CuAssert(tc, "Have to fail", !fail); + CuAssert(tc, "Setup has to fail", !fail); TestMockData.setupContinuedAfterAssert = true; } @@ -774,7 +793,7 @@ static void FrameMockTest(CuTest *tc) { TestPhaseRecord(&TestMockData.tracker, TEST); TestMockData.ContextPassed = CuTestContextGet(tc); - CuAssert(tc, "Have to fail", !fail); + CuAssert(tc, "Test has to fail", !fail); TestMockData.testContinuedAfterAssert = true; } @@ -784,7 +803,7 @@ static void FrameMockTearDown(CuTest *tc) { TestPhaseRecord(&TestMockData.tracker, TEARDOWN); - CuAssert(tc, "Have to fail", !fail); + CuAssert(tc, "Teardown has to fail", !fail); TestMockData.teardownContinuedAfterAssert = true; } @@ -882,6 +901,27 @@ static void TestSuiteTeardownIsExecutedIfTestFails(CuTest *tc) { TestPhaseNoMoreEventsFrom(tc, tracker, 3); } +static void TestSuiteFailingTestMessageIsPreservedWhenTeardownFails(CuTest *tc) { + int context = 0; + TestMockDataInit(); + CuSuite* uut = CuSuiteNewWithFrame(&FrameMock, &context); + + SUITE_ADD_TEST(uut, FrameMockTest); + + TestMockData.testShallFail = true; + TestMockData.teardownShallFail = true; + + CuSuiteRun(uut); + + char *message = uut->list[0]->message->buffer; + char *testFailMsg = strstr(message, "Test has to fail\n"); + char *teardownFailMsg = strstr(message, "Teardown has to fail"); + + CuAssertPtrNotNullMsg(tc, "Test fail message not found", testFailMsg); + CuAssertPtrNotNullMsg(tc, "Teardown fail message not found", teardownFailMsg); + CuAssert(tc, "Message order correct", testFailMsg < teardownFailMsg); +} + static void TestSuiteContextPassedToCuTest(CuTest *tc) { int context = 0; TestMockDataInit(); @@ -1001,6 +1041,7 @@ CuSuite* CuSuiteFrameGetSuite(void) { SUITE_ADD_TEST(suite, TestSuiteTestFailsIfSetupFails); SUITE_ADD_TEST(suite, TestSuiteTestFailsIfTeardownFails); SUITE_ADD_TEST(suite, TestSuiteTeardownIsExecutedIfTestFails); + SUITE_ADD_TEST(suite, TestSuiteFailingTestMessageIsPreservedWhenTeardownFails); SUITE_ADD_TEST(suite, TestSuiteContextPassedToCuTest); SUITE_ADD_TEST(suite, TestSuiteSetupInterruptsUponFailedAssert); SUITE_ADD_TEST(suite, TestSuiteTestInterruptsUponFailedAssert);