From ec688b4723a041044226358bcd4dd6e2da39da49 Mon Sep 17 00:00:00 2001 From: Luca Muscariello Date: Thu, 23 Feb 2017 17:01:02 +0100 Subject: Initial commit: cframework. Longbow and Libparc Change-Id: I90378dbd30da6033b20fb1f829b3b822cf366c59 Signed-off-by: Luca Muscariello --- libparc/parc/algol/test/test_parc_BufferComposer.c | 448 +++++++++++++++++++++ 1 file changed, 448 insertions(+) create mode 100644 libparc/parc/algol/test/test_parc_BufferComposer.c (limited to 'libparc/parc/algol/test/test_parc_BufferComposer.c') diff --git a/libparc/parc/algol/test/test_parc_BufferComposer.c b/libparc/parc/algol/test/test_parc_BufferComposer.c new file mode 100644 index 00000000..fad9857c --- /dev/null +++ b/libparc/parc/algol/test/test_parc_BufferComposer.c @@ -0,0 +1,448 @@ +/* + * Copyright (c) 2017 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +// Include the file(s) containing the functions to be tested. +// This permits internal static functions to be visible to this Test Framework. +#include "../parc_BufferComposer.c" + +#include +#include +#include + +#include +#include + +typedef struct { + uint32_t setupAllocations; + PARCBufferComposer *composer; +} TestData; + +static TestData* +commonSetup() +{ + uint32_t outstanding = parcSafeMemory_Outstanding(); + TestData *data = parcMemory_AllocateAndClear(sizeof(TestData)); + assertNotNull(data, "parcMemory_AllocateAndClear of %zu bytes returned NULL.", sizeof(TestData)); + data->setupAllocations = outstanding; + data->composer = parcBufferComposer_Create(); + return data; +} + +static uint32_t +commonTearDown(TestData *data) +{ + uint32_t setupAllocations = data->setupAllocations; + + // NOTE: The `parcBufferComposer_AssertValid_IncrementSize` invalidates this object, so we must + // restore it to a good state in order for all memory to be released correctly. + (data->composer)->incrementHeuristic = sizeof(void *); + + parcBufferComposer_Release(&(data->composer)); + parcMemory_Deallocate((void **) &data); + return parcSafeMemory_ReportAllocation(STDOUT_FILENO) - setupAllocations; +} + +LONGBOW_TEST_RUNNER(parc_BufferComposer) +{ + // The following Test Fixtures will run their corresponding Test Cases. + // Test Fixtures are run in the order specified, but all tests should be idempotent. + // Never rely on the execution order of tests or share state between them. + LONGBOW_RUN_TEST_FIXTURE(Global); +} + +// The Test Runner calls this function once before any Test Fixtures are run. +LONGBOW_TEST_RUNNER_SETUP(parc_BufferComposer) +{ + return LONGBOW_STATUS_SUCCEEDED; +} + +// The Test Runner calls this function once after all the Test Fixtures are run. +LONGBOW_TEST_RUNNER_TEARDOWN(parc_BufferComposer) +{ + return LONGBOW_STATUS_SUCCEEDED; +} + +LONGBOW_TEST_FIXTURE(Global) +{ + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Acquire); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Allocate); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Allocate_SizeMax); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_AssertValid); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_AssertValid_NULL); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_AssertValid_IncrementSize); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Create); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Equals); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutArray); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutBuffer); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutUint16); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutUint32); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutUint64); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutUint8); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutString); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutStrings); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_Format); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutChar); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_GetBuffer); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_CreateBuffer); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_ProduceBuffer); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_PutString_Extend); + LONGBOW_RUN_TEST_CASE(Global, parcBufferComposer_ToString); +} + +LONGBOW_TEST_FIXTURE_SETUP(Global) +{ + TestData *data = commonSetup(); + longBowTestCase_SetClipBoardData(testCase, data); + return LONGBOW_STATUS_SUCCEEDED; +} + +LONGBOW_TEST_FIXTURE_TEARDOWN(Global) +{ + TestData *data = longBowTestCase_GetClipBoardData(testCase); + + uint32_t outstandingAllocations = commonTearDown(data); + + if (outstandingAllocations != 0) { + printf("%s leaks %d memory allocations\n", longBowTestCase_GetName(testCase), outstandingAllocations); + return LONGBOW_STATUS_MEMORYLEAK; + } + return LONGBOW_STATUS_SUCCEEDED; +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Acquire) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + PARCBufferComposer *handle = parcBufferComposer_Acquire(composer); + + assertNotNull(handle, "Acquired PARCBufferComposer handle should be non-NULL."); + assertTrue(parcBufferComposer_Equals(composer, handle), "PARCBufferComposer instances should be equal"); + + parcBufferComposer_Release(&handle); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Allocate) +{ + size_t size = 10; + PARCBufferComposer *composer = parcBufferComposer_Allocate(size); + PARCBuffer *buffer = parcBufferComposer_GetBuffer(composer); + + assertNotNull(composer, "PARCBufferComposer instance should be non-NULL."); + assertTrue(parcBuffer_Limit(buffer) == size, + "PARCBufferComposer instance's internal PARCBuffer limit must be %zu: %zu", size, parcBuffer_Limit(buffer)); + + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Allocate_SizeMax) +{ + size_t size = SIZE_MAX; + PARCBufferComposer *composer = parcBufferComposer_Allocate(size); + + assertNull(composer, "PARCBufferComposer instance should be NULL."); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_AssertValid) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + assertNotNull(composer, "PARCBufferComposer instance should be non-NULL."); + parcBufferComposer_AssertValid(composer); + + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE_EXPECTS(Global, parcBufferComposer_AssertValid_NULL, .event = &LongBowTrapIllegalValue) +{ + parcBufferComposer_AssertValid(NULL); +} + +LONGBOW_TEST_CASE_EXPECTS(Global, parcBufferComposer_AssertValid_IncrementSize, .event = &LongBowTrapIllegalValue) +{ + TestData *data = longBowTestCase_GetClipBoardData(testCase); + (data->composer)->incrementHeuristic = 0; // must be >= sizeof(void *) + parcBufferComposer_AssertValid(data->composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Create) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + assertNotNull(composer, "PARCBufferComposer instance should be non-NULL."); + + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Equals) +{ + PARCBufferComposer *x = parcBufferComposer_Create(); + PARCBufferComposer *y = parcBufferComposer_Create(); + PARCBufferComposer *z = parcBufferComposer_Create(); + PARCBufferComposer *u = parcBufferComposer_Allocate(10); + + parcObjectTesting_AssertEqualsFunction(parcBufferComposer_Equals, x, y, z, u); + + u->incrementHeuristic = 0; + assertFalse(parcBufferComposer_Equals(x, u), "PARCBufferComposer instances should be unequal due to size increments."); + assertFalse(parcBufferComposer_Equals(x, NULL), "Equals should return false since the second parameter is NULL."); + u->incrementHeuristic = sizeof(void *); + + parcBufferComposer_Release(&x); + parcBufferComposer_Release(&y); + parcBufferComposer_Release(&z); + parcBufferComposer_Release(&u); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_ToString) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + parcBufferComposer_Format(composer, "hello %s", "world"); + + char *string = parcBufferComposer_ToString(composer); + + assertNotNull(string, "Expected non-NULL result from parcBufferComposer_ToString"); + + parcMemory_Deallocate((void **) &string); + + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_GetBuffer) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + PARCBuffer *buffer = parcBufferComposer_GetBuffer(composer); + + assertNotNull(composer, "PARCBufferComposer instance should be non-NULL."); + assertNotNull(buffer, "PARCBufferComposer instance's internal PARCBuffer should not be NULL"); + + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutArray) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + uint8_t string[6] = { 'h', 'e', 'l', 'l', 'o', '\0' }; + parcBufferComposer_PutArray(composer, string, 6); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + + char expected[5] = "hello"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 5) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutBuffer) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + PARCBuffer *insertee = parcBuffer_WrapCString("hello world"); + parcBufferComposer_PutBuffer(composer, insertee); + parcBuffer_Release(&insertee); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + + char expected[11] = "hello world"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 11) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutUint16) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + uint16_t val = 0x0101; + parcBufferComposer_PutUint16(composer, val); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + assertTrue(parcBuffer_GetUint16(buffer) == val, "Expected inserted uint16_t to be equal to %x, got %x", val, parcBuffer_GetUint16(buffer)); + + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutUint32) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + uint32_t val = 0x0101FFFF; + parcBufferComposer_PutUint32(composer, val); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + assertTrue(parcBuffer_GetUint32(buffer) == val, "Expected inserted uint32_t to be equal to %x, got %x", val, parcBuffer_GetUint32(buffer)); + + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutUint64) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + uint64_t val = 0x0101FFFFABCD0123; + parcBufferComposer_PutUint64(composer, val); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + assertTrue(parcBuffer_GetUint64(buffer) == val, + "Expected inserted uint64_t to be equal to %" PRIu64 ", got %" PRIu64 "", val, parcBuffer_GetUint64(buffer)); + + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutUint8) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + uint8_t byte = 0x01; + parcBufferComposer_PutUint8(composer, byte); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + assertTrue(parcBuffer_GetUint8(buffer) == byte, "Expected inserted byte to be equal to %x, got %x", byte, parcBuffer_GetUint8(buffer)); + + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutString) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + char string[14] = "Hello, World!"; + parcBufferComposer_PutString(composer, string); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(actual, string, strlen(string)) == 0, + "Expected inserted string to be equal to %s, got %s", string, actual); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutStrings) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + char string[14] = "Hello, World!"; + parcBufferComposer_PutStrings(composer, "Hello", ", ", "World!", NULL); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(actual, string, strlen(string)) == 0, "Expected inserted string to be equal to %s, got %s", string, actual); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_Format) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + parcBufferComposer_Format(composer, "hello %s", "world"); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + + char expected[11] = "hello world"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 11) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutChar) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + + char byte = 'a'; + parcBufferComposer_PutChar(composer, byte); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + assertTrue(parcBuffer_GetUint8(buffer) == byte, "Expected inserted char to be equal to %c, got %c", byte, parcBuffer_GetUint8(buffer)); + + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_CreateBuffer) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + parcBufferComposer_PutString(composer, "hello world"); + + PARCBuffer *buffer = parcBufferComposer_CreateBuffer(composer); + parcBuffer_Flip(buffer); // flip the buffer since it was returned in write mode + + char expected[11] = "hello world"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 11) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_ProduceBuffer) +{ + PARCBufferComposer *composer = parcBufferComposer_Create(); + parcBufferComposer_PutString(composer, "hello world"); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + + char expected[11] = "hello world"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 11) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +LONGBOW_TEST_CASE(Global, parcBufferComposer_PutString_Extend) +{ + PARCBufferComposer *composer = parcBufferComposer_Allocate(4); + parcBufferComposer_PutString(composer, "hello world"); + + PARCBuffer *buffer = parcBufferComposer_ProduceBuffer(composer); + + char expected[11] = "hello world"; + char *actual = parcBuffer_ToString(buffer); + assertTrue(strncmp(expected, actual, 11) == 0, "Expected strings to match. Got %s, expected %s", actual, expected); + + parcMemory_Deallocate((void **) &actual); + parcBuffer_Release(&buffer); + parcBufferComposer_Release(&composer); +} + +int +main(int argc, char *argv[argc]) +{ + LongBowRunner *testRunner = LONGBOW_TEST_RUNNER_CREATE(parc_BufferComposer); + int exitStatus = LONGBOW_TEST_MAIN(argc, argv, testRunner, NULL); + longBowTestRunner_Destroy(&testRunner); + exit(exitStatus); +} -- cgit 1.2.3-korg