aboutsummaryrefslogtreecommitdiff
path: root/kernel/sched/test_roundrobin.cc
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/test_roundrobin.cc')
-rw-r--r--kernel/sched/test_roundrobin.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/kernel/sched/test_roundrobin.cc b/kernel/sched/test_roundrobin.cc
new file mode 100644
index 0000000..89f60bf
--- /dev/null
+++ b/kernel/sched/test_roundrobin.cc
@@ -0,0 +1,50 @@
+#include <chrono>
+#include <gtest/gtest.h>
+#include <iomanip>
+#include <iostream>
+#include <valgrind/valgrind.h>
+
+#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<std::chrono::microseconds>(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);
+}