cannam@149
|
1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
|
cannam@149
|
2 // Licensed under the MIT License:
|
cannam@149
|
3 //
|
cannam@149
|
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
cannam@149
|
5 // of this software and associated documentation files (the "Software"), to deal
|
cannam@149
|
6 // in the Software without restriction, including without limitation the rights
|
cannam@149
|
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
cannam@149
|
8 // copies of the Software, and to permit persons to whom the Software is
|
cannam@149
|
9 // furnished to do so, subject to the following conditions:
|
cannam@149
|
10 //
|
cannam@149
|
11 // The above copyright notice and this permission notice shall be included in
|
cannam@149
|
12 // all copies or substantial portions of the Software.
|
cannam@149
|
13 //
|
cannam@149
|
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
cannam@149
|
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
cannam@149
|
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
cannam@149
|
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
cannam@149
|
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
cannam@149
|
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
cannam@149
|
20 // THE SOFTWARE.
|
cannam@149
|
21
|
cannam@149
|
22 #ifndef CAPNP_TEST_UTIL_H_
|
cannam@149
|
23 #define CAPNP_TEST_UTIL_H_
|
cannam@149
|
24
|
cannam@149
|
25 #if defined(__GNUC__) && !defined(CAPNP_HEADER_WARNINGS)
|
cannam@149
|
26 #pragma GCC system_header
|
cannam@149
|
27 #endif
|
cannam@149
|
28
|
cannam@149
|
29 #include <capnp/test.capnp.h>
|
cannam@149
|
30 #include <iostream>
|
cannam@149
|
31 #include "blob.h"
|
cannam@149
|
32 #include <kj/compat/gtest.h>
|
cannam@149
|
33
|
cannam@149
|
34 #if !CAPNP_LITE
|
cannam@149
|
35 #include "dynamic.h"
|
cannam@149
|
36 #endif // !CAPNP_LITE
|
cannam@149
|
37
|
cannam@149
|
38 // TODO(cleanup): Auto-generate stringification functions for union discriminants.
|
cannam@149
|
39 namespace capnproto_test {
|
cannam@149
|
40 namespace capnp {
|
cannam@149
|
41 namespace test {
|
cannam@149
|
42 inline kj::String KJ_STRINGIFY(TestUnion::Union0::Which which) {
|
cannam@149
|
43 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
44 }
|
cannam@149
|
45 inline kj::String KJ_STRINGIFY(TestUnion::Union1::Which which) {
|
cannam@149
|
46 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
47 }
|
cannam@149
|
48 inline kj::String KJ_STRINGIFY(TestUnion::Union2::Which which) {
|
cannam@149
|
49 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
50 }
|
cannam@149
|
51 inline kj::String KJ_STRINGIFY(TestUnion::Union3::Which which) {
|
cannam@149
|
52 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
53 }
|
cannam@149
|
54 inline kj::String KJ_STRINGIFY(TestUnnamedUnion::Which which) {
|
cannam@149
|
55 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
56 }
|
cannam@149
|
57 inline kj::String KJ_STRINGIFY(TestGroups::Groups::Which which) {
|
cannam@149
|
58 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
59 }
|
cannam@149
|
60 inline kj::String KJ_STRINGIFY(TestInterleavedGroups::Group1::Which which) {
|
cannam@149
|
61 return kj::str(static_cast<uint16_t>(which));
|
cannam@149
|
62 }
|
cannam@149
|
63 } // namespace test
|
cannam@149
|
64 } // namespace capnp
|
cannam@149
|
65 } // namespace capnproto_test
|
cannam@149
|
66
|
cannam@149
|
67 namespace capnp {
|
cannam@149
|
68 namespace _ { // private
|
cannam@149
|
69
|
cannam@149
|
70 inline Data::Reader data(const char* str) {
|
cannam@149
|
71 return Data::Reader(reinterpret_cast<const byte*>(str), strlen(str));
|
cannam@149
|
72 }
|
cannam@149
|
73
|
cannam@149
|
74 namespace test = capnproto_test::capnp::test;
|
cannam@149
|
75
|
cannam@149
|
76 // We don't use "using namespace" to pull these in because then things would still compile
|
cannam@149
|
77 // correctly if they were generated in the global namespace.
|
cannam@149
|
78 using ::capnproto_test::capnp::test::TestAllTypes;
|
cannam@149
|
79 using ::capnproto_test::capnp::test::TestDefaults;
|
cannam@149
|
80 using ::capnproto_test::capnp::test::TestEnum;
|
cannam@149
|
81 using ::capnproto_test::capnp::test::TestUnion;
|
cannam@149
|
82 using ::capnproto_test::capnp::test::TestUnionDefaults;
|
cannam@149
|
83 using ::capnproto_test::capnp::test::TestNestedTypes;
|
cannam@149
|
84 using ::capnproto_test::capnp::test::TestUsing;
|
cannam@149
|
85 using ::capnproto_test::capnp::test::TestListDefaults;
|
cannam@149
|
86
|
cannam@149
|
87 void initTestMessage(TestAllTypes::Builder builder);
|
cannam@149
|
88 void initTestMessage(TestDefaults::Builder builder);
|
cannam@149
|
89 void initTestMessage(TestListDefaults::Builder builder);
|
cannam@149
|
90
|
cannam@149
|
91 void checkTestMessage(TestAllTypes::Builder builder);
|
cannam@149
|
92 void checkTestMessage(TestDefaults::Builder builder);
|
cannam@149
|
93 void checkTestMessage(TestListDefaults::Builder builder);
|
cannam@149
|
94
|
cannam@149
|
95 void checkTestMessage(TestAllTypes::Reader reader);
|
cannam@149
|
96 void checkTestMessage(TestDefaults::Reader reader);
|
cannam@149
|
97 void checkTestMessage(TestListDefaults::Reader reader);
|
cannam@149
|
98
|
cannam@149
|
99 void checkTestMessageAllZero(TestAllTypes::Builder builder);
|
cannam@149
|
100 void checkTestMessageAllZero(TestAllTypes::Reader reader);
|
cannam@149
|
101
|
cannam@149
|
102 #if !CAPNP_LITE
|
cannam@149
|
103 void initDynamicTestMessage(DynamicStruct::Builder builder);
|
cannam@149
|
104 void initDynamicTestLists(DynamicStruct::Builder builder);
|
cannam@149
|
105 void checkDynamicTestMessage(DynamicStruct::Builder builder);
|
cannam@149
|
106 void checkDynamicTestLists(DynamicStruct::Builder builder);
|
cannam@149
|
107 void checkDynamicTestMessage(DynamicStruct::Reader reader);
|
cannam@149
|
108 void checkDynamicTestLists(DynamicStruct::Reader reader);
|
cannam@149
|
109 void checkDynamicTestMessageAllZero(DynamicStruct::Builder builder);
|
cannam@149
|
110 void checkDynamicTestMessageAllZero(DynamicStruct::Reader reader);
|
cannam@149
|
111 #endif // !CAPNP_LITE
|
cannam@149
|
112
|
cannam@149
|
113 template <typename T>
|
cannam@149
|
114 inline void checkElement(T a, T b) {
|
cannam@149
|
115 EXPECT_EQ(a, b);
|
cannam@149
|
116 }
|
cannam@149
|
117
|
cannam@149
|
118 template <>
|
cannam@149
|
119 inline void checkElement<float>(float a, float b) {
|
cannam@149
|
120 EXPECT_FLOAT_EQ(a, b);
|
cannam@149
|
121 }
|
cannam@149
|
122
|
cannam@149
|
123 template <>
|
cannam@149
|
124 inline void checkElement<double>(double a, double b) {
|
cannam@149
|
125 EXPECT_DOUBLE_EQ(a, b);
|
cannam@149
|
126 }
|
cannam@149
|
127
|
cannam@149
|
128 template <typename T, typename L = typename T::Reads>
|
cannam@149
|
129 void checkList(T reader, std::initializer_list<decltype(reader[0])> expected) {
|
cannam@149
|
130 ASSERT_EQ(expected.size(), reader.size());
|
cannam@149
|
131 for (uint i = 0; i < expected.size(); i++) {
|
cannam@149
|
132 checkElement<decltype(reader[0])>(expected.begin()[i], reader[i]);
|
cannam@149
|
133 }
|
cannam@149
|
134 }
|
cannam@149
|
135
|
cannam@149
|
136 template <typename T, typename L = typename T::Builds, bool = false>
|
cannam@149
|
137 void checkList(T reader, std::initializer_list<decltype(typename L::Reader()[0])> expected) {
|
cannam@149
|
138 ASSERT_EQ(expected.size(), reader.size());
|
cannam@149
|
139 for (uint i = 0; i < expected.size(); i++) {
|
cannam@149
|
140 checkElement<decltype(typename L::Reader()[0])>(expected.begin()[i], reader[i]);
|
cannam@149
|
141 }
|
cannam@149
|
142 }
|
cannam@149
|
143
|
cannam@149
|
144 inline void checkList(List<test::TestOldVersion>::Reader reader,
|
cannam@149
|
145 std::initializer_list<int64_t> expectedData,
|
cannam@149
|
146 std::initializer_list<Text::Reader> expectedPointers) {
|
cannam@149
|
147 ASSERT_EQ(expectedData.size(), reader.size());
|
cannam@149
|
148 for (uint i = 0; i < expectedData.size(); i++) {
|
cannam@149
|
149 EXPECT_EQ(expectedData.begin()[i], reader[i].getOld1());
|
cannam@149
|
150 EXPECT_EQ(expectedPointers.begin()[i], reader[i].getOld2());
|
cannam@149
|
151 }
|
cannam@149
|
152 }
|
cannam@149
|
153
|
cannam@149
|
154 // Hack because as<>() is a template-parameter-dependent lookup everywhere below...
|
cannam@149
|
155 #define as template as
|
cannam@149
|
156
|
cannam@149
|
157 template <typename T> void expectPrimitiveEq(T a, T b) { EXPECT_EQ(a, b); }
|
cannam@149
|
158 inline void expectPrimitiveEq(float a, float b) { EXPECT_FLOAT_EQ(a, b); }
|
cannam@149
|
159 inline void expectPrimitiveEq(double a, double b) { EXPECT_DOUBLE_EQ(a, b); }
|
cannam@149
|
160 inline void expectPrimitiveEq(Text::Reader a, Text::Builder b) { EXPECT_EQ(a, b); }
|
cannam@149
|
161 inline void expectPrimitiveEq(Data::Reader a, Data::Builder b) { EXPECT_EQ(a, b); }
|
cannam@149
|
162
|
cannam@149
|
163 #if !CAPNP_LITE
|
cannam@149
|
164 template <typename Element, typename T>
|
cannam@149
|
165 void checkList(T reader, std::initializer_list<ReaderFor<Element>> expected) {
|
cannam@149
|
166 auto list = reader.as<DynamicList>();
|
cannam@149
|
167 ASSERT_EQ(expected.size(), list.size());
|
cannam@149
|
168 for (uint i = 0; i < expected.size(); i++) {
|
cannam@149
|
169 expectPrimitiveEq(expected.begin()[i], list[i].as<Element>());
|
cannam@149
|
170 }
|
cannam@149
|
171
|
cannam@149
|
172 auto typed = reader.as<List<Element>>();
|
cannam@149
|
173 ASSERT_EQ(expected.size(), typed.size());
|
cannam@149
|
174 for (uint i = 0; i < expected.size(); i++) {
|
cannam@149
|
175 expectPrimitiveEq(expected.begin()[i], typed[i]);
|
cannam@149
|
176 }
|
cannam@149
|
177 }
|
cannam@149
|
178 #endif // !CAPNP_LITE
|
cannam@149
|
179
|
cannam@149
|
180 #undef as
|
cannam@149
|
181
|
cannam@149
|
182 // =======================================================================================
|
cannam@149
|
183 // Interface implementations.
|
cannam@149
|
184
|
cannam@149
|
185 #if !CAPNP_LITE
|
cannam@149
|
186
|
cannam@149
|
187 class TestInterfaceImpl final: public test::TestInterface::Server {
|
cannam@149
|
188 public:
|
cannam@149
|
189 TestInterfaceImpl(int& callCount);
|
cannam@149
|
190
|
cannam@149
|
191 kj::Promise<void> foo(FooContext context) override;
|
cannam@149
|
192
|
cannam@149
|
193 kj::Promise<void> baz(BazContext context) override;
|
cannam@149
|
194
|
cannam@149
|
195 private:
|
cannam@149
|
196 int& callCount;
|
cannam@149
|
197 };
|
cannam@149
|
198
|
cannam@149
|
199 class TestExtendsImpl final: public test::TestExtends2::Server {
|
cannam@149
|
200 public:
|
cannam@149
|
201 TestExtendsImpl(int& callCount);
|
cannam@149
|
202
|
cannam@149
|
203 kj::Promise<void> foo(FooContext context) override;
|
cannam@149
|
204
|
cannam@149
|
205 kj::Promise<void> grault(GraultContext context) override;
|
cannam@149
|
206
|
cannam@149
|
207 private:
|
cannam@149
|
208 int& callCount;
|
cannam@149
|
209 };
|
cannam@149
|
210
|
cannam@149
|
211 class TestPipelineImpl final: public test::TestPipeline::Server {
|
cannam@149
|
212 public:
|
cannam@149
|
213 TestPipelineImpl(int& callCount);
|
cannam@149
|
214
|
cannam@149
|
215 kj::Promise<void> getCap(GetCapContext context) override;
|
cannam@149
|
216 kj::Promise<void> getAnyCap(GetAnyCapContext context) override;
|
cannam@149
|
217
|
cannam@149
|
218 private:
|
cannam@149
|
219 int& callCount;
|
cannam@149
|
220 };
|
cannam@149
|
221
|
cannam@149
|
222 class TestCallOrderImpl final: public test::TestCallOrder::Server {
|
cannam@149
|
223 public:
|
cannam@149
|
224 kj::Promise<void> getCallSequence(GetCallSequenceContext context) override;
|
cannam@149
|
225
|
cannam@149
|
226 private:
|
cannam@149
|
227 uint count = 0;
|
cannam@149
|
228 };
|
cannam@149
|
229
|
cannam@149
|
230 class TestTailCallerImpl final: public test::TestTailCaller::Server {
|
cannam@149
|
231 public:
|
cannam@149
|
232 TestTailCallerImpl(int& callCount);
|
cannam@149
|
233
|
cannam@149
|
234 kj::Promise<void> foo(FooContext context) override;
|
cannam@149
|
235
|
cannam@149
|
236 private:
|
cannam@149
|
237 int& callCount;
|
cannam@149
|
238 };
|
cannam@149
|
239
|
cannam@149
|
240 class TestTailCalleeImpl final: public test::TestTailCallee::Server {
|
cannam@149
|
241 public:
|
cannam@149
|
242 TestTailCalleeImpl(int& callCount);
|
cannam@149
|
243
|
cannam@149
|
244 kj::Promise<void> foo(FooContext context) override;
|
cannam@149
|
245
|
cannam@149
|
246 private:
|
cannam@149
|
247 int& callCount;
|
cannam@149
|
248 };
|
cannam@149
|
249
|
cannam@149
|
250 class TestMoreStuffImpl final: public test::TestMoreStuff::Server {
|
cannam@149
|
251 public:
|
cannam@149
|
252 TestMoreStuffImpl(int& callCount, int& handleCount);
|
cannam@149
|
253
|
cannam@149
|
254 kj::Promise<void> getCallSequence(GetCallSequenceContext context) override;
|
cannam@149
|
255
|
cannam@149
|
256 kj::Promise<void> callFoo(CallFooContext context) override;
|
cannam@149
|
257
|
cannam@149
|
258 kj::Promise<void> callFooWhenResolved(CallFooWhenResolvedContext context) override;
|
cannam@149
|
259
|
cannam@149
|
260 kj::Promise<void> neverReturn(NeverReturnContext context) override;
|
cannam@149
|
261
|
cannam@149
|
262 kj::Promise<void> hold(HoldContext context) override;
|
cannam@149
|
263
|
cannam@149
|
264 kj::Promise<void> callHeld(CallHeldContext context) override;
|
cannam@149
|
265
|
cannam@149
|
266 kj::Promise<void> getHeld(GetHeldContext context) override;
|
cannam@149
|
267
|
cannam@149
|
268 kj::Promise<void> echo(EchoContext context) override;
|
cannam@149
|
269
|
cannam@149
|
270 kj::Promise<void> expectCancel(ExpectCancelContext context) override;
|
cannam@149
|
271
|
cannam@149
|
272 kj::Promise<void> getHandle(GetHandleContext context) override;
|
cannam@149
|
273
|
cannam@149
|
274 kj::Promise<void> getNull(GetNullContext context) override;
|
cannam@149
|
275
|
cannam@149
|
276 kj::Promise<void> getEnormousString(GetEnormousStringContext context) override;
|
cannam@149
|
277
|
cannam@149
|
278 private:
|
cannam@149
|
279 int& callCount;
|
cannam@149
|
280 int& handleCount;
|
cannam@149
|
281 test::TestInterface::Client clientToHold = nullptr;
|
cannam@149
|
282
|
cannam@149
|
283 kj::Promise<void> loop(uint depth, test::TestInterface::Client cap, ExpectCancelContext context);
|
cannam@149
|
284 };
|
cannam@149
|
285
|
cannam@149
|
286 class TestCapDestructor final: public test::TestInterface::Server {
|
cannam@149
|
287 // Implementation of TestInterface that notifies when it is destroyed.
|
cannam@149
|
288
|
cannam@149
|
289 public:
|
cannam@149
|
290 TestCapDestructor(kj::Own<kj::PromiseFulfiller<void>>&& fulfiller)
|
cannam@149
|
291 : fulfiller(kj::mv(fulfiller)), impl(dummy) {}
|
cannam@149
|
292
|
cannam@149
|
293 ~TestCapDestructor() {
|
cannam@149
|
294 fulfiller->fulfill();
|
cannam@149
|
295 }
|
cannam@149
|
296
|
cannam@149
|
297 kj::Promise<void> foo(FooContext context) {
|
cannam@149
|
298 return impl.foo(context);
|
cannam@149
|
299 }
|
cannam@149
|
300
|
cannam@149
|
301 private:
|
cannam@149
|
302 kj::Own<kj::PromiseFulfiller<void>> fulfiller;
|
cannam@149
|
303 int dummy = 0;
|
cannam@149
|
304 TestInterfaceImpl impl;
|
cannam@149
|
305 };
|
cannam@149
|
306
|
cannam@149
|
307 #endif // !CAPNP_LITE
|
cannam@149
|
308
|
cannam@149
|
309 } // namespace _ (private)
|
cannam@149
|
310 } // namespace capnp
|
cannam@149
|
311
|
cannam@149
|
312 #endif // TEST_UTIL_H_
|