summaryrefslogtreecommitdiff
path: root/deps/v8/test/cctest/test-traced-value.cc
blob: 3a33389a3e66dff92e5dfaeee7e4da8f71ebb3e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2016 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/tracing/traced-value.h"
#include "test/cctest/cctest.h"

using v8::tracing::TracedValue;

TEST(FlatDictionary) {
  auto value = TracedValue::Create();
  value->SetInteger("int", 2014);
  value->SetDouble("double", 0.0);
  value->SetBoolean("bool", true);
  value->SetString("string", "string");
  std::string json = "PREFIX";
  value->AppendAsTraceFormat(&json);
  CHECK_EQ(
      "PREFIX{\"int\":2014,\"double\":0,\"bool\":true,\"string\":"
      "\"string\"}",
      json);
}

TEST(NoDotPathExpansion) {
  auto value = TracedValue::Create();
  value->SetInteger("in.t", 2014);
  value->SetDouble("doub.le", -20.25);
  value->SetBoolean("bo.ol", true);
  value->SetString("str.ing", "str.ing");
  std::string json;
  value->AppendAsTraceFormat(&json);
  CHECK_EQ(
      "{\"in.t\":2014,\"doub.le\":-20.25,\"bo.ol\":true,\"str.ing\":\"str."
      "ing\"}",
      json);
}

TEST(Hierarchy) {
  auto value = TracedValue::Create();
  value->SetInteger("i0", 2014);
  value->BeginDictionary("dict1");
  value->SetInteger("i1", 2014);
  value->BeginDictionary("dict2");
  value->SetBoolean("b2", false);
  value->EndDictionary();
  value->SetString("s1", "foo");
  value->EndDictionary();
  value->SetDouble("d0", 0.0);
  value->SetDouble("d1", 10.5);
  value->SetBoolean("b0", true);
  value->BeginArray("a1");
  value->AppendInteger(1);
  value->AppendBoolean(true);
  value->BeginDictionary();
  value->SetInteger("i2", 3);
  value->EndDictionary();
  value->EndArray();
  value->SetString("s0", "foo");

  value->BeginArray("arr1");
  value->BeginDictionary();
  value->EndDictionary();
  value->BeginArray();
  value->EndArray();
  value->BeginDictionary();
  value->EndDictionary();
  value->EndArray();

  std::string json;
  value->AppendAsTraceFormat(&json);
  CHECK_EQ(
      "{\"i0\":2014,\"dict1\":{\"i1\":2014,\"dict2\":{\"b2\":false},"
      "\"s1\":\"foo\"},\"d0\":0,\"d1\":10.5,\"b0\":true,\"a1\":[1,true,{\"i2\":"
      "3}],\"s0\":\"foo\",\"arr1\":[{},[],{}]}",
      json);
}

TEST(LongStrings) {
  std::string long_string = "supercalifragilisticexpialidocious";
  std::string long_string2 = "0123456789012345678901234567890123456789";
  char long_string3[4096];
  for (size_t i = 0; i < sizeof(long_string3); ++i)
    long_string3[i] = static_cast<char>('a' + (i % 26));
  long_string3[sizeof(long_string3) - 1] = '\0';

  auto value = TracedValue::Create();
  value->SetString("a", "short");
  value->SetString("b", long_string);
  value->BeginArray("c");
  value->AppendString(long_string2);
  value->AppendString("");
  value->BeginDictionary();
  value->SetString("a", long_string3);
  value->EndDictionary();
  value->EndArray();

  std::string json;
  value->AppendAsTraceFormat(&json);
  CHECK_EQ("{\"a\":\"short\",\"b\":\"" + long_string + "\",\"c\":[\"" +
               long_string2 + "\",\"\",{\"a\":\"" + long_string3 + "\"}]}",
           json);
}

TEST(Escaping) {
  const char* string1 = "abc\"\'\\\\x\"y\'z\n\x09\x17";
  std::string chars127;
  for (int i = 1; i <= 127; ++i) {
    chars127 += static_cast<char>(i);
  }
  auto value = TracedValue::Create();
  value->SetString("a", string1);
  value->SetString("b", chars127);

  std::string json;
  value->AppendAsTraceFormat(&json);
  // Cannot use the expected value literal directly in CHECK_EQ
  // as it fails to process the # character on Windows.
  const char* expected =
      "{\"a\":\"abc\\\"\'\\\\\\\\x\\\"y\'z\\n\\t\\u0017\",\"b\":"
      "\"\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\u0008\\t\\n\\u000B"
      "\\u000C\\u000D\\u000E\\u000F\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\"
      "u0016\\u0017\\u0018\\u0019\\u001A\\u001B\\u001C\\u001D\\u001E\\u001F "
      "!\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`"
      "abcdefghijklmnopqrstuvwxyz{|}~\x7F\"}";
  CHECK_EQ(expected, json);
}