Skip to content

Commit f6f8a06

Browse files
Eric Holkgraydon
Eric Holk
authored andcommitted
Resurrecting the runtime unit tests, and modifying them so they compile under the latest refactoring changes.
1 parent 657e5a2 commit f6f8a06

File tree

9 files changed

+311
-2
lines changed

9 files changed

+311
-2
lines changed

mk/rt.mk

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ RUNTIME_CS := rt/sync/timer.cpp \
2525
rt/rust_srv.cpp \
2626
rt/rust_kernel.cpp \
2727
rt/memory_region.cpp \
28+
rt/test/rust_test_harness.cpp \
29+
rt/test/rust_test_runtime.cpp \
30+
rt/test/rust_test_util.cpp \
2831
rt/arch/i386/context.cpp \
2932

3033
RUNTIME_LL :=
@@ -56,6 +59,9 @@ RUNTIME_HDR := rt/globals.h \
5659
rt/rust_kernel.h \
5760
rt/memory_region.h \
5861
rt/memory.h \
62+
rt/test/rust_test_harness.h \
63+
rt/test/rust_test_runtime.h \
64+
rt/test/rust_test_util.h \
5965
rt/arch/i386/context.h \
6066

6167
RUNTIME_DEF := rt/rustrt$(CFG_DEF_SUFFIX)

src/rt/rust_internal.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ typedef ptr_vec<rust_alarm> rust_wait_queue;
249249
#include "rust_port.h"
250250
#include "memory.h"
251251

252+
#include "test/rust_test_harness.h"
253+
#include "test/rust_test_util.h"
254+
#include "test/rust_test_runtime.h"
255+
252256
//
253257
// Local Variables:
254258
// mode: C++

src/rt/rust_kernel.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ class rust_kernel : public rust_thread {
6868
rust_handle<rust_scheduler> *
6969
internal_get_sched_handle(rust_scheduler *sched);
7070

71+
array_list<rust_task_thread *> threads;
72+
7173
rust_scheduler *create_scheduler(const char *name);
7274
void destroy_scheduler();
7375

74-
array_list<rust_task_thread *> threads;
75-
7676
public:
7777
rust_scheduler *sched;
7878
lock_and_signal scheduler_lock;

src/rt/test/rust_test_harness.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#include "../rust_internal.h"
2+
3+
bool
4+
rust_test::run() {
5+
return false;
6+
}
7+
8+
const char *
9+
rust_test::name() {
10+
return "untitled";
11+
}
12+
13+
rust_test_suite::rust_test_suite() {
14+
tests.append(new rust_domain_test());
15+
tests.append(new rust_task_test(this));
16+
tests.append(new rust_array_list_test());
17+
tests.append(new rust_synchronized_indexed_list_test());
18+
}
19+
20+
rust_test_suite::~rust_test_suite() {
21+
22+
}
23+
24+
bool
25+
rust_test_suite::run() {
26+
bool pass = true;
27+
for (size_t i = 0; i < tests.size(); i++) {
28+
rust_test *test = tests[i];
29+
printf("test: %s running ... \n", test->name());
30+
timer timer;
31+
bool result = tests[i]->run();
32+
printf("test: %s %s %.2f ms\n", test->name(),
33+
result ? "PASSED" : "FAILE", timer.get_elapsed_time_in_ms());
34+
if (result == false) {
35+
pass = false;
36+
}
37+
}
38+
return pass;
39+
}
40+

src/rt/test/rust_test_harness.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
#ifndef RUST_TEST_HARNESS_H
2+
#define RUST_TEST_HARNESS_H
3+
4+
#define CHECK(x) if ((x) == false) \
5+
{ printf("condition: %s failed at file: %s, line: %d\n", #x, \
6+
__FILE__, __LINE__ ); return false; }
7+
8+
class rust_test {
9+
public:
10+
virtual bool run();
11+
virtual const char *name();
12+
};
13+
14+
class rust_test_suite : public rust_test {
15+
public:
16+
array_list<rust_test*> tests;
17+
rust_test_suite();
18+
virtual ~rust_test_suite();
19+
bool run();
20+
};
21+
22+
#endif /* RUST_TEST_HARNESS_H */

src/rt/test/rust_test_runtime.cpp

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
#include "rust_test_runtime.h"
2+
3+
rust_test_runtime::rust_test_runtime() {
4+
}
5+
6+
rust_test_runtime::~rust_test_runtime() {
7+
}
8+
9+
#define DOMAINS 32
10+
#define TASKS 32
11+
12+
void
13+
rust_domain_test::worker::run() {
14+
rust_scheduler *handle = kernel->get_scheduler();
15+
for (int i = 0; i < TASKS; i++) {
16+
handle->create_task(NULL, "child");
17+
}
18+
sync::random_sleep(1000);
19+
}
20+
21+
bool
22+
rust_domain_test::run() {
23+
rust_srv srv;
24+
rust_kernel kernel(&srv);
25+
26+
array_list<worker *> workers;
27+
for (int i = 0; i < DOMAINS; i++) {
28+
worker *worker = new rust_domain_test::worker (&kernel);
29+
workers.append(worker);
30+
worker->start();
31+
}
32+
33+
// We don't join the worker threads here in order to simulate ad-hoc
34+
// termination of domains. If we join_all_domains before all domains
35+
// are actually spawned, this could crash, thus the reason for the
36+
// sleep below.
37+
38+
sync::sleep(100);
39+
return true;
40+
}
41+
42+
void task_entry() {
43+
printf("task entry\n");
44+
}
45+
46+
void
47+
rust_task_test::worker::run() {
48+
rust_scheduler *scheduler = kernel->get_scheduler();
49+
scheduler->root_task->start((uintptr_t)&task_entry, (uintptr_t)NULL);
50+
scheduler->start_main_loop(0);
51+
}
52+
53+
bool
54+
rust_task_test::run() {
55+
rust_srv srv;
56+
rust_kernel kernel(&srv);
57+
58+
array_list<worker *> workers;
59+
for (int i = 0; i < DOMAINS; i++) {
60+
worker *worker = new rust_task_test::worker (&kernel, this);
61+
workers.append(worker);
62+
worker->start();
63+
}
64+
65+
sync::random_sleep(1000);
66+
return true;
67+
}

src/rt/test/rust_test_runtime.h

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include "../rust_internal.h"
2+
3+
#ifndef RUST_TEST_RUNTIME_H
4+
#define RUST_TEST_RUNTIME_H
5+
6+
class rust_test_runtime {
7+
public:
8+
rust_test_runtime();
9+
virtual ~rust_test_runtime();
10+
};
11+
12+
13+
class rust_domain_test : public rust_test {
14+
public:
15+
class worker : public rust_thread {
16+
public:
17+
rust_kernel *kernel;
18+
worker(rust_kernel *kernel) : kernel(kernel) {
19+
// Nop.
20+
}
21+
void run();
22+
};
23+
bool run();
24+
const char *name() {
25+
return "rust_domain_test";
26+
}
27+
};
28+
29+
class rust_task_test : public rust_test {
30+
public:
31+
rust_test_suite *suite;
32+
rust_task_test(rust_test_suite *suite) : suite(suite) {
33+
// Nop.
34+
}
35+
class worker : public rust_thread {
36+
public:
37+
rust_kernel *kernel;
38+
rust_task_test *parent;
39+
worker(rust_kernel *kernel, rust_task_test *parent) :
40+
kernel(kernel), parent(parent) {
41+
// Nop.
42+
}
43+
void run();
44+
};
45+
bool run();
46+
const char *name() {
47+
return "rust_task_test";
48+
}
49+
};
50+
51+
#endif /* RUST_TEST_RUNTIME_H */

src/rt/test/rust_test_util.cpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "../rust_internal.h"
2+
3+
#define COUNT 1000
4+
#define LARGE_COUNT 10000
5+
#define THREADS 10
6+
7+
bool
8+
rust_array_list_test::run() {
9+
array_list<int> list;
10+
11+
for (int i = 0; i < COUNT; i++) {
12+
list.append(i);
13+
}
14+
15+
for (int i = 0; i < COUNT; i++) {
16+
CHECK (list[i] == i);
17+
}
18+
19+
for (int i = 0; i < COUNT; i++) {
20+
CHECK (list.index_of(i) == i);
21+
}
22+
23+
for (int i = 0; i < COUNT; i++) {
24+
CHECK (list.replace(i, -i));
25+
CHECK (list.replace(-i, i));
26+
CHECK (list.index_of(i) == i);
27+
}
28+
29+
for (int i = COUNT - 1; i >= 0; i--) {
30+
CHECK (list.pop(NULL));
31+
}
32+
33+
return true;
34+
}
35+
36+
bool
37+
rust_synchronized_indexed_list_test::run() {
38+
array_list<worker*> workers;
39+
40+
for (int i = 0; i < THREADS; i++) {
41+
worker *worker =
42+
new rust_synchronized_indexed_list_test::worker(this);
43+
workers.append(worker);
44+
}
45+
46+
for (uint32_t i = 0; i < workers.size(); i++) {
47+
workers[i]->start();
48+
}
49+
50+
while(workers.is_empty() == false) {
51+
worker *worker;
52+
workers.pop(&worker);
53+
worker->join();
54+
delete worker;
55+
}
56+
57+
long long expected_items = LARGE_COUNT * THREADS;
58+
59+
CHECK(list.length() == expected_items);
60+
61+
long long sum = 0;
62+
for (size_t i = 0; i < list.length(); i++) {
63+
sum += list[i]->value;
64+
}
65+
66+
long long expected_sum = LARGE_COUNT;
67+
expected_sum = expected_sum * (expected_sum - 1) / 2 * THREADS;
68+
CHECK (sum == expected_sum);
69+
return true;
70+
}
71+
72+
void
73+
rust_synchronized_indexed_list_test::worker::run() {
74+
for (int i = 0; i < LARGE_COUNT; i++) {
75+
parent->list.append(new indexed_list_element<int>(i));
76+
}
77+
return;
78+
}

src/rt/test/rust_test_util.h

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#ifndef RUST_TEST_UTIL_H
2+
#define RUST_TEST_UTIL_H
3+
4+
class rust_test_util : public rust_test {
5+
public:
6+
7+
};
8+
9+
class rust_array_list_test : public rust_test {
10+
public:
11+
bool run();
12+
const char *name() {
13+
return "rust_array_list_test";
14+
}
15+
};
16+
17+
18+
class rust_synchronized_indexed_list_test : public rust_test {
19+
public:
20+
rust_srv srv;
21+
synchronized_indexed_list<indexed_list_element<int> > list;
22+
23+
rust_synchronized_indexed_list_test() {
24+
// Nop.
25+
}
26+
27+
class worker : public rust_thread {
28+
public:
29+
rust_synchronized_indexed_list_test *parent;
30+
worker(rust_synchronized_indexed_list_test *parent) : parent(parent) {
31+
// Nop.
32+
}
33+
void run();
34+
};
35+
bool run();
36+
const char *name() {
37+
return "rust_synchronized_indexed_list_test";
38+
}
39+
};
40+
41+
#endif /* RUST_TEST_UTIL_H */

0 commit comments

Comments
 (0)