From 45686f6c86140ac831217a4aacf9a4561b73d9a1 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 24 Sep 2024 21:57:33 -0400 Subject: [PATCH] Issue 522 - Add unit test framework for C runtime (#545) * WIP - C unit testing stubs * Get test-lib to compile and run * Add test-lib to CI * Use cflags for test-lib * Build runtime library * Fix typo * Break into separate CI tasks * Cleanup * Add example tests for non-CPS * Include -g option for test-lib * Add CI to build C runtime Can expand into scheme at some point, this is a first step. * Use latest upload workflow --- .../workflows/{main.yml => c-api-docs.yml} | 2 +- .github/workflows/c-runtime-unit-tests.yml | 27 ++++++++++ .github/workflows/ci.yml | 26 ++++++++++ Makefile | 4 ++ test-lib.c | 51 +++++++++++++++++++ 5 files changed, 109 insertions(+), 1 deletion(-) rename .github/workflows/{main.yml => c-api-docs.yml} (92%) create mode 100644 .github/workflows/c-runtime-unit-tests.yml create mode 100644 .github/workflows/ci.yml create mode 100644 test-lib.c diff --git a/.github/workflows/main.yml b/.github/workflows/c-api-docs.yml similarity index 92% rename from .github/workflows/main.yml rename to .github/workflows/c-api-docs.yml index 2907a4dd..b5b3266c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/c-api-docs.yml @@ -21,7 +21,7 @@ jobs: - name: upload deb if: matrix.arch == '64' - uses: actions/upload-artifact@v1 + uses: actions/upload-artifact@v4 with: name: cyclone-scheme docs path: html.tar.bz2 diff --git a/.github/workflows/c-runtime-unit-tests.yml b/.github/workflows/c-runtime-unit-tests.yml new file mode 100644 index 00000000..a9cba2b9 --- /dev/null +++ b/.github/workflows/c-runtime-unit-tests.yml @@ -0,0 +1,27 @@ +name: C Runtime Unit Tests + +#on: [create] +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + arch: [64] + + steps: + # Install dependencies + - name: Install libck + run: sudo apt-get install libck-dev + #- name: Install Cyclone + # run: | + # wget https://github.com/cyclone-scheme/binary-releases/raw/master/ubuntu-18.04-lts/cyclone-scheme_0.30.0_amd64.deb + # sudo apt install ./cyclone-scheme_0.30.0_amd64.deb + - uses: actions/checkout@v1 + + # Execute runtime library unit tests + - name: make test-lib + run: make libcyclone.a && make test-lib && ./test-lib diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..fbfc7f50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: Ubuntu Linux Build + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + arch: [32, 64] + + steps: + - uses: actions/checkout@v1 + - name: Install ck + run: sudo apt-get install libck-dev + - name: make runtime + run: make libcyclone.a +# - name: make +# run: make +# - name: make install +# run: sudo make install +# - name: make test +# run: make test + diff --git a/Makefile b/Makefile index 61bac1a1..19d33c28 100644 --- a/Makefile +++ b/Makefile @@ -342,3 +342,7 @@ install-bin : cyclone icyc $(MKDIR) $(DESTDIR)$(BINDIR) $(INSTALL) -m0755 cyclone $(DESTDIR)$(BINDIR)/ $(INSTALL) -m0755 icyc $(DESTDIR)$(BINDIR)/ + +# TODO: is this linking in local lcyclone or the system one???? +test-lib: test-lib.c + $(CCOMP) -g test-lib.c -o test-lib -L . $(LIBS) diff --git a/test-lib.c b/test-lib.c new file mode 100644 index 00000000..e9edd92a --- /dev/null +++ b/test-lib.c @@ -0,0 +1,51 @@ +#include +#include +#include "include/cyclone/types.h" +#include "include/cyclone/runtime.h" +#include "include/cyclone/runtime-main.h" + +/* Future considerations: +int main(int argc, char **argv, char **envp) +{gc_thread_data *thd; + long stack_size = global_stack_size = STACK_SIZE; + long heap_size = global_heap_size = HEAP_SIZE; + init_polyfills(); + mclosure0(clos_halt,&Cyc_halt); // Halt if final closure is reached + mclosure0(entry_pt,&c_entry_pt); // First function to execute + _cyc_argc = argc; + _cyc_argv = argv; + set_env_variables(envp); + gc_initialize(); + thd = malloc(sizeof(gc_thread_data)); + gc_thread_data_init(thd, 0, (char *) &stack_size, stack_size); + thd->gc_cont = &entry_pt; + thd->gc_args[0] = &clos_halt; + thd->gc_num_args = 1; + thd->thread_id = pthread_self(); + gc_add_mutator(thd); + Cyc_heap_init(heap_size); + thd->thread_state = CYC_THREAD_STATE_RUNNABLE; + Cyc_start_trampoline(thd); + return 0;} + */ + +void test_exact() { + common_type ptr; + make_double(d, 42.5); + assert(obj_int2obj(42) == Cyc_exact_no_cps(NULL, &ptr, obj_int2obj(42))); + object result = Cyc_exact_no_cps(NULL, &ptr, &d); + assert( result == obj_int2obj(43)); + + // TODO: unit tests for below as examples: + //void Cyc_exact(void *data, object cont, object z) +} + +int main(){ + assert(boolean_t == boolean_t); + assert(boolean_t != boolean_f); + + test_exact(); + + printf("All tests passed successfully!\n"); + return 0; +}