/src/mozilla-central/devtools/shared/heapsnapshot/tests/gtest/DeserializedStackFrameUbiStackFrames.cpp
Line | Count | Source (jump to first uncovered line) |
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::StackFrame`s we create from |
7 | | // `mozilla::devtools::DeserializedStackFrame` instances look and behave as we would |
8 | | // like. |
9 | | |
10 | | #include "DevTools.h" |
11 | | #include "js/SavedFrameAPI.h" |
12 | | #include "js/TypeDecls.h" |
13 | | #include "mozilla/devtools/DeserializedNode.h" |
14 | | |
15 | | using testing::Field; |
16 | | using testing::ReturnRef; |
17 | | |
18 | | // A mock DeserializedStackFrame for testing. |
19 | | struct MockDeserializedStackFrame : public DeserializedStackFrame |
20 | | { |
21 | 0 | MockDeserializedStackFrame() : DeserializedStackFrame() { } |
22 | | }; |
23 | | |
24 | | DEF_TEST(DeserializedStackFrameUbiStackFrames, { |
25 | | StackFrameId id = uint64_t(1) << 42; |
26 | | uint32_t line = 1337; |
27 | | uint32_t column = 9; // 3 space tabs!? |
28 | | const char16_t* source = u"my-javascript-file.js"; |
29 | | const char16_t* functionDisplayName = u"myFunctionName"; |
30 | | |
31 | | MockDeserializedStackFrame mocked; |
32 | | mocked.id = id; |
33 | | mocked.line = line; |
34 | | mocked.column = column; |
35 | | mocked.source = source; |
36 | | mocked.functionDisplayName = functionDisplayName; |
37 | | |
38 | | DeserializedStackFrame& deserialized = mocked; |
39 | | JS::ubi::StackFrame ubiFrame(&deserialized); |
40 | | |
41 | | // Test the JS::ubi::StackFrame accessors. |
42 | | |
43 | | EXPECT_EQ(id, ubiFrame.identifier()); |
44 | | EXPECT_EQ(JS::ubi::StackFrame(), ubiFrame.parent()); |
45 | | EXPECT_EQ(line, ubiFrame.line()); |
46 | | EXPECT_EQ(column, ubiFrame.column()); |
47 | | EXPECT_EQ(JS::ubi::AtomOrTwoByteChars(source), ubiFrame.source()); |
48 | | EXPECT_EQ(JS::ubi::AtomOrTwoByteChars(functionDisplayName), |
49 | | ubiFrame.functionDisplayName()); |
50 | | EXPECT_FALSE(ubiFrame.isSelfHosted(cx)); |
51 | | EXPECT_FALSE(ubiFrame.isSystem()); |
52 | | |
53 | | JS::RootedObject savedFrame(cx); |
54 | | EXPECT_TRUE(ubiFrame.constructSavedFrameStack(cx, &savedFrame)); |
55 | | |
56 | | JSPrincipals* principals = JS::GetRealmPrincipals(js::GetContextRealm(cx)); |
57 | | |
58 | | uint32_t frameLine; |
59 | | ASSERT_EQ(JS::SavedFrameResult::Ok, |
60 | | JS::GetSavedFrameLine(cx, principals, savedFrame, &frameLine)); |
61 | | EXPECT_EQ(line, frameLine); |
62 | | |
63 | | uint32_t frameColumn; |
64 | | ASSERT_EQ(JS::SavedFrameResult::Ok, |
65 | | JS::GetSavedFrameColumn(cx, principals, savedFrame, &frameColumn)); |
66 | | EXPECT_EQ(column, frameColumn); |
67 | | |
68 | | JS::RootedObject parent(cx); |
69 | | ASSERT_EQ(JS::SavedFrameResult::Ok, |
70 | | JS::GetSavedFrameParent(cx, principals, savedFrame, &parent)); |
71 | | EXPECT_EQ(nullptr, parent); |
72 | | |
73 | | ASSERT_EQ(NS_strlen(source), 21U); |
74 | | char16_t sourceBuf[21] = {}; |
75 | | |
76 | | // Test when the length is shorter than the string length. |
77 | | auto written = ubiFrame.source(RangedPtr<char16_t>(sourceBuf), 3); |
78 | | EXPECT_EQ(written, 3U); |
79 | | for (size_t i = 0; i < 3; i++) { |
80 | | EXPECT_EQ(sourceBuf[i], source[i]); |
81 | | } |
82 | | |
83 | | written = ubiFrame.source(RangedPtr<char16_t>(sourceBuf), 21); |
84 | | EXPECT_EQ(written, 21U); |
85 | | for (size_t i = 0; i < 21; i++) { |
86 | | EXPECT_EQ(sourceBuf[i], source[i]); |
87 | | } |
88 | | |
89 | | ASSERT_EQ(NS_strlen(functionDisplayName), 14U); |
90 | | char16_t nameBuf[14] = {}; |
91 | | |
92 | | written = ubiFrame.functionDisplayName(RangedPtr<char16_t>(nameBuf), 14); |
93 | | EXPECT_EQ(written, 14U); |
94 | | for (size_t i = 0; i < 14; i++) { |
95 | | EXPECT_EQ(nameBuf[i], functionDisplayName[i]); |
96 | | } |
97 | | }); |