tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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