annotate win64-msvc/include/capnp/test-util.h @ 135:38d1c0e7850b

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