TestJSON.cpp (4422B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this file, 5 * You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 /* 8 * Test sending JSON(-like) objects over IPC. 9 */ 10 11 #include "gtest/gtest.h" 12 13 #include "mozilla/_ipdltest/IPDLUnitTest.h" 14 #include "mozilla/_ipdltest/PTestJSONChild.h" 15 #include "mozilla/_ipdltest/PTestJSONParent.h" 16 #include "mozilla/_ipdltest/PTestJSONHandleChild.h" 17 #include "mozilla/_ipdltest/PTestJSONHandleParent.h" 18 19 using namespace mozilla::ipc; 20 21 namespace mozilla::_ipdltest { 22 23 static nsString String(const char* const str) { 24 return NS_ConvertUTF8toUTF16(str); 25 } 26 27 static void Array123(nsTArray<JSONVariant>& a123) { 28 a123.AppendElement(1); 29 a123.AppendElement(2); 30 a123.AppendElement(3); 31 32 ASSERT_EQ(a123, a123) << "operator== is broken"; 33 } 34 35 template <class HandleT> 36 JSONVariant MakeTestVariant(HandleT* handle) { 37 // In JS syntax: 38 // 39 // return [ 40 // undefined, null, true, 1.25, "test string", 41 // handle, 42 // [ 1, 2, 3 ], 43 // { "undefined" : undefined, 44 // "null" : null, 45 // "true" : true, 46 // "1.25" : 1.25, 47 // "string" : "string" 48 // "handle" : handle, 49 // "array" : [ 1, 2, 3 ] 50 // } 51 // ] 52 // 53 nsTArray<JSONVariant> outer; 54 55 outer.AppendElement(void_t()); 56 outer.AppendElement(null_t()); 57 outer.AppendElement(true); 58 outer.AppendElement(1.25); 59 outer.AppendElement(String("test string")); 60 61 outer.AppendElement(handle); 62 63 nsTArray<JSONVariant> tmp; 64 Array123(tmp); 65 outer.AppendElement(tmp); 66 67 nsTArray<KeyValue> obj; 68 obj.AppendElement(KeyValue(String("undefined"), void_t())); 69 obj.AppendElement(KeyValue(String("null"), null_t())); 70 obj.AppendElement(KeyValue(String("true"), true)); 71 obj.AppendElement(KeyValue(String("1.25"), 1.25)); 72 obj.AppendElement(KeyValue(String("string"), String("value"))); 73 obj.AppendElement(KeyValue(String("handle"), handle)); 74 nsTArray<JSONVariant> tmp2; 75 Array123(tmp2); 76 obj.AppendElement(KeyValue(String("array"), tmp2)); 77 78 outer.AppendElement(obj); 79 80 EXPECT_EQ(outer, outer) << "operator== is broken"; 81 82 return JSONVariant(outer); 83 } 84 85 //----------------------------------------------------------------------------- 86 // parent 87 88 class TestJSONHandleParent : public PTestJSONHandleParent { 89 NS_INLINE_DECL_REFCOUNTING(TestJSONHandleParent, override) 90 private: 91 ~TestJSONHandleParent() = default; 92 }; 93 94 class TestJSONHandleChild : public PTestJSONHandleChild { 95 NS_INLINE_DECL_REFCOUNTING(TestJSONHandleChild, override) 96 private: 97 ~TestJSONHandleChild() = default; 98 }; 99 100 class TestJSONParent : public PTestJSONParent { 101 NS_INLINE_DECL_REFCOUNTING(TestJSONParent, override) 102 private: 103 IPCResult RecvTest(const JSONVariant& i, JSONVariant* o) final override { 104 EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "inparam mangled en route"; 105 106 *o = i; 107 108 EXPECT_EQ(i, *o) << "operator== and/or copy assignment are broken"; 109 110 return IPC_OK(); 111 } 112 113 already_AddRefed<PTestJSONHandleParent> AllocPTestJSONHandleParent() 114 final override { 115 auto handle = MakeRefPtr<TestJSONHandleParent>(); 116 EXPECT_FALSE(mKid); 117 mKid = handle; 118 return handle.forget(); 119 } 120 121 ~TestJSONParent() = default; 122 123 RefPtr<PTestJSONHandleParent> mKid; 124 }; 125 126 //----------------------------------------------------------------------------- 127 // child 128 129 class TestJSONChild : public PTestJSONChild { 130 NS_INLINE_DECL_REFCOUNTING(TestJSONChild, override) 131 private: 132 IPCResult RecvStart() final override { 133 mKid = MakeRefPtr<TestJSONHandleChild>(); 134 EXPECT_TRUE(SendPTestJSONHandleConstructor(mKid)) << "sending Handle ctor"; 135 136 JSONVariant i(MakeTestVariant(mKid.get())); 137 EXPECT_EQ(i, i) << "operator== is broken"; 138 EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "copy ctor is broken"; 139 140 JSONVariant o; 141 EXPECT_TRUE(SendTest(i, &o)) << "sending Test"; 142 143 EXPECT_EQ(i, o) << "round-trip mangled input data"; 144 EXPECT_EQ(o, MakeTestVariant(mKid.get())) << "outparam mangled en route"; 145 146 Close(); 147 return IPC_OK(); 148 } 149 150 ~TestJSONChild() = default; 151 152 RefPtr<PTestJSONHandleChild> mKid; 153 }; 154 155 IPDL_TEST(TestJSON) { EXPECT_TRUE(mActor->SendStart()) << "sending Start"; } 156 157 } // namespace mozilla::_ipdltest