GCC Code Coverage Report


Directory: src/gate/
File: src/gate/tests/gatecore_cpp_test/test_coroutines.cpp
Date: 2025-09-14 13:10:38
Exec Total Coverage
Lines: 67 69 97.1%
Functions: 9 9 100.0%
Branches: 61 169 36.1%

Line Branch Exec Source
1 #include "gate/tests.hpp"
2 #include "gate/coroutines.hpp"
3
4 using namespace gate;
5
6 static gate_result_t co1(void* param);
7 static gate_result_t co2(void* param);
8 static gate_result_t co_main(void* param);
9
10 struct co_params
11 {
12 Coroutine::id_t id0;
13 Coroutine::id_t id1;
14 Coroutine::id_t id2;
15
16 int state;
17 };
18
19 1 static gate_result_t co1(void* param)
20 {
21 1 co_params* ptr = (co_params*)param;
22
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK(ptr != NULL);
23
24
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 0);
25 1 ptr->state = 1;
26
27 // interrupt -> switch to co2
28 1 Coroutine::switchTo(ptr->id2);
29
30 // continue from co_main
31
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 3);
32 1 ptr->state = 4;
33
34 // interrupt -> switch to co_main
35 1 Coroutine::switchTo(ptr->id0);
36
37 // exit scenario:
38
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 5);
39 1 return results::Ok;
40 }
41 1 static gate_result_t co2(void* param)
42 {
43 1 co_params* ptr = (co_params*)param;
44
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK(ptr != NULL);
45
46 // come from co1
47
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 1);
48 1 ptr->state = 2;
49
50 // interrupt -> switch co_main
51 1 Coroutine::switchTo(ptr->id0);
52
53 // exit scenario:
54
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 5);
55 1 return results::Ok;
56 }
57 1 static gate_result_t co_main(void* param)
58 {
59 1 co_params* ptr = (co_params*)param;
60
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 GATEXX_TEST_CHECK(Coroutine::enabled());
61
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 0);
62
63
2/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
1 GATEXX_TEST_CHECK_NOTHROW(ptr->id0 = Coroutine::getCurrent());
64
2/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
1 GATEXX_TEST_CHECK_NOTHROW(ptr->id1 = Coroutine::create(&co1, param));
65
2/8
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
1 GATEXX_TEST_CHECK_NOTHROW(ptr->id2 = Coroutine::create(&co2, param));
66
67
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_NOT_EQUAL(ptr->id0, ptr->id1);
68
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_NOT_EQUAL(ptr->id0, ptr->id2);
69
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_NOT_EQUAL(ptr->id1, ptr->id2);
70
71
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 0);
72
73 // start co1
74 1 Coroutine::switchTo(ptr->id1);
75
76 // return from co2
77
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 2);
78
79 1 ptr->state = 3;
80
81 // continue co1
82 1 Coroutine::switchTo(ptr->id1);
83
84 // return from co1
85
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 GATEXX_TEST_CHECK_EQUAL(ptr->state, 4);
86
87 // exit scenario:
88 1 ptr->state = 5;
89 1 return results::Ok;
90 }
91
92
93
2/7
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
6 GATEXX_TEST_UNIT(Coroutine)
94 {
95
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
2 if (!Coroutine::supported())
96 {
97 return;
98 }
99
100
5/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
2 GATEXX_TEST_CHECK(!Coroutine::enabled());
101
102 co_params params;
103 2 params.state = 0;
104
105
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
2 GATEXX_TEST_CHECK_NOTHROW(Coroutine::run(&co_main, &params));
106
107
4/12
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_EQUAL(params.state, 5);
108 }
109
110
111
112 class GATE_API_LOCAL Yielder : public IRunnable
113 {
114
115 public:
116 int yield_counter;
117
118 4 Yielder(int counter) : yield_counter(counter)
119 {
120 4 }
121
122 14 virtual void run() override
123 {
124
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 4 times.
14 while (this->yield_counter-- > 0)
125 {
126
2/8
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
10 GATEXX_TEST_CHECK_NOTHROW(Coroutine::yield());
127 }
128 4 }
129 };
130
131 class GATE_API_LOCAL Waiter : public IRunnable
132 {
133 public:
134 2 virtual void run() override
135 {
136 {
137 4 Yielder yielder(3);
138 2 Coroutine::id_t yield_job = 0;
139
4/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
2 GATEXX_TEST_REQUIRE_NOTHROW(yield_job = Coroutine::create(yielder));
140
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 result_t result = Coroutine::await(yield_job);
141
4/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_OK(result);
142
143 }
144
145 {
146
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 Ptr<IRunnable> code = new Yielder(2);
147 2 Coroutine::id_t yield_job = 0;
148
4/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
2 GATEXX_TEST_REQUIRE_NOTHROW(yield_job = Coroutine::create(code));
149
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 result_t result = Coroutine::await(yield_job);
150
4/12
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
2 GATEXX_TEST_CHECK_OK(result);
151
152 }
153 2 }
154 };
155
156 3 GATEXX_TEST_UNIT(CoroutineWaitYield)
157 {
158 1 if (!Coroutine::supported())
159 {
160 return;
161 }
162
163 {
164 2 Ptr<IRunnable> waiter = new Waiter();
165 1 GATEXX_TEST_CHECK_NOTHROW(Coroutine::run(waiter));
166 }
167
168 {
169 1 Waiter waiter;
170 1 GATEXX_TEST_CHECK_NOTHROW(Coroutine::run(waiter));
171 }
172 }
173