aboutsummaryrefslogtreecommitdiff
path: root/src/tst/roundrobin.cc
blob: 143178881751364b535ee40e44df816c369f2c62 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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);
}