annotate win64-msvc/include/capnp/test-util.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +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_