From a6aebdaedd4abb95b040c9cd09cfdb6b9b940789 Mon Sep 17 00:00:00 2001 From: Michael Bebenita Date: Tue, 7 Sep 2010 18:26:19 -0700 Subject: Started work on a framework for writing runtime tests, added some simple test cases. --- src/Makefile | 8 +++- src/rt/test/rust_test_harness.cpp | 37 +++++++++++++++++++ src/rt/test/rust_test_harness.h | 22 +++++++++++ src/rt/test/rust_test_util.cpp | 78 +++++++++++++++++++++++++++++++++++++++ src/rt/test/rust_test_util.h | 43 +++++++++++++++++++++ 5 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 src/rt/test/rust_test_harness.cpp create mode 100644 src/rt/test/rust_test_harness.h create mode 100644 src/rt/test/rust_test_util.cpp create mode 100644 src/rt/test/rust_test_util.h diff --git a/src/Makefile b/src/Makefile index 0f0382e2..827eb2ee 100644 --- a/src/Makefile +++ b/src/Makefile @@ -269,7 +269,9 @@ RUNTIME_CS := rt/sync/timer.cpp \ rt/isaac/randport.cpp \ rt/rust_srv.cpp \ rt/rust_kernel.cpp \ - rt/memory_region.cpp + rt/memory_region.cpp \ + rt/test/rust_test_harness.cpp \ + rt/test/rust_test_util.cpp RUNTIME_HDR := rt/globals.h \ rt/rust.h \ @@ -294,7 +296,9 @@ RUNTIME_HDR := rt/globals.h \ rt/rust_srv.h \ rt/rust_kernel.h \ rt/memory_region.h \ - rt/memory.h + rt/memory.h \ + rt/test/rust_test_harness.h \ + rt/test/rust_test_util.h RUNTIME_INCS := -Irt/isaac -Irt/uthash RUNTIME_OBJS := $(RUNTIME_CS:.cpp=$(CFG_OBJ_SUFFIX)) diff --git a/src/rt/test/rust_test_harness.cpp b/src/rt/test/rust_test_harness.cpp new file mode 100644 index 00000000..c33e170e --- /dev/null +++ b/src/rt/test/rust_test_harness.cpp @@ -0,0 +1,37 @@ +#include "../rust_internal.h" + +bool +rust_test::run() { + return false; +} + +const char * +rust_test::name() { + return "untitled"; +} + +rust_test_suite::rust_test_suite() { + tests.append(new rust_array_list_test()); + tests.append(new rust_synchronized_indexed_list_test()); +} + +rust_test_suite::~rust_test_suite() { + +} + +bool +rust_test_suite::run() { + bool pass = true; + for (size_t i = 0; i < tests.size(); i++) { + rust_test *test = tests[i]; + printf("test: %s running ... \n", test->name()); + if (tests[i]->run() == false) { + printf("test: %s FAILED\n", test->name()); + pass = false; + } else { + printf("test: %s PASSED\n", test->name()); + } + } + return pass; +} + diff --git a/src/rt/test/rust_test_harness.h b/src/rt/test/rust_test_harness.h new file mode 100644 index 00000000..401015e4 --- /dev/null +++ b/src/rt/test/rust_test_harness.h @@ -0,0 +1,22 @@ +#ifndef RUST_TEST_HARNESS_H +#define RUST_TEST_HARNESS_H + +#define CHECK(x) if ((x) == false) \ + { printf("condition: %s failed at file: %s, line: %d\n", #x, \ + __FILE__, __LINE__ ); return false; } + +class rust_test { +public: + virtual bool run(); + virtual const char *name(); +}; + +class rust_test_suite : public rust_test { +public: + array_list tests; + rust_test_suite(); + virtual ~rust_test_suite(); + bool run(); +}; + +#endif /* RUST_TEST_HARNESS_H */ diff --git a/src/rt/test/rust_test_util.cpp b/src/rt/test/rust_test_util.cpp new file mode 100644 index 00000000..76bd7990 --- /dev/null +++ b/src/rt/test/rust_test_util.cpp @@ -0,0 +1,78 @@ +#include "../rust_internal.h" + +#define COUNT 1000 +#define LARGE_COUNT 100000 +#define THREADS 10 + +bool +rust_array_list_test::run() { + array_list list; + + for (int i = 0; i < COUNT; i++) { + list.append(i); + } + + for (int i = 0; i < COUNT; i++) { + CHECK (list[i] == i); + } + + for (int i = 0; i < COUNT; i++) { + CHECK (list.index_of(i) == i); + } + + for (int i = 0; i < COUNT; i++) { + CHECK (list.replace(i, -i)); + CHECK (list.replace(-i, i)); + CHECK (list.index_of(i) == i); + } + + for (int i = COUNT - 1; i >= 0; i--) { + CHECK (list.pop(NULL)); + } + + return true; +} + +bool +rust_synchronized_indexed_list_test::run() { + array_list workers; + + for (int i = 0; i < THREADS; i++) { + worker *worker = + new rust_synchronized_indexed_list_test::worker(this); + workers.append(worker); + } + + for (uint32_t i = 0; i < workers.size(); i++) { + workers[i]->start(); + } + + while(workers.is_empty() == false) { + worker *worker; + workers.pop(&worker); + worker->join(); + delete worker; + } + + long long expected_items = LARGE_COUNT * THREADS; + + CHECK(list.length() == expected_items); + + long long sum = 0; + for (size_t i = 0; i < list.length(); i++) { + sum += list[i]->value; + } + + long long expected_sum = LARGE_COUNT; + expected_sum = expected_sum * (expected_sum - 1) / 2 * THREADS; + CHECK (sum == expected_sum); + return true; +} + +void +rust_synchronized_indexed_list_test::worker::run() { + for (int i = 0; i < LARGE_COUNT; i++) { + parent->list.append(new indexed_list_element(i)); + } + return; +} diff --git a/src/rt/test/rust_test_util.h b/src/rt/test/rust_test_util.h new file mode 100644 index 00000000..fb8490cb --- /dev/null +++ b/src/rt/test/rust_test_util.h @@ -0,0 +1,43 @@ +#ifndef RUST_TEST_UTIL_H +#define RUST_TEST_UTIL_H + +class rust_test_util : public rust_test { +public: + +}; + +class rust_array_list_test : public rust_test { +public: + bool run(); + const char *name() { + return "rust_array_list_test"; + } +}; + + +class rust_synchronized_indexed_list_test : public rust_test { +public: + rust_srv srv; + memory_region region; + synchronized_indexed_list > list; + + rust_synchronized_indexed_list_test() : + region(&srv, false), list(®ion) { + // Nop. + } + + class worker : public rust_thread { + public: + rust_synchronized_indexed_list_test *parent; + worker(rust_synchronized_indexed_list_test *parent) : parent(parent) { + // Nop. + } + void run(); + }; + bool run(); + const char *name() { + return "rust_synchronized_indexed_list_test"; + } +}; + +#endif /* RUST_TEST_UTIL_H */ -- cgit v1.2.3