summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/gtest/TestJSON.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/gtest/TestJSON.cpp')
-rw-r--r--ipc/ipdl/test/gtest/TestJSON.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/ipc/ipdl/test/gtest/TestJSON.cpp b/ipc/ipdl/test/gtest/TestJSON.cpp
new file mode 100644
index 0000000000..a3f881abda
--- /dev/null
+++ b/ipc/ipdl/test/gtest/TestJSON.cpp
@@ -0,0 +1,157 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Test sending JSON(-like) objects over IPC.
+ */
+
+#include "gtest/gtest.h"
+
+#include "mozilla/_ipdltest/IPDLUnitTest.h"
+#include "mozilla/_ipdltest/PTestJSONChild.h"
+#include "mozilla/_ipdltest/PTestJSONParent.h"
+#include "mozilla/_ipdltest/PTestJSONHandleChild.h"
+#include "mozilla/_ipdltest/PTestJSONHandleParent.h"
+
+using namespace mozilla::ipc;
+
+namespace mozilla::_ipdltest {
+
+static nsString String(const char* const str) {
+ return NS_ConvertUTF8toUTF16(str);
+}
+
+static void Array123(nsTArray<JSONVariant>& a123) {
+ a123.AppendElement(1);
+ a123.AppendElement(2);
+ a123.AppendElement(3);
+
+ ASSERT_EQ(a123, a123) << "operator== is broken";
+}
+
+template <class HandleT>
+JSONVariant MakeTestVariant(HandleT* handle) {
+ // In JS syntax:
+ //
+ // return [
+ // undefined, null, true, 1.25, "test string",
+ // handle,
+ // [ 1, 2, 3 ],
+ // { "undefined" : undefined,
+ // "null" : null,
+ // "true" : true,
+ // "1.25" : 1.25,
+ // "string" : "string"
+ // "handle" : handle,
+ // "array" : [ 1, 2, 3 ]
+ // }
+ // ]
+ //
+ nsTArray<JSONVariant> outer;
+
+ outer.AppendElement(void_t());
+ outer.AppendElement(null_t());
+ outer.AppendElement(true);
+ outer.AppendElement(1.25);
+ outer.AppendElement(String("test string"));
+
+ outer.AppendElement(handle);
+
+ nsTArray<JSONVariant> tmp;
+ Array123(tmp);
+ outer.AppendElement(tmp);
+
+ nsTArray<KeyValue> obj;
+ obj.AppendElement(KeyValue(String("undefined"), void_t()));
+ obj.AppendElement(KeyValue(String("null"), null_t()));
+ obj.AppendElement(KeyValue(String("true"), true));
+ obj.AppendElement(KeyValue(String("1.25"), 1.25));
+ obj.AppendElement(KeyValue(String("string"), String("value")));
+ obj.AppendElement(KeyValue(String("handle"), handle));
+ nsTArray<JSONVariant> tmp2;
+ Array123(tmp2);
+ obj.AppendElement(KeyValue(String("array"), tmp2));
+
+ outer.AppendElement(obj);
+
+ EXPECT_EQ(outer, outer) << "operator== is broken";
+
+ return JSONVariant(outer);
+}
+
+//-----------------------------------------------------------------------------
+// parent
+
+class TestJSONHandleParent : public PTestJSONHandleParent {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONHandleParent, override)
+ private:
+ ~TestJSONHandleParent() = default;
+};
+
+class TestJSONHandleChild : public PTestJSONHandleChild {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONHandleChild, override)
+ private:
+ ~TestJSONHandleChild() = default;
+};
+
+class TestJSONParent : public PTestJSONParent {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONParent, override)
+ private:
+ IPCResult RecvTest(const JSONVariant& i, JSONVariant* o) final override {
+ EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "inparam mangled en route";
+
+ *o = i;
+
+ EXPECT_EQ(i, *o) << "operator== and/or copy assignment are broken";
+
+ return IPC_OK();
+ }
+
+ already_AddRefed<PTestJSONHandleParent> AllocPTestJSONHandleParent()
+ final override {
+ auto handle = MakeRefPtr<TestJSONHandleParent>();
+ EXPECT_FALSE(mKid);
+ mKid = handle;
+ return handle.forget();
+ }
+
+ ~TestJSONParent() = default;
+
+ RefPtr<PTestJSONHandleParent> mKid;
+};
+
+//-----------------------------------------------------------------------------
+// child
+
+class TestJSONChild : public PTestJSONChild {
+ NS_INLINE_DECL_REFCOUNTING(TestJSONChild, override)
+ private:
+ IPCResult RecvStart() final override {
+ mKid = MakeRefPtr<TestJSONHandleChild>();
+ EXPECT_TRUE(SendPTestJSONHandleConstructor(mKid)) << "sending Handle ctor";
+
+ JSONVariant i(MakeTestVariant(mKid.get()));
+ EXPECT_EQ(i, i) << "operator== is broken";
+ EXPECT_EQ(i, MakeTestVariant(mKid.get())) << "copy ctor is broken";
+
+ JSONVariant o;
+ EXPECT_TRUE(SendTest(i, &o)) << "sending Test";
+
+ EXPECT_EQ(i, o) << "round-trip mangled input data";
+ EXPECT_EQ(o, MakeTestVariant(mKid.get())) << "outparam mangled en route";
+
+ Close();
+ return IPC_OK();
+ }
+
+ ~TestJSONChild() = default;
+
+ RefPtr<PTestJSONHandleChild> mKid;
+};
+
+IPDL_TEST(TestJSON) { EXPECT_TRUE(mActor->SendStart()) << "sending Start"; }
+
+} // namespace mozilla::_ipdltest