Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: test/JsValue.cpp

Issue 10173031: Don`t use references to JsEngine to avoid use-after-free errors,switch to shared_ptr instead (Closed)
Patch Set: Created April 18, 2013, 4:15 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 #include <AdblockPlus.h> 1 #include <AdblockPlus.h>
2 #include <gtest/gtest.h> 2 #include <gtest/gtest.h>
3 3
4 TEST(JsValueTest, UndefinedValue) 4 TEST(JsValueTest, UndefinedValue)
5 { 5 {
6 AdblockPlus::JsEngine jsEngine; 6 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
7 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("undefined"); 7 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("undefined");
8 ASSERT_TRUE(value->IsUndefined()); 8 ASSERT_TRUE(value->IsUndefined());
9 ASSERT_FALSE(value->IsNull()); 9 ASSERT_FALSE(value->IsNull());
10 ASSERT_FALSE(value->IsString()); 10 ASSERT_FALSE(value->IsString());
11 ASSERT_FALSE(value->IsBool()); 11 ASSERT_FALSE(value->IsBool());
12 ASSERT_FALSE(value->IsNumber()); 12 ASSERT_FALSE(value->IsNumber());
13 ASSERT_FALSE(value->IsObject()); 13 ASSERT_FALSE(value->IsObject());
14 ASSERT_FALSE(value->IsArray()); 14 ASSERT_FALSE(value->IsArray());
15 ASSERT_FALSE(value->IsFunction()); 15 ASSERT_FALSE(value->IsFunction());
16 ASSERT_EQ("undefined", value->AsString()); 16 ASSERT_EQ("undefined", value->AsString());
17 ASSERT_FALSE(value->AsBool()); 17 ASSERT_FALSE(value->AsBool());
18 ASSERT_ANY_THROW(value->AsList()); 18 ASSERT_ANY_THROW(value->AsList());
19 ASSERT_ANY_THROW(value->GetProperty("foo")); 19 ASSERT_ANY_THROW(value->GetProperty("foo"));
20 ASSERT_ANY_THROW(value->SetProperty("foo", false)); 20 ASSERT_ANY_THROW(value->SetProperty("foo", false));
21 ASSERT_ANY_THROW(value->GetClassName()); 21 ASSERT_ANY_THROW(value->GetClassName());
22 ASSERT_ANY_THROW(value->GetOwnPropertyNames()); 22 ASSERT_ANY_THROW(value->GetOwnPropertyNames());
23 ASSERT_ANY_THROW(value->Call()); 23 ASSERT_ANY_THROW(value->Call());
24 } 24 }
25 25
26 TEST(JsValueTest, NullValue) 26 TEST(JsValueTest, NullValue)
27 { 27 {
28 AdblockPlus::JsEngine jsEngine; 28 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
29 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("null"); 29 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("null");
30 ASSERT_FALSE(value->IsUndefined()); 30 ASSERT_FALSE(value->IsUndefined());
31 ASSERT_TRUE(value->IsNull()); 31 ASSERT_TRUE(value->IsNull());
32 ASSERT_FALSE(value->IsString()); 32 ASSERT_FALSE(value->IsString());
33 ASSERT_FALSE(value->IsBool()); 33 ASSERT_FALSE(value->IsBool());
34 ASSERT_FALSE(value->IsNumber()); 34 ASSERT_FALSE(value->IsNumber());
35 ASSERT_FALSE(value->IsObject()); 35 ASSERT_FALSE(value->IsObject());
36 ASSERT_FALSE(value->IsArray()); 36 ASSERT_FALSE(value->IsArray());
37 ASSERT_FALSE(value->IsFunction()); 37 ASSERT_FALSE(value->IsFunction());
38 ASSERT_EQ("null", value->AsString()); 38 ASSERT_EQ("null", value->AsString());
39 ASSERT_FALSE(value->AsBool()); 39 ASSERT_FALSE(value->AsBool());
40 ASSERT_ANY_THROW(value->AsList()); 40 ASSERT_ANY_THROW(value->AsList());
41 ASSERT_ANY_THROW(value->GetProperty("foo")); 41 ASSERT_ANY_THROW(value->GetProperty("foo"));
42 ASSERT_ANY_THROW(value->SetProperty("foo", false)); 42 ASSERT_ANY_THROW(value->SetProperty("foo", false));
43 ASSERT_ANY_THROW(value->GetClassName()); 43 ASSERT_ANY_THROW(value->GetClassName());
44 ASSERT_ANY_THROW(value->GetOwnPropertyNames()); 44 ASSERT_ANY_THROW(value->GetOwnPropertyNames());
45 ASSERT_ANY_THROW(value->Call()); 45 ASSERT_ANY_THROW(value->Call());
46 } 46 }
47 47
48 TEST(JsValueTest, StringValue) 48 TEST(JsValueTest, StringValue)
49 { 49 {
50 AdblockPlus::JsEngine jsEngine; 50 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
51 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("'123'"); 51 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("'123'");
52 ASSERT_FALSE(value->IsUndefined()); 52 ASSERT_FALSE(value->IsUndefined());
53 ASSERT_FALSE(value->IsNull()); 53 ASSERT_FALSE(value->IsNull());
54 ASSERT_TRUE(value->IsString()); 54 ASSERT_TRUE(value->IsString());
55 ASSERT_FALSE(value->IsBool()); 55 ASSERT_FALSE(value->IsBool());
56 ASSERT_FALSE(value->IsNumber()); 56 ASSERT_FALSE(value->IsNumber());
57 ASSERT_FALSE(value->IsObject()); 57 ASSERT_FALSE(value->IsObject());
58 ASSERT_FALSE(value->IsArray()); 58 ASSERT_FALSE(value->IsArray());
59 ASSERT_FALSE(value->IsFunction()); 59 ASSERT_FALSE(value->IsFunction());
60 ASSERT_EQ("123", value->AsString()); 60 ASSERT_EQ("123", value->AsString());
61 ASSERT_EQ(123, value->AsInt()); 61 ASSERT_EQ(123, value->AsInt());
62 ASSERT_TRUE(value->AsBool()); 62 ASSERT_TRUE(value->AsBool());
63 ASSERT_ANY_THROW(value->AsList()); 63 ASSERT_ANY_THROW(value->AsList());
64 ASSERT_ANY_THROW(value->GetProperty("foo")); 64 ASSERT_ANY_THROW(value->GetProperty("foo"));
65 ASSERT_ANY_THROW(value->SetProperty("foo", false)); 65 ASSERT_ANY_THROW(value->SetProperty("foo", false));
66 ASSERT_ANY_THROW(value->GetClassName()); 66 ASSERT_ANY_THROW(value->GetClassName());
67 ASSERT_ANY_THROW(value->GetOwnPropertyNames()); 67 ASSERT_ANY_THROW(value->GetOwnPropertyNames());
68 ASSERT_ANY_THROW(value->Call()); 68 ASSERT_ANY_THROW(value->Call());
69 } 69 }
70 70
71 TEST(JsValueTest, IntValue) 71 TEST(JsValueTest, IntValue)
72 { 72 {
73 AdblockPlus::JsEngine jsEngine; 73 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
74 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("123"); 74 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("123");
75 ASSERT_FALSE(value->IsUndefined()); 75 ASSERT_FALSE(value->IsUndefined());
76 ASSERT_FALSE(value->IsNull()); 76 ASSERT_FALSE(value->IsNull());
77 ASSERT_FALSE(value->IsString()); 77 ASSERT_FALSE(value->IsString());
78 ASSERT_FALSE(value->IsBool()); 78 ASSERT_FALSE(value->IsBool());
79 ASSERT_TRUE(value->IsNumber()); 79 ASSERT_TRUE(value->IsNumber());
80 ASSERT_FALSE(value->IsObject()); 80 ASSERT_FALSE(value->IsObject());
81 ASSERT_FALSE(value->IsArray()); 81 ASSERT_FALSE(value->IsArray());
82 ASSERT_FALSE(value->IsFunction()); 82 ASSERT_FALSE(value->IsFunction());
83 ASSERT_EQ("123", value->AsString()); 83 ASSERT_EQ("123", value->AsString());
84 ASSERT_EQ(123, value->AsInt()); 84 ASSERT_EQ(123, value->AsInt());
85 ASSERT_TRUE(value->AsBool()); 85 ASSERT_TRUE(value->AsBool());
86 ASSERT_ANY_THROW(value->AsList()); 86 ASSERT_ANY_THROW(value->AsList());
87 ASSERT_ANY_THROW(value->GetProperty("foo")); 87 ASSERT_ANY_THROW(value->GetProperty("foo"));
88 ASSERT_ANY_THROW(value->SetProperty("foo", false)); 88 ASSERT_ANY_THROW(value->SetProperty("foo", false));
89 ASSERT_ANY_THROW(value->GetClassName()); 89 ASSERT_ANY_THROW(value->GetClassName());
90 ASSERT_ANY_THROW(value->GetOwnPropertyNames()); 90 ASSERT_ANY_THROW(value->GetOwnPropertyNames());
91 ASSERT_ANY_THROW(value->Call()); 91 ASSERT_ANY_THROW(value->Call());
92 } 92 }
93 93
94 TEST(JsValueTest, BoolValue) 94 TEST(JsValueTest, BoolValue)
95 { 95 {
96 AdblockPlus::JsEngine jsEngine; 96 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
97 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("true"); 97 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("true");
98 ASSERT_FALSE(value->IsUndefined()); 98 ASSERT_FALSE(value->IsUndefined());
99 ASSERT_FALSE(value->IsNull()); 99 ASSERT_FALSE(value->IsNull());
100 ASSERT_FALSE(value->IsString()); 100 ASSERT_FALSE(value->IsString());
101 ASSERT_TRUE(value->IsBool()); 101 ASSERT_TRUE(value->IsBool());
102 ASSERT_FALSE(value->IsNumber()); 102 ASSERT_FALSE(value->IsNumber());
103 ASSERT_FALSE(value->IsObject()); 103 ASSERT_FALSE(value->IsObject());
104 ASSERT_FALSE(value->IsArray()); 104 ASSERT_FALSE(value->IsArray());
105 ASSERT_FALSE(value->IsFunction()); 105 ASSERT_FALSE(value->IsFunction());
106 ASSERT_EQ("true", value->AsString()); 106 ASSERT_EQ("true", value->AsString());
107 ASSERT_TRUE(value->AsBool()); 107 ASSERT_TRUE(value->AsBool());
108 ASSERT_ANY_THROW(value->AsList()); 108 ASSERT_ANY_THROW(value->AsList());
109 ASSERT_ANY_THROW(value->GetProperty("foo")); 109 ASSERT_ANY_THROW(value->GetProperty("foo"));
110 ASSERT_ANY_THROW(value->SetProperty("foo", false)); 110 ASSERT_ANY_THROW(value->SetProperty("foo", false));
111 ASSERT_ANY_THROW(value->GetClassName()); 111 ASSERT_ANY_THROW(value->GetClassName());
112 ASSERT_ANY_THROW(value->GetOwnPropertyNames()); 112 ASSERT_ANY_THROW(value->GetOwnPropertyNames());
113 ASSERT_ANY_THROW(value->Call()); 113 ASSERT_ANY_THROW(value->Call());
114 } 114 }
115 115
116 TEST(JsValueTest, ObjectValue) 116 TEST(JsValueTest, ObjectValue)
117 { 117 {
118 AdblockPlus::JsEngine jsEngine; 118 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
119 const std::string source("\ 119 const std::string source("\
120 function Foo() {\ 120 function Foo() {\
121 this.x = 2;\ 121 this.x = 2;\
122 this.toString = function() {return 'foo';};\ 122 this.toString = function() {return 'foo';};\
123 this.valueOf = function() {return 123;};\ 123 this.valueOf = function() {return 123;};\
124 };\ 124 };\
125 new Foo()"); 125 new Foo()");
126 AdblockPlus::JsValuePtr value = jsEngine.Evaluate(source); 126 AdblockPlus::JsValuePtr value = jsEngine->Evaluate(source);
127 ASSERT_FALSE(value->IsUndefined()); 127 ASSERT_FALSE(value->IsUndefined());
128 ASSERT_FALSE(value->IsNull()); 128 ASSERT_FALSE(value->IsNull());
129 ASSERT_FALSE(value->IsString()); 129 ASSERT_FALSE(value->IsString());
130 ASSERT_FALSE(value->IsBool()); 130 ASSERT_FALSE(value->IsBool());
131 ASSERT_FALSE(value->IsNumber()); 131 ASSERT_FALSE(value->IsNumber());
132 ASSERT_TRUE(value->IsObject()); 132 ASSERT_TRUE(value->IsObject());
133 ASSERT_FALSE(value->IsArray()); 133 ASSERT_FALSE(value->IsArray());
134 ASSERT_FALSE(value->IsFunction()); 134 ASSERT_FALSE(value->IsFunction());
135 ASSERT_EQ("foo", value->AsString()); 135 ASSERT_EQ("foo", value->AsString());
136 ASSERT_EQ(123, value->AsInt()); 136 ASSERT_EQ(123, value->AsInt());
137 ASSERT_TRUE(value->AsBool()); 137 ASSERT_TRUE(value->AsBool());
138 ASSERT_ANY_THROW(value->AsList()); 138 ASSERT_ANY_THROW(value->AsList());
139 ASSERT_EQ(2, value->GetProperty("x")->AsInt()); 139 ASSERT_EQ(2, value->GetProperty("x")->AsInt());
140 value->SetProperty("x", 12); 140 value->SetProperty("x", 12);
141 ASSERT_EQ(12, value->GetProperty("x")->AsInt()); 141 ASSERT_EQ(12, value->GetProperty("x")->AsInt());
142 value->SetProperty("x", jsEngine.NewValue(15)); 142 value->SetProperty("x", jsEngine->NewValue(15));
143 ASSERT_EQ(15, value->GetProperty("x")->AsInt()); 143 ASSERT_EQ(15, value->GetProperty("x")->AsInt());
144 ASSERT_EQ("Foo", value->GetClassName()); 144 ASSERT_EQ("Foo", value->GetClassName());
145 ASSERT_EQ(3u, value->GetOwnPropertyNames().size()); 145 ASSERT_EQ(3u, value->GetOwnPropertyNames().size());
146 ASSERT_ANY_THROW(value->Call()); 146 ASSERT_ANY_THROW(value->Call());
147 } 147 }
148 148
149 TEST(JsValueTest, ArrayValue) 149 TEST(JsValueTest, ArrayValue)
150 { 150 {
151 AdblockPlus::JsEngine jsEngine; 151 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
152 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("[5,8,12]"); 152 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("[5,8,12]");
153 ASSERT_FALSE(value->IsUndefined()); 153 ASSERT_FALSE(value->IsUndefined());
154 ASSERT_FALSE(value->IsNull()); 154 ASSERT_FALSE(value->IsNull());
155 ASSERT_FALSE(value->IsString()); 155 ASSERT_FALSE(value->IsString());
156 ASSERT_FALSE(value->IsBool()); 156 ASSERT_FALSE(value->IsBool());
157 ASSERT_FALSE(value->IsNumber()); 157 ASSERT_FALSE(value->IsNumber());
158 ASSERT_TRUE(value->IsObject()); 158 ASSERT_TRUE(value->IsObject());
159 ASSERT_TRUE(value->IsArray()); 159 ASSERT_TRUE(value->IsArray());
160 ASSERT_FALSE(value->IsFunction()); 160 ASSERT_FALSE(value->IsFunction());
161 ASSERT_EQ("5,8,12", value->AsString()); 161 ASSERT_EQ("5,8,12", value->AsString());
162 ASSERT_TRUE(value->AsBool()); 162 ASSERT_TRUE(value->AsBool());
163 ASSERT_EQ(3u, value->AsList().size()); 163 ASSERT_EQ(3u, value->AsList().size());
164 ASSERT_EQ(8, value->AsList()[1]->AsInt()); 164 ASSERT_EQ(8, value->AsList()[1]->AsInt());
165 ASSERT_EQ(3, value->GetProperty("length")->AsInt()); 165 ASSERT_EQ(3, value->GetProperty("length")->AsInt());
166 ASSERT_EQ("Array", value->GetClassName()); 166 ASSERT_EQ("Array", value->GetClassName());
167 ASSERT_ANY_THROW(value->Call()); 167 ASSERT_ANY_THROW(value->Call());
168 } 168 }
169 169
170 TEST(JsValueTest, FunctionValue) 170 TEST(JsValueTest, FunctionValue)
171 { 171 {
172 AdblockPlus::JsEngine jsEngine; 172 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
173 AdblockPlus::JsValuePtr value = jsEngine.Evaluate("(function(foo, bar) {return this.x + '/' + foo + '/' + bar;})"); 173 AdblockPlus::JsValuePtr value = jsEngine->Evaluate("(function(foo, bar) {retur n this.x + '/' + foo + '/' + bar;})");
174 ASSERT_FALSE(value->IsUndefined()); 174 ASSERT_FALSE(value->IsUndefined());
175 ASSERT_FALSE(value->IsNull()); 175 ASSERT_FALSE(value->IsNull());
176 ASSERT_FALSE(value->IsString()); 176 ASSERT_FALSE(value->IsString());
177 ASSERT_FALSE(value->IsBool()); 177 ASSERT_FALSE(value->IsBool());
178 ASSERT_FALSE(value->IsNumber()); 178 ASSERT_FALSE(value->IsNumber());
179 ASSERT_TRUE(value->IsObject()); 179 ASSERT_TRUE(value->IsObject());
180 ASSERT_FALSE(value->IsArray()); 180 ASSERT_FALSE(value->IsArray());
181 ASSERT_TRUE(value->IsFunction()); 181 ASSERT_TRUE(value->IsFunction());
182 ASSERT_TRUE(value->AsBool()); 182 ASSERT_TRUE(value->AsBool());
183 ASSERT_ANY_THROW(value->AsList()); 183 ASSERT_ANY_THROW(value->AsList());
184 ASSERT_EQ(2, value->GetProperty("length")->AsInt()); 184 ASSERT_EQ(2, value->GetProperty("length")->AsInt());
185 185
186 AdblockPlus::JsValuePtr thisPtr = jsEngine.Evaluate("({x:2})"); 186 AdblockPlus::JsValuePtr thisPtr = jsEngine->Evaluate("({x:2})");
187 AdblockPlus::JsValueList params; 187 AdblockPlus::JsValueList params;
188 params.push_back(jsEngine.NewValue(5)); 188 params.push_back(jsEngine->NewValue(5));
189 params.push_back(jsEngine.NewValue("xyz")); 189 params.push_back(jsEngine->NewValue("xyz"));
190 ASSERT_EQ("2/5/xyz", value->Call(params, thisPtr)->AsString()); 190 ASSERT_EQ("2/5/xyz", value->Call(params, thisPtr)->AsString());
191 } 191 }
192 192
193 TEST(JsValueTest, ThrowingCoversion) 193 TEST(JsValueTest, ThrowingCoversion)
194 { 194 {
195 AdblockPlus::JsEngine jsEngine; 195 AdblockPlus::JsEnginePtr jsEngine(AdblockPlus::JsEngine::New());
196 const std::string source("\ 196 const std::string source("\
197 function Foo() {\ 197 function Foo() {\
198 this.toString = function() {throw 'test1';};\ 198 this.toString = function() {throw 'test1';};\
199 this.valueOf = function() {throw 'test2';};\ 199 this.valueOf = function() {throw 'test2';};\
200 };\ 200 };\
201 new Foo()"); 201 new Foo()");
202 AdblockPlus::JsValuePtr value = jsEngine.Evaluate(source); 202 AdblockPlus::JsValuePtr value = jsEngine->Evaluate(source);
203 ASSERT_EQ("", value->AsString()); 203 ASSERT_EQ("", value->AsString());
204 ASSERT_EQ(0, value->AsInt()); 204 ASSERT_EQ(0, value->AsInt());
205 } 205 }
OLDNEW
« src/JsEngine.cpp ('K') | « test/JsEngine.cpp ('k') | test/WebRequest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld