DeserializedNodeUbiNodes.cpp (3181B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 // Test that the `JS::ubi::Node`s we create from 7 // `mozilla::devtools::DeserializedNode` instances look and behave as we would 8 // like. 9 10 #include "DevTools.h" 11 #include "js/TypeDecls.h" 12 #include "mozilla/devtools/DeserializedNode.h" 13 14 using testing::Field; 15 using testing::ReturnRef; 16 17 // A mock DeserializedNode for testing. 18 struct MockDeserializedNode : public DeserializedNode { 19 MockDeserializedNode(NodeId id, const char16_t* typeName, uint64_t size) 20 : DeserializedNode(id, typeName, size) {} 21 22 bool addEdge(DeserializedEdge&& edge) { 23 return edges.append(std::move(edge)); 24 } 25 26 MOCK_METHOD1(getEdgeReferent, JS::ubi::Node(const DeserializedEdge&)); 27 }; 28 29 size_t fakeMallocSizeOf(const void*) { 30 EXPECT_TRUE(false); 31 MOZ_ASSERT_UNREACHABLE( 32 "fakeMallocSizeOf should never be called because " 33 "DeserializedNodes report the deserialized size."); 34 return 0; 35 } 36 37 DEF_TEST(DeserializedNodeUbiNodes, { 38 const char16_t* typeName = u"TestTypeName"; 39 const char* className = "MyObjectClassName"; 40 const char* filename = "my-cool-filename.js"; 41 42 NodeId id = uint64_t(1) << 33; 43 uint64_t size = uint64_t(1) << 60; 44 MockDeserializedNode mocked(id, typeName, size); 45 mocked.coarseType = JS::ubi::CoarseType::Script; 46 mocked.jsObjectClassName = className; 47 mocked.scriptFilename = filename; 48 49 DeserializedNode& deserialized = mocked; 50 JS::ubi::Node ubi(&deserialized); 51 52 // Test the ubi::Node accessors. 53 54 EXPECT_EQ(size, ubi.size(fakeMallocSizeOf)); 55 EXPECT_EQ(typeName, ubi.typeName()); 56 EXPECT_EQ(JS::ubi::CoarseType::Script, ubi.coarseType()); 57 EXPECT_EQ(id, ubi.identifier()); 58 EXPECT_FALSE(ubi.isLive()); 59 EXPECT_EQ(ubi.jsObjectClassName(), className); 60 EXPECT_EQ(ubi.scriptFilename(), filename); 61 62 // Test the ubi::Node's edges. 63 64 UniquePtr<DeserializedNode> referent1( 65 new MockDeserializedNode(1, nullptr, 10)); 66 DeserializedEdge edge1(referent1->id); 67 mocked.addEdge(std::move(edge1)); 68 EXPECT_CALL(mocked, getEdgeReferent(EdgeTo(referent1->id))) 69 .Times(1) 70 .WillOnce(Return(JS::ubi::Node(referent1.get()))); 71 72 UniquePtr<DeserializedNode> referent2( 73 new MockDeserializedNode(2, nullptr, 20)); 74 DeserializedEdge edge2(referent2->id); 75 mocked.addEdge(std::move(edge2)); 76 EXPECT_CALL(mocked, getEdgeReferent(EdgeTo(referent2->id))) 77 .Times(1) 78 .WillOnce(Return(JS::ubi::Node(referent2.get()))); 79 80 UniquePtr<DeserializedNode> referent3( 81 new MockDeserializedNode(3, nullptr, 30)); 82 DeserializedEdge edge3(referent3->id); 83 mocked.addEdge(std::move(edge3)); 84 EXPECT_CALL(mocked, getEdgeReferent(EdgeTo(referent3->id))) 85 .Times(1) 86 .WillOnce(Return(JS::ubi::Node(referent3.get()))); 87 88 auto range = ubi.edges(cx); 89 ASSERT_TRUE(!!range); 90 91 for (; !range->empty(); range->popFront()) { 92 // Nothing to do here. This loop ensures that we get each edge referent 93 // that we expect above. 94 } 95 });