Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: test/unittests/value-serializer-unittest.cc

Issue 2248893003: Blink-compatible deserialization of old object format. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@vs4
Patch Set: correct to size_t Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/value-serializer.cc ('K') | « src/value-serializer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/value-serializer.h" 5 #include "src/value-serializer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "include/v8.h" 10 #include "include/v8.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 ASSERT_FALSE(try_catch.HasCaught()); 73 ASSERT_FALSE(try_catch.HasCaught());
74 ASSERT_TRUE(deserialization_context() 74 ASSERT_TRUE(deserialization_context()
75 ->Global() 75 ->Global()
76 ->CreateDataProperty(deserialization_context_, 76 ->CreateDataProperty(deserialization_context_,
77 StringFromUtf8("result"), result) 77 StringFromUtf8("result"), result)
78 .FromMaybe(false)); 78 .FromMaybe(false));
79 output_functor(result); 79 output_functor(result);
80 ASSERT_FALSE(try_catch.HasCaught()); 80 ASSERT_FALSE(try_catch.HasCaught());
81 } 81 }
82 82
83 template <typename OutputFunctor>
84 void DecodeTestForVersion0(const std::vector<uint8_t>& data,
85 const OutputFunctor& output_functor) {
86 Context::Scope scope(deserialization_context());
87 TryCatch try_catch(isolate());
88 // TODO(jbroman): Use the public API once it exists.
89 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate());
90 i::HandleScope handle_scope(internal_isolate);
91 i::ValueDeserializer deserializer(
92 internal_isolate,
93 i::Vector<const uint8_t>(&data[0], static_cast<int>(data.size())));
94 // TODO(jbroman): Enable legacy support.
95 ASSERT_TRUE(deserializer.ReadHeader().FromMaybe(false));
96 // TODO(jbroman): Check version 0.
97 Local<Value> result;
98 ASSERT_TRUE(ToLocal<Value>(
99 deserializer.ReadObjectUsingEntireBufferForLegacyFormat(), &result));
100 ASSERT_FALSE(result.IsEmpty());
101 ASSERT_FALSE(try_catch.HasCaught());
102 ASSERT_TRUE(deserialization_context()
103 ->Global()
104 ->CreateDataProperty(deserialization_context_,
105 StringFromUtf8("result"), result)
106 .FromMaybe(false));
107 output_functor(result);
108 ASSERT_FALSE(try_catch.HasCaught());
109 }
110
83 void InvalidDecodeTest(const std::vector<uint8_t>& data) { 111 void InvalidDecodeTest(const std::vector<uint8_t>& data) {
84 Context::Scope scope(deserialization_context()); 112 Context::Scope scope(deserialization_context());
85 TryCatch try_catch(isolate()); 113 TryCatch try_catch(isolate());
86 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate()); 114 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate());
87 i::HandleScope handle_scope(internal_isolate); 115 i::HandleScope handle_scope(internal_isolate);
88 i::ValueDeserializer deserializer( 116 i::ValueDeserializer deserializer(
89 internal_isolate, 117 internal_isolate,
90 i::Vector<const uint8_t>(&data[0], static_cast<int>(data.size()))); 118 i::Vector<const uint8_t>(&data[0], static_cast<int>(data.size())));
91 Maybe<bool> header_result = deserializer.ReadHeader(); 119 Maybe<bool> header_result = deserializer.ReadHeader();
92 if (header_result.IsNothing()) return; 120 if (header_result.IsNothing()) return;
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 // resolved. 513 // resolved.
486 DecodeTest( 514 DecodeTest(
487 {0xff, 0x09, 0x3f, 0x00, 0x6f, 0x3f, 0x01, 0x53, 0x04, 0x73, 515 {0xff, 0x09, 0x3f, 0x00, 0x6f, 0x3f, 0x01, 0x53, 0x04, 0x73,
488 0x65, 0x6c, 0x66, 0x3f, 0x01, 0x5e, 0x00, 0x7b, 0x01, 0x00}, 516 0x65, 0x6c, 0x66, 0x3f, 0x01, 0x5e, 0x00, 0x7b, 0x01, 0x00},
489 [this](Local<Value> value) { 517 [this](Local<Value> value) {
490 ASSERT_TRUE(value->IsObject()); 518 ASSERT_TRUE(value->IsObject());
491 EXPECT_TRUE(EvaluateScriptForResultBool("result === result.self")); 519 EXPECT_TRUE(EvaluateScriptForResultBool("result === result.self"));
492 }); 520 });
493 } 521 }
494 522
523 TEST_F(ValueSerializerTest, DecodeDictionaryObjectVersion0) {
524 // Empty object.
525 DecodeTestForVersion0(
526 {0x7b, 0x00},
527 [this](Local<Value> value) {
528 ASSERT_TRUE(value->IsObject());
529 EXPECT_TRUE(EvaluateScriptForResultBool(
530 "Object.getPrototypeOf(result) === Object.prototype"));
531 EXPECT_TRUE(EvaluateScriptForResultBool(
532 "Object.getOwnPropertyNames(result).length === 0"));
533 });
534 // String key.
535 DecodeTestForVersion0(
536 {0x53, 0x01, 0x61, 0x49, 0x54, 0x7b, 0x01, 0x00},
537 [this](Local<Value> value) {
538 ASSERT_TRUE(value->IsObject());
Camillo Bruni 2016/08/16 09:04:07 nit: Can you add the prototype check from above as
jbroman 2016/08/16 21:34:14 Done here, though in general I'd prefer to avoid d
539 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty('a')"));
540 EXPECT_TRUE(EvaluateScriptForResultBool("result.a === 42"));
541 EXPECT_TRUE(EvaluateScriptForResultBool(
542 "Object.getOwnPropertyNames(result).length === 1"));
543 });
544 // Integer key (treated as a string, but may be encoded differently).
545 DecodeTestForVersion0(
546 {0x49, 0x54, 0x53, 0x01, 0x61, 0x7b, 0x01, 0x00},
547 [this](Local<Value> value) {
548 ASSERT_TRUE(value->IsObject());
549 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty('42')"));
550 EXPECT_TRUE(EvaluateScriptForResultBool("result[42] === 'a'"));
551 EXPECT_TRUE(EvaluateScriptForResultBool(
552 "Object.getOwnPropertyNames(result).length === 1"));
553 });
554 // Key order must be preserved.
555 DecodeTestForVersion0(
556 {0x53, 0x01, 0x78, 0x49, 0x02, 0x53, 0x01, 0x79, 0x49, 0x04, 0x53, 0x01,
557 0x61, 0x49, 0x06, 0x7b, 0x03, 0x00},
558 [this](Local<Value> value) {
559 EXPECT_TRUE(EvaluateScriptForResultBool(
560 "Object.getOwnPropertyNames(result).toString() === 'x,y,a'"));
561 });
562 }
Camillo Bruni 2016/08/16 09:04:07 nit: could you add a simple test with properties a
jbroman 2016/08/16 21:34:14 OK, I'll do one with one property and one element.
563
495 } // namespace 564 } // namespace
496 } // namespace v8 565 } // namespace v8
OLDNEW
« src/value-serializer.cc ('K') | « src/value-serializer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698