annotate win32-mingw/include/capnp/test-util.h @ 149:279b18cc7785

Update Win32 capnp builds to v0.6
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 23 May 2017 09:16:54 +0100
parents 38d1c0e7850b
children
rev   line source
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_