Skip to content

Commit

Permalink
[test] Enhancement: Test Sizes in C
Browse files Browse the repository at this point in the history
  • Loading branch information
ppenna committed May 21, 2024
1 parent 54281c9 commit 308b187
Show file tree
Hide file tree
Showing 5 changed files with 161 additions and 4 deletions.
7 changes: 6 additions & 1 deletion linux.mk
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,12 @@ test-system-rust:
test-unit: test-unit-rust

# C unit tests.
test-unit-c: all-tests $(BINDIR)/syscalls.elf
test-unit-c: all-tests test-unit-c-sizes test-unit-c-syscalls

test-unit-c-sizes: all-tests $(BINDIR)/sizes.elf
timeout $(TIMEOUT) $(BINDIR)/sizes.elf

test-unit-c-syscalls: all-tests $(BINDIR)/syscalls.elf
timeout $(TIMEOUT) $(BINDIR)/syscalls.elf

# Rust unit tests.
Expand Down
7 changes: 6 additions & 1 deletion tests/c/linux.mk
Original file line number Diff line number Diff line change
Expand Up @@ -28,18 +28,23 @@ export COMPILE_CMD = $(CC) $(CFLAGS) $@.o -o $(BINDIR)/$@.$(EXEC_SUFFIX) $(LIBS)
#=======================================================================================================================

# Builds everything.
all: syscalls
all: sizes syscalls

make-dirs:
mkdir -p $(BINDIR)

# Builds 'sizes' test.
sizes: make-dirs sizes.o
$(COMPILE_CMD)

# Builds system call test.
syscalls: make-dirs syscalls.o
$(COMPILE_CMD)

# Cleans up all build artifacts.
clean:
@rm -rf $(OBJ)
@rm -rf $(BINDIR)/sizes.$(EXEC_SUFFIX)
@rm -rf $(BINDIR)/syscalls.$(EXEC_SUFFIX)

# Builds a C source file.
Expand Down
134 changes: 134 additions & 0 deletions tests/c/sizes.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* Copyright (c) Microsoft Corporation.
* Licensed under the MIT license.
*/

/*====================================================================================================================*
* Imports *
*====================================================================================================================*/

#include <demi/types.h>
#include <stdio.h>
#include <stdlib.h>

/*====================================================================================================================*
* Macro Functions *
*====================================================================================================================*/

/**
* @brief Returns the maximum of two values.
*
* @param a First value.
* @param b Second value.
*
* @returns The maximum of 'a' and 'b'.
*/
#define MAX(a, b) (((a) > (b)) ? (a) : (b))

/**
* @brief Asserts if 'a' and 'b' agree on size.
*
* @param a Probing size.
* @param b Control size.
*
* @returns Upon success, compilation proceeds as normal. Upon failure, a
* compilation error is generated.
*/
#define KASSERT_SIZE(a, b) ((void)sizeof(char[(((a) == (b)) ? 1 : -1)]))

/*====================================================================================================================*
* Private Functions *
*====================================================================================================================*/

/**
* @brief tests if @p demi_sgaseg_t has the expected size.
*
* @note This is a compile-time-test.
*/
static void test_size_sgaseg_t(void)
{
// The following sizes are intentionally hardcoded.
const size_t SGASEG_BUF_SIZE = 8;
const size_t SGASEG_LEN_SIZE = 4;
const size_t SGASEG_SIZE = SGASEG_BUF_SIZE + SGASEG_LEN_SIZE;
KASSERT_SIZE(sizeof(demi_sgaseg_t), SGASEG_SIZE);
printf("sizeof(demi_sgaseg_t) = %lu\n", sizeof(demi_sgaseg_t));
}

/**
* @brief Tests if @p demi_sga_t has the expected size.
*
* @note This is a compile-time-test.
*/
static void test_size_sga_t(void)
{
// The following sizes are intentionally hardcoded.
const size_t SGA_BUF_SIZE = 8;
const size_t SGA_NUMSEGS_SIZE = 4;
const size_t SGA_SEGS_SIZE = sizeof(demi_sgaseg_t) * DEMI_SGARRAY_MAXSIZE;
const size_t SGA_ADDR_SIZE = 16;
const size_t SGA_SIZE = SGA_BUF_SIZE + SGA_NUMSEGS_SIZE + SGA_SEGS_SIZE + SGA_ADDR_SIZE;
KASSERT_SIZE(sizeof(demi_sgarray_t), SGA_SIZE);
printf("sizeof(demi_sgarray_t) = %lu\n", sizeof(demi_sgarray_t));
}

/**
* @brief Tests if @p demi_accept_result_t has the expected size.
*
* @note This is a compile-time-test.
*/
static void test_size_demi_accept_result_t(void)
{
// The following sizes are intentionally hardcoded.
const size_t QD_SIZE = 4;
const size_t SADDR_SIZE = 16;
const size_t RESULT_SIZE = QD_SIZE + SADDR_SIZE;
KASSERT_SIZE(sizeof(demi_accept_result_t), RESULT_SIZE);
printf("sizeof(demi_accept_result_t) = %lu\n", sizeof(demi_accept_result_t));
}

/**
* @brief Tests if demi_qresult_t has the expected size.
*
* @note This is a compile-time-test.
*/
static void test_size_demi_qresult_t(void)
{
// The following sizes are intentionally hardcoded.
const size_t QR_OPCODE_SIZE = 4;
const size_t QR_QD_SIZE = 4;
const size_t QR_QT_SIZE = 8;
const size_t QR_RET_SIZE = 8;
const size_t QR_VALUE_SIZE = MAX(sizeof(demi_accept_result_t), sizeof(demi_sgarray_t));
const size_t QR_SIZE = QR_OPCODE_SIZE + QR_QD_SIZE + QR_QT_SIZE + QR_RET_SIZE + QR_VALUE_SIZE;
KASSERT_SIZE(sizeof(demi_qresult_t), QR_SIZE);
printf("sizeof(demi_qresult_t) = %lu\n", sizeof(demi_qresult_t));
}

/*====================================================================================================================*
* Public Functions *
*====================================================================================================================*/

/**
* @brief Drives the application.
*
* This system-level conducts tests to ensure that the sizes of structures and
* data types exposed by the C bindings of Demikernel are correct.
*
* @param argc Argument count (unused).
* @param argv Argument vector (unused).
*
* @return On successful completion EXIT_SUCCESS is returned.
*/
int main(int argc, char *const argv[])
{
((void)argc);
((void)argv);

test_size_sgaseg_t();
test_size_sga_t();
test_size_demi_accept_result_t();
test_size_demi_qresult_t();

return (EXIT_SUCCESS);
}
9 changes: 8 additions & 1 deletion tests/c/windows.mk
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,22 @@

CC = cl

all: syscalls
all: sizes syscalls

sizes: make-dirs sizes.obj
$(CC) sizes.obj $(LIBS) /Fe: $(BINDIR)\sizes.exe

syscalls: make-dirs syscalls.obj
$(CC) syscalls.obj $(LIBS) /Fe: $(BINDIR)\syscalls.exe

clean:
IF EXIST sizes.obj del /Q sizes.obj
IF EXIST syscalls.obj del /Q syscalls.obj
IF EXIST $(BINDIR)\syscalls.exe del /S /Q $(BINDIR)\syscalls.exe

sizes.obj:
$(CC) /I $(INCDIR) tests\c\sizes.c /c

syscalls.obj:
$(CC) /I $(INCDIR) tests\c\syscalls.c /c

Expand Down
8 changes: 7 additions & 1 deletion windows.mk
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,13 @@ test-system-rust:
test-unit: test-unit-rust

# C unit tests.
test-unit-c: all-tests-c
test-unit-c: all-tests-c test-unit-c-sizes test-unit-c-syscalls

test-unit-c-sizes: all-tests-c
set RUST_LOG=$(RUST_LOG)
$(BINDIR)\sizes.exe

test-unit-c-syscalls: all-tests-c
set RUST_LOG=$(RUST_LOG)
$(BINDIR)\syscalls.exe

Expand Down

0 comments on commit 308b187

Please sign in to comment.