github.com/orofarne/hammy@v0.0.0-20130409105742-374fadfd6ecb/worker/tests/mozjs_test.cc (about) 1 #include <time.h> 2 #include <gtest/gtest.h> 3 4 #include "../eval.hh" 5 6 #include <js/jsvalue.h> 7 8 #define TIME_X 1364931158 9 10 TEST(MozJsTest, SimpleScript) { 11 hammy::MozJSEval eval; 12 hammy::State s; 13 EXPECT_EQ(0, eval.init()); 14 ASSERT_EQ(0, eval.set_hostname("test", 4)); 15 ASSERT_EQ(0, eval.set_key("mykey", 5)); 16 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 17 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 18 eval.set_state(&s); 19 const char *script = "var x = 2 + 2;\n"; 20 EXPECT_EQ(0, eval.compile(script, strlen(script))); 21 EXPECT_EQ(0, eval.exec()); 22 EXPECT_EQ("", eval.last_error()); 23 } 24 25 TEST(MozJsTest, SimpleBadScript) { 26 hammy::MozJSEval eval; 27 hammy::State s; 28 EXPECT_EQ(0, eval.init()); 29 ASSERT_EQ(0, eval.set_hostname("test", 4)); 30 ASSERT_EQ(0, eval.set_key("mykey", 5)); 31 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 32 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 33 eval.set_state(&s); 34 EXPECT_EQ("", eval.last_error()); 35 const char *script = "var x 2 + 2;\n"; 36 EXPECT_NE(0, eval.compile(script, strlen(script))); 37 EXPECT_NE("", eval.last_error()); 38 } 39 40 TEST(MozJsTest, BadAndGood) { 41 hammy::MozJSEval eval; 42 hammy::State s; 43 EXPECT_EQ(0, eval.init()); 44 ASSERT_EQ(0, eval.set_hostname("test", 4)); 45 ASSERT_EQ(0, eval.set_key("mykey", 5)); 46 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 47 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 48 eval.set_state(&s); 49 50 const char *script = "var x 2 + 2;\n"; 51 EXPECT_NE(0, eval.compile(script, strlen(script))); 52 EXPECT_NE("", eval.last_error()); 53 54 const char *script2 = "var x = 2 + 2;\n"; 55 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 56 EXPECT_EQ("", eval.last_error()); 57 EXPECT_EQ(0, eval.exec()); 58 EXPECT_EQ("", eval.last_error()); 59 } 60 61 TEST(MozJsTest, Cmd) { 62 hammy::MozJSEval eval; 63 hammy::State s; 64 EXPECT_EQ(0, eval.init()); 65 ASSERT_EQ(0, eval.set_hostname("test", 4)); 66 ASSERT_EQ(0, eval.set_key("mykey", 5)); 67 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 68 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 69 eval.set_state(&s); 70 71 const char *script = "cmd('log');\n"; 72 EXPECT_EQ(0, eval.compile(script, strlen(script))); 73 EXPECT_EQ(0, eval.exec()); 74 EXPECT_EQ("", eval.last_error()); 75 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 76 ASSERT_EQ(1, cmdb.size()); 77 EXPECT_EQ("log", cmdb[0].cmd); 78 EXPECT_EQ(0, cmdb[0].opts.size()); 79 80 const char *script2 = "cmd('log', {'message': 'hello'});\n"; 81 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 82 EXPECT_EQ(0, eval.exec()); 83 EXPECT_EQ("", eval.last_error()); 84 hammy::CmdBuf &cmdb2 = eval.get_cmdbuf(); 85 ASSERT_EQ(1, cmdb2.size()); 86 EXPECT_EQ("log", cmdb2[0].cmd); 87 ASSERT_EQ(1, cmdb2[0].opts.size()); 88 EXPECT_TRUE(cmdb2[0].opts["message"].isString()); 89 } 90 91 TEST(MozJsTest, Hostname) { 92 hammy::MozJSEval eval; 93 hammy::State s; 94 EXPECT_EQ(0, eval.init()); 95 ASSERT_EQ(0, eval.set_hostname("test", 4)); 96 ASSERT_EQ(0, eval.set_key("mykey", 5)); 97 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 98 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 99 eval.set_state(&s); 100 const char *script = "cmd('log', {'message': host});\n"; 101 EXPECT_EQ(0, eval.compile(script, strlen(script))); 102 EXPECT_EQ(0, eval.exec()); 103 EXPECT_EQ("", eval.last_error()); 104 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 105 ASSERT_EQ(1, cmdb.size()); 106 EXPECT_EQ("log", cmdb[0].cmd); 107 ASSERT_EQ(1, cmdb[0].opts.size()); 108 EXPECT_TRUE(cmdb[0].opts["message"].isString()); 109 110 ASSERT_EQ(0, eval.set_hostname("test2", 5)); 111 const char *script2 = "host = 'foo'; if(host === 'test2'){cmd('log');}\n"; 112 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 113 EXPECT_EQ(0, cmdb.size()); 114 EXPECT_EQ(0, eval.exec()); 115 EXPECT_EQ(1, cmdb.size()); 116 } 117 118 TEST(MozJsTest, Key) { 119 hammy::MozJSEval eval; 120 hammy::State s; 121 EXPECT_EQ(0, eval.init()); 122 ASSERT_EQ(0, eval.set_hostname("test", 4)); 123 ASSERT_EQ(0, eval.set_key("mykey", 5)); 124 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 125 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 126 eval.set_state(&s); 127 const char *script = "cmd('log', {'message': key});\n"; 128 EXPECT_EQ(0, eval.compile(script, strlen(script))); 129 EXPECT_EQ(0, eval.exec()); 130 EXPECT_EQ("", eval.last_error()); 131 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 132 ASSERT_EQ(1, cmdb.size()); 133 EXPECT_EQ("log", cmdb[0].cmd); 134 ASSERT_EQ(1, cmdb[0].opts.size()); 135 EXPECT_TRUE(cmdb[0].opts["message"].isString()); 136 137 ASSERT_EQ(0, eval.set_key("k2", 2)); 138 139 ASSERT_EQ(0, eval.set_key("test2", 5)); 140 const char *script2 = "key = 'foo'; if(key === 'test2'){cmd('log');}\n"; 141 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 142 EXPECT_EQ(0, cmdb.size()); 143 EXPECT_EQ(0, eval.exec()); 144 EXPECT_EQ(1, cmdb.size()); 145 } 146 147 TEST(MozJsTest, Timestamp) { 148 hammy::MozJSEval eval; 149 hammy::State s; 150 EXPECT_EQ(0, eval.init()); 151 ASSERT_EQ(0, eval.set_hostname("test", 4)); 152 ASSERT_EQ(0, eval.set_key("mykey", 5)); 153 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 154 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 155 eval.set_state(&s); 156 const char *script = "cmd('log', {'message': timestamp.toString()});\n"; 157 EXPECT_EQ(0, eval.compile(script, strlen(script))); 158 EXPECT_EQ(0, eval.exec()); 159 EXPECT_EQ("", eval.last_error()); 160 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 161 ASSERT_EQ(1, cmdb.size()); 162 EXPECT_EQ("log", cmdb[0].cmd); 163 ASSERT_EQ(1, cmdb[0].opts.size()); 164 EXPECT_TRUE(cmdb[0].opts["message"].isString()); 165 166 ASSERT_EQ(0, eval.set_timestamp(TIME_X + 10)); 167 const char *script2 = "timestamp = 103; if(timestamp == 103){cmd('log');}\n"; 168 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 169 EXPECT_EQ(0, cmdb.size()); 170 EXPECT_EQ(0, eval.exec()); 171 EXPECT_EQ(0, cmdb.size()); 172 } 173 174 TEST(MozJsTest, Value) { 175 hammy::MozJSEval eval; 176 hammy::State s; 177 EXPECT_EQ(0, eval.init()); 178 ASSERT_EQ(0, eval.set_hostname("test", 4)); 179 ASSERT_EQ(0, eval.set_key("mykey", 5)); 180 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 181 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 182 eval.set_state(&s); 183 const char *script = "cmd('log', {'message': value});\n"; 184 EXPECT_EQ(0, eval.compile(script, strlen(script))); 185 EXPECT_EQ(0, eval.exec()); 186 EXPECT_EQ("", eval.last_error()); 187 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 188 ASSERT_EQ(1, cmdb.size()); 189 EXPECT_EQ("log", cmdb[0].cmd); 190 ASSERT_EQ(1, cmdb[0].opts.size()); 191 EXPECT_TRUE(cmdb[0].opts["message"].isDouble()); 192 193 JSString *str = JS_NewStringCopyZ(eval.context(), "hello"); 194 ASSERT_EQ(0, eval.set_value(js::Valueify(STRING_TO_JSVAL(str)))); 195 const char *script2 = "value = 103; if(value === 'hello'){cmd('log');}\n"; 196 EXPECT_EQ(0, eval.compile(script2, strlen(script2))); 197 EXPECT_EQ(0, cmdb.size()); 198 EXPECT_EQ(0, eval.exec()); 199 EXPECT_EQ(1, cmdb.size()); 200 201 } 202 203 TEST(MozJsTest, StateSetGet) { 204 hammy::MozJSEval eval; 205 hammy::State s; 206 EXPECT_EQ(0, eval.init()); 207 ASSERT_EQ(0, eval.set_hostname("test", 4)); 208 ASSERT_EQ(0, eval.set_key("mykey", 5)); 209 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 210 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 211 eval.set_state(&s); 212 213 const char *script = 214 "var x = 10;\n" 215 "set_state('x', x);\n" 216 "if(x === get_state('x')) {\n" 217 " cmd('log', {'message': 'x_ok'});\n" 218 "}\n" 219 "var y = 'hello';\n" 220 "set_state('y', y);\n" 221 "if(y === get_state('y')) {\n" 222 " cmd('log', {'message': 'y_ok'});\n" 223 "}\n" 224 "var s = get_state_ext('y');\n" 225 "if(s != null) {\n" 226 " cmd('log', {'message': s.value.substr(0, 2)});\n" 227 " cmd('log', {'message': s.lastUpdate.toString()});\n" 228 "}\n" 229 "var z = 3.1415;" 230 "if(z === get_state('z')) {\n" 231 " cmd('log', {'message': 'z_ok'});\n" 232 "}\n"; 233 234 EXPECT_EQ(0, eval.compile(script, strlen(script))); 235 EXPECT_EQ("", eval.last_error()); 236 EXPECT_EQ(0, eval.exec()); 237 EXPECT_EQ("", eval.last_error()); 238 239 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 240 EXPECT_EQ(4, cmdb.size()); 241 EXPECT_EQ(2, s.size()); 242 } 243 244 TEST(MozJsTest, StateKeys) { 245 hammy::MozJSEval eval; 246 hammy::State s; 247 EXPECT_EQ(0, eval.init()); 248 ASSERT_EQ(0, eval.set_hostname("test", 4)); 249 ASSERT_EQ(0, eval.set_key("mykey", 5)); 250 ASSERT_EQ(0, eval.set_timestamp(TIME_X)); 251 ASSERT_EQ(0, eval.set_value(js::DoubleValue(3.1415))); 252 eval.set_state(&s); 253 254 const char *script = 255 "set_state('foo', 10);\n" 256 "set_state('bar', 'hello');\n" 257 "set_state('bazz', 3.1415);\n" 258 "var keys = state_keys();\n" 259 "for(var k in keys) {\n" 260 " cmd('log');\n" 261 "}\n" 262 "var keys2 = state_keys('ba');\n" 263 "for(var k in keys2) {\n" 264 " cmd('log');\n" 265 "}\n" 266 ; 267 268 EXPECT_EQ(0, eval.compile(script, strlen(script))); 269 EXPECT_EQ("", eval.last_error()); 270 EXPECT_EQ(0, eval.exec()); 271 EXPECT_EQ("", eval.last_error()); 272 273 hammy::CmdBuf &cmdb = eval.get_cmdbuf(); 274 EXPECT_EQ(5, cmdb.size()); 275 EXPECT_EQ(3, s.size()); 276 }