Line | Branch | Exec | Source |
---|---|---|---|
1 | #include "gate/tests.hpp" | ||
2 | #include "gate/functions.hpp" | ||
3 | #include "gate/callstacks.hpp" | ||
4 | |||
5 | using namespace gate; | ||
6 | |||
7 |
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(CallstackTrace) |
8 | { | ||
9 | Callstack::Address addrbuffer[32]; | ||
10 | 4 | Result<gate::size_t> traceResult = Callstack::trace(addrbuffer, sizeof(addrbuffer) / sizeof(addrbuffer[0])); | |
11 |
2/6✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
2 | if (traceResult.hasError() && (traceResult.error() == results::NotSupported)) |
12 | { | ||
13 | /* trace feature not support on platform, tests are meaningless */ | ||
14 | } | ||
15 | else | ||
16 | { | ||
17 |
4/12✓ 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 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
2 | GATEXX_TEST_REQUIRE(traceResult.hasValue()); |
18 | 2 | gate::size_t addrbuffer_used = traceResult.value(); | |
19 |
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_REQUIRE(addrbuffer_used > 0); |
20 | |||
21 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
4 | StringBuilder sb; |
22 | 4 | VoidResult printResult = Callstack::print(addrbuffer[0], sb); | |
23 |
4/12✓ 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 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
2 | GATEXX_TEST_CHECK(!printResult.hasError()); |
24 | } | ||
25 | 2 | } | |
26 | |||
27 | |||
28 | static int cs_state = 0; | ||
29 | static Callstack::Context main_context; | ||
30 | static Callstack::Context other_context; | ||
31 | |||
32 | class GATE_API_LOCAL OtherStackCode : public IRunnable | ||
33 | { | ||
34 | public: | ||
35 | 1 | void run() override | |
36 | { | ||
37 | 1 | cs_state = 1; | |
38 | 1 | Callstack::switchTo(other_context, main_context); | |
39 | ✗ | } | |
40 | }; | ||
41 | |||
42 |
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(CallstackRun) |
43 | { | ||
44 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
4 | Callstack cs(4096); |
45 | 2 | OtherStackCode otherCode; | |
46 | 2 | cs_state = 0; | |
47 | 4 | Result<result_t> result = cs.run(main_context, otherCode); | |
48 |
2/6✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
|
2 | if (result.hasError() && (result.error() == results::NotSupported)) |
49 | { | ||
50 | /* stack switching is not supported on this platform, further tests are meaningless*/ | ||
51 | } | ||
52 | else | ||
53 | { | ||
54 |
4/12✓ 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 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
2 | GATEXX_TEST_REQUIRE(!result.hasError()); |
55 |
4/12✓ 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 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
2 | GATEXX_TEST_CHECK(result.value() == results::Ok); |
56 |
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(cs_state == 1); |
57 | } | ||
58 | 2 | } | |
59 | |||
60 | |||
61 | static int fork_state = 0; | ||
62 | |||
63 | class GATE_API_LOCAL MainForkCode : public IRunnable | ||
64 | { | ||
65 | public: | ||
66 | Callstack::Anchor anchor; | ||
67 | |||
68 | 1 | void run() override | |
69 | { | ||
70 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | GATEXX_TEST_CHECK(fork_state == 0); |
71 | 1 | fork_state = 1; | |
72 | 1 | Callstack::jumpToBranch(this->anchor); | |
73 | ✗ | } | |
74 | }; | ||
75 | |||
76 | class GATE_API_LOCAL BranchCode : public IRunnable | ||
77 | { | ||
78 | public: | ||
79 | 1 | void run() override | |
80 | { | ||
81 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | GATEXX_TEST_CHECK(fork_state == 1); |
82 | 1 | fork_state = 2; | |
83 | 1 | } | |
84 | }; | ||
85 | |||
86 |
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(CallstackFork) |
87 | { | ||
88 | 4 | MainForkCode maincode; | |
89 | 2 | BranchCode branchcode; | |
90 | 2 | fork_state = 0; | |
91 | 4 | VoidResult result = Callstack::fork(maincode.anchor, maincode, branchcode); | |
92 |
4/12✓ 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 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
2 | GATEXX_TEST_CHECK(!result.hasError()); |
93 |
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(fork_state == 2); |
94 | 2 | } | |
95 | |||
96 | |||
97 | 1 | static int test_func_sargs(signed char a, short b, int c, long d, long long e) | |
98 | { | ||
99 | 1 | return a + b + c + d + static_cast<int>(e); | |
100 | } | ||
101 | |||
102 | 1 | static unsigned int test_func_uargs(unsigned char a, unsigned short b, unsigned int c, unsigned long d, unsigned long long e) | |
103 | { | ||
104 | 1 | return a + b + c + d + static_cast<unsigned>(e); | |
105 | } | ||
106 | |||
107 | |||
108 |
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(GenericFunction) |
109 | { | ||
110 | { // signed int | ||
111 | FunctionArgument args[5] = { | ||
112 | static_cast<char>(1), | ||
113 | static_cast<short>(2), | ||
114 | 4 | static_cast<int>(3), | |
115 | static_cast<long>(4), | ||
116 | static_cast<long long>(5) | ||
117 |
2/4✓ Branch 5 taken 5 times.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
14 | }; |
118 | |||
119 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
4 | FunctionArgument retval = Function::invokeGeneric((gate_funcptr_t)&test_func_sargs, 0, args, 5); |
120 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | retval.getType(); |
121 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | int iretval = *static_cast<int const*>(retval.getValuePtr()); |
122 |
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(iretval, 15); |
123 | } | ||
124 | |||
125 | { // unsigned int | ||
126 | FunctionArgument args[5] = { | ||
127 | static_cast<unsigned char>(1), | ||
128 | static_cast<unsigned short>(2), | ||
129 | static_cast<unsigned int>(3), | ||
130 | static_cast<unsigned long>(4), | ||
131 | static_cast<unsigned long long>(5) | ||
132 |
2/4✓ Branch 5 taken 5 times.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
14 | }; |
133 | |||
134 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
4 | FunctionArgument retval = Function::invokeGeneric((gate_funcptr_t)&test_func_uargs, 0, args, 5); |
135 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | retval.getType(); |
136 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | int iretval = *static_cast<int const*>(retval.getValuePtr()); |
137 |
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(iretval, 15); |
138 | } | ||
139 | 2 | } | |
140 | |||
141 | class GATE_CORE_CPP_API GuardedCodeTarget : public gate::IRunnable, public gate::IQuitable | ||
142 | { | ||
143 | public: | ||
144 | result_t exitResult; | ||
145 | |||
146 | 3 | GuardedCodeTarget(result_t exit_result = results::Ok) | |
147 | 3 | : exitResult(exit_result) | |
148 | { | ||
149 | 3 | } | |
150 | |||
151 | 6 | virtual ~GuardedCodeTarget() noexcept | |
152 | 6 | { | |
153 | 6 | } | |
154 | |||
155 | 3 | virtual void run() override | |
156 | { | ||
157 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
|
3 | if (this->exitResult == results::UnknownException) |
158 | { | ||
159 | 1 | throw 123; | |
160 | } | ||
161 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | GATEXX_CHECK_EXCEPTION(this->exitResult); |
162 | 1 | } | |
163 | |||
164 | 1 | virtual void quit() override | |
165 | { | ||
166 | 1 | } | |
167 | }; | ||
168 | |||
169 |
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(InvokeGuarded) |
170 | { | ||
171 | { | ||
172 | 4 | GuardedCodeTarget noThrowCode(results::Ok); | |
173 |
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(Function::invokeGuarded(noThrowCode)); |
174 | 2 | noThrowCode.quit(); | |
175 | } | ||
176 | { | ||
177 | 4 | GuardedCodeTarget throwCode(results::Failed); | |
178 |
5/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
|
4 | GATEXX_TEST_CHECK_THROW(Function::invokeGuarded(throwCode)); |
179 | } | ||
180 | { | ||
181 | 4 | GuardedCodeTarget foreignCxxThrowCode(results::UnknownException); | |
182 |
5/14✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
|
4 | GATEXX_TEST_CHECK_THROW(Function::invokeGuarded(foreignCxxThrowCode)); |
183 | } | ||
184 | 2 | } | |
185 |