annotate win64-msvc/include/capnp/test-util.h @ 74:2f2b27544483

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