From 787c1a6016dd2fdb51f20fcb5ca0ac5e461892d6 Mon Sep 17 00:00:00 2001 From: aqua Date: Sun, 5 Mar 2023 14:38:54 +0200 Subject: Move all tests next to the code they're testing --- src/Makefile | 3 +- src/sched/test_roundrobin.cc | 50 ++++++++++++++++++ src/sched/test_taskqueue.cc | 122 +++++++++++++++++++++++++++++++++++++++++++ src/tst/roundrobin.cc | 50 ------------------ src/tst/taskqueue.cc | 122 ------------------------------------------- 5 files changed, 174 insertions(+), 173 deletions(-) create mode 100644 src/sched/test_roundrobin.cc create mode 100644 src/sched/test_taskqueue.cc delete mode 100644 src/tst/roundrobin.cc delete mode 100644 src/tst/taskqueue.cc (limited to 'src') diff --git a/src/Makefile b/src/Makefile index f9ab6fe..3a5d41b 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,7 +8,8 @@ TARGETLIB += kernel kernel.SRCS := multiboot2.c mmap.c kernel.cpp mem/vmm.c kernel.OBJS := conf.h -TESTS += tst/taskqueue tst/roundrobin +TESTS += \ + sched/test_taskqueue sched/test_roundrobin include ../rules.mk diff --git a/src/sched/test_roundrobin.cc b/src/sched/test_roundrobin.cc new file mode 100644 index 0000000..1431788 --- /dev/null +++ b/src/sched/test_roundrobin.cc @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include + +#include "../sched/roundrobin.cpp" + +void +run(Task *task, int slice) +{ + std::cout << "Running task " << task->name << " id=" << std::setw(2) << task->id << " prio=" << std::setw(2) + << task->priority << " burst=" << std::setw(2) << task->burst << " slice=" << slice << " "; +} + +struct DebugRoundRobinQueue : public RoundRobinQueue { +public: + void + print() const + { + for (auto *it = head; it != nullptr; it = it->next) { + std::cout << it->node->name << '(' << std::setw(2) << it->node->burst << ") "; + } + std::cout << std::endl; + } +}; + +TEST(roundrobin, RoundRobinQueue) +{ + DebugRoundRobinQueue queue; + queue.insert(new Task{"P1", 1, 1, 50}); + queue.insert(new Task{"P2", 2, 1, 40}); + queue.insert(new Task{"P3", 3, 1, 50}); + queue.insert(new Task{"P4", 4, 1, 40}); + + const auto begin = std::chrono::system_clock::now(); + for (auto *t = queue.next(10); t != nullptr; t = queue.next(10)) { + run(t, 10); + queue.print(); + } + const auto end = std::chrono::system_clock::now(); + const auto duration = std::chrono::duration_cast(end - begin).count(); + + std::cout << "Completed in (us): " << duration << std::endl; + // test should complete in 250us unless running on valgrind + if (!RUNNING_ON_VALGRIND) EXPECT_LE(duration, 250); + + EXPECT_EQ(queue.head, nullptr); + EXPECT_EQ(queue.tail, nullptr); +} diff --git a/src/sched/test_taskqueue.cc b/src/sched/test_taskqueue.cc new file mode 100644 index 0000000..217c44d --- /dev/null +++ b/src/sched/test_taskqueue.cc @@ -0,0 +1,122 @@ +#include + +#include "../sched.hpp" + +struct DebugQueue : public Queue { +public: + void + expect_ordered() const + { + int id = 1; + for (auto *it = head; it != nullptr; it = it->next) { + // std::cout << it->node->name << std::endl; + EXPECT_EQ(it->node->id, id++); + } + } +}; + +TEST(taskqueue, insert) +{ + DebugQueue queue; + auto *p1 = new Task{"P1", 1, 1, 10}; + queue.insert(p1); + queue.insert(new Task{"P2", 2, 1, 10}); + queue.insert(new Task{"P3", 3, 1, 10}); + auto *p4 = new Task{"P4", 4, 1, 10}; + queue.insert(p4); + queue.expect_ordered(); + + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p4); +} + +TEST(taskqueue, removeHead) +{ + DebugQueue queue; + auto *p0 = new Task{"P0", 0, 1, 10}; + queue.insert(p0); + auto *p1 = new Task{"P1", 1, 1, 10}; + queue.insert(p1); + queue.insert(new Task{"P2", 2, 1, 10}); + queue.insert(new Task{"P3", 3, 1, 10}); + auto *p4 = new Task{"P4", 4, 1, 10}; + queue.insert(p4); + queue.remove(p0); + delete p0; + + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p4); + queue.expect_ordered(); +} + +TEST(taskqueue, removeTail) +{ + DebugQueue queue; + auto *p1 = new Task{"P1", 1, 1, 10}; + queue.insert(p1); + queue.insert(new Task{"P2", 2, 1, 10}); + queue.insert(new Task{"P3", 3, 1, 10}); + auto *p4 = new Task{"P4", 4, 1, 10}; + queue.insert(p4); + auto *p5 = new Task{"P5", 5, 1, 10}; + queue.insert(p5); + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p5); + + queue.remove(p5); + delete p5; + + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p4); + queue.expect_ordered(); +} + +TEST(taskqueue, removeLast) +{ + DebugQueue queue; + + auto *p0 = new Task{"P0", 0, 1, 10}; + queue.insert(p0); + EXPECT_EQ(queue.head->node, p0); + EXPECT_EQ(queue.tail->node, p0); + + queue.remove(p0); + delete p0; + + EXPECT_EQ(queue.head, nullptr); + EXPECT_EQ(queue.tail, nullptr); +} + +TEST(taskqueue, removeNullptr) +{ + DebugQueue queue; + queue.insert(new Task{"P1", 1, 1, 10}); + queue.insert(new Task{"P2", 2, 1, 10}); + queue.insert(new Task{"P3", 3, 1, 10}); + queue.insert(new Task{"P4", 4, 1, 10}); + queue.remove(nullptr); + queue.expect_ordered(); +} + +TEST(taskqueue, remove) +{ + DebugQueue queue; + auto *p1 = new Task{"P1", 1, 1, 10}; + queue.insert(p1); + queue.insert(new Task{"P2", 2, 1, 10}); + auto *p0 = new Task{"P0", 0, 1, 10}; + queue.insert(p0); + queue.insert(new Task{"P3", 3, 1, 10}); + auto *p4 = new Task{"P4", 4, 1, 10}; + queue.insert(p4); + + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p4); + + queue.remove(p0); + delete p0; + + EXPECT_EQ(queue.head->node, p1); + EXPECT_EQ(queue.tail->node, p4); + queue.expect_ordered(); +} diff --git a/src/tst/roundrobin.cc b/src/tst/roundrobin.cc deleted file mode 100644 index 1431788..0000000 --- a/src/tst/roundrobin.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include -#include -#include - -#include "../sched/roundrobin.cpp" - -void -run(Task *task, int slice) -{ - std::cout << "Running task " << task->name << " id=" << std::setw(2) << task->id << " prio=" << std::setw(2) - << task->priority << " burst=" << std::setw(2) << task->burst << " slice=" << slice << " "; -} - -struct DebugRoundRobinQueue : public RoundRobinQueue { -public: - void - print() const - { - for (auto *it = head; it != nullptr; it = it->next) { - std::cout << it->node->name << '(' << std::setw(2) << it->node->burst << ") "; - } - std::cout << std::endl; - } -}; - -TEST(roundrobin, RoundRobinQueue) -{ - DebugRoundRobinQueue queue; - queue.insert(new Task{"P1", 1, 1, 50}); - queue.insert(new Task{"P2", 2, 1, 40}); - queue.insert(new Task{"P3", 3, 1, 50}); - queue.insert(new Task{"P4", 4, 1, 40}); - - const auto begin = std::chrono::system_clock::now(); - for (auto *t = queue.next(10); t != nullptr; t = queue.next(10)) { - run(t, 10); - queue.print(); - } - const auto end = std::chrono::system_clock::now(); - const auto duration = std::chrono::duration_cast(end - begin).count(); - - std::cout << "Completed in (us): " << duration << std::endl; - // test should complete in 250us unless running on valgrind - if (!RUNNING_ON_VALGRIND) EXPECT_LE(duration, 250); - - EXPECT_EQ(queue.head, nullptr); - EXPECT_EQ(queue.tail, nullptr); -} diff --git a/src/tst/taskqueue.cc b/src/tst/taskqueue.cc deleted file mode 100644 index 217c44d..0000000 --- a/src/tst/taskqueue.cc +++ /dev/null @@ -1,122 +0,0 @@ -#include - -#include "../sched.hpp" - -struct DebugQueue : public Queue { -public: - void - expect_ordered() const - { - int id = 1; - for (auto *it = head; it != nullptr; it = it->next) { - // std::cout << it->node->name << std::endl; - EXPECT_EQ(it->node->id, id++); - } - } -}; - -TEST(taskqueue, insert) -{ - DebugQueue queue; - auto *p1 = new Task{"P1", 1, 1, 10}; - queue.insert(p1); - queue.insert(new Task{"P2", 2, 1, 10}); - queue.insert(new Task{"P3", 3, 1, 10}); - auto *p4 = new Task{"P4", 4, 1, 10}; - queue.insert(p4); - queue.expect_ordered(); - - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p4); -} - -TEST(taskqueue, removeHead) -{ - DebugQueue queue; - auto *p0 = new Task{"P0", 0, 1, 10}; - queue.insert(p0); - auto *p1 = new Task{"P1", 1, 1, 10}; - queue.insert(p1); - queue.insert(new Task{"P2", 2, 1, 10}); - queue.insert(new Task{"P3", 3, 1, 10}); - auto *p4 = new Task{"P4", 4, 1, 10}; - queue.insert(p4); - queue.remove(p0); - delete p0; - - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p4); - queue.expect_ordered(); -} - -TEST(taskqueue, removeTail) -{ - DebugQueue queue; - auto *p1 = new Task{"P1", 1, 1, 10}; - queue.insert(p1); - queue.insert(new Task{"P2", 2, 1, 10}); - queue.insert(new Task{"P3", 3, 1, 10}); - auto *p4 = new Task{"P4", 4, 1, 10}; - queue.insert(p4); - auto *p5 = new Task{"P5", 5, 1, 10}; - queue.insert(p5); - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p5); - - queue.remove(p5); - delete p5; - - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p4); - queue.expect_ordered(); -} - -TEST(taskqueue, removeLast) -{ - DebugQueue queue; - - auto *p0 = new Task{"P0", 0, 1, 10}; - queue.insert(p0); - EXPECT_EQ(queue.head->node, p0); - EXPECT_EQ(queue.tail->node, p0); - - queue.remove(p0); - delete p0; - - EXPECT_EQ(queue.head, nullptr); - EXPECT_EQ(queue.tail, nullptr); -} - -TEST(taskqueue, removeNullptr) -{ - DebugQueue queue; - queue.insert(new Task{"P1", 1, 1, 10}); - queue.insert(new Task{"P2", 2, 1, 10}); - queue.insert(new Task{"P3", 3, 1, 10}); - queue.insert(new Task{"P4", 4, 1, 10}); - queue.remove(nullptr); - queue.expect_ordered(); -} - -TEST(taskqueue, remove) -{ - DebugQueue queue; - auto *p1 = new Task{"P1", 1, 1, 10}; - queue.insert(p1); - queue.insert(new Task{"P2", 2, 1, 10}); - auto *p0 = new Task{"P0", 0, 1, 10}; - queue.insert(p0); - queue.insert(new Task{"P3", 3, 1, 10}); - auto *p4 = new Task{"P4", 4, 1, 10}; - queue.insert(p4); - - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p4); - - queue.remove(p0); - delete p0; - - EXPECT_EQ(queue.head->node, p1); - EXPECT_EQ(queue.tail->node, p4); - queue.expect_ordered(); -} -- cgit v1.2.1