annotate win64-msvc/include/capnp/test-util.h @ 58:eab3b14ddc95

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