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

Unified Diff: test/unittests/value-serializer-unittest.cc

Issue 2275033003: Blink-compatible serialization of ArrayBuffer transfer. (Closed)
Patch Set: Accepts 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/value-serializer.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/unittests/value-serializer-unittest.cc
diff --git a/test/unittests/value-serializer-unittest.cc b/test/unittests/value-serializer-unittest.cc
index f12d456935e188688b6d7e7cf008d3e2f99c0323..646a9138c3663834312ac1badff28ea72048d323 100644
--- a/test/unittests/value-serializer-unittest.cc
+++ b/test/unittests/value-serializer-unittest.cc
@@ -29,6 +29,10 @@ class ValueSerializerTest : public TestWithIsolate {
return deserialization_context_;
}
+ // Overridden in more specific fixtures.
+ virtual void BeforeEncode(ValueSerializer*) {}
+ virtual void BeforeDecode(ValueDeserializer*) {}
+
template <typename InputFunctor, typename OutputFunctor>
void RoundTripTest(const InputFunctor& input_functor,
const OutputFunctor& output_functor) {
@@ -49,6 +53,7 @@ class ValueSerializerTest : public TestWithIsolate {
Maybe<std::vector<uint8_t>> DoEncode(Local<Value> value) {
Local<Context> context = serialization_context();
ValueSerializer serializer(isolate());
+ BeforeEncode(&serializer);
serializer.WriteHeader();
if (!serializer.WriteValue(context, value).FromMaybe(false)) {
return Nothing<std::vector<uint8_t>>();
@@ -90,6 +95,7 @@ class ValueSerializerTest : public TestWithIsolate {
ValueDeserializer deserializer(isolate(), &data[0],
static_cast<int>(data.size()));
deserializer.SetSupportsLegacyWireFormat(true);
+ BeforeDecode(&deserializer);
ASSERT_TRUE(deserializer.ReadHeader().FromMaybe(false));
Local<Value> result;
ASSERT_TRUE(deserializer.ReadValue(context).ToLocal(&result));
@@ -112,6 +118,7 @@ class ValueSerializerTest : public TestWithIsolate {
ValueDeserializer deserializer(isolate(), &data[0],
static_cast<int>(data.size()));
deserializer.SetSupportsLegacyWireFormat(true);
+ BeforeDecode(&deserializer);
ASSERT_TRUE(deserializer.ReadHeader().FromMaybe(false));
ASSERT_EQ(0, deserializer.GetWireFormatVersion());
Local<Value> result;
@@ -133,6 +140,7 @@ class ValueSerializerTest : public TestWithIsolate {
ValueDeserializer deserializer(isolate(), &data[0],
static_cast<int>(data.size()));
deserializer.SetSupportsLegacyWireFormat(true);
+ BeforeDecode(&deserializer);
Maybe<bool> header_result = deserializer.ReadHeader();
if (header_result.IsNothing()) return;
ASSERT_TRUE(header_result.ToChecked());
@@ -1597,5 +1605,74 @@ TEST_F(ValueSerializerTest, DecodeInvalidArrayBuffer) {
InvalidDecodeTest({0xff, 0x09, 0x42, 0xff, 0xff, 0x00});
}
+// Includes an ArrayBuffer wrapper marked for transfer from the serialization
+// context to the deserialization context.
+class ValueSerializerTestWithArrayBufferTransfer : public ValueSerializerTest {
+ protected:
+ static const size_t kTestByteLength = 4;
+
+ ValueSerializerTestWithArrayBufferTransfer() {
+ {
+ Context::Scope scope(serialization_context());
+ input_buffer_ = ArrayBuffer::New(isolate(), nullptr, 0);
+ input_buffer_->Neuter();
+ }
+ {
+ Context::Scope scope(deserialization_context());
+ output_buffer_ = ArrayBuffer::New(isolate(), kTestByteLength);
+ const uint8_t data[kTestByteLength] = {0x00, 0x01, 0x80, 0xff};
+ memcpy(output_buffer_->GetContents().Data(), data, kTestByteLength);
+ }
+ }
+
+ const Local<ArrayBuffer>& input_buffer() { return input_buffer_; }
+ const Local<ArrayBuffer>& output_buffer() { return output_buffer_; }
+
+ void BeforeEncode(ValueSerializer* serializer) override {
+ serializer->TransferArrayBuffer(0, input_buffer_);
+ }
+
+ void BeforeDecode(ValueDeserializer* deserializer) override {
+ deserializer->TransferArrayBuffer(0, output_buffer_);
+ }
+
+ private:
+ Local<ArrayBuffer> input_buffer_;
+ Local<ArrayBuffer> output_buffer_;
+};
+
+TEST_F(ValueSerializerTestWithArrayBufferTransfer,
+ RoundTripArrayBufferTransfer) {
+ RoundTripTest([this]() { return input_buffer(); },
+ [this](Local<Value> value) {
+ ASSERT_TRUE(value->IsArrayBuffer());
+ EXPECT_EQ(output_buffer(), value);
+ EXPECT_TRUE(EvaluateScriptForResultBool(
+ "new Uint8Array(result).toString() === '0,1,128,255'"));
+ });
+ RoundTripTest(
+ [this]() {
+ Local<Object> object = Object::New(isolate());
+ EXPECT_TRUE(object
+ ->CreateDataProperty(serialization_context(),
+ StringFromUtf8("a"),
+ input_buffer())
+ .FromMaybe(false));
+ EXPECT_TRUE(object
+ ->CreateDataProperty(serialization_context(),
+ StringFromUtf8("b"),
+ input_buffer())
+ .FromMaybe(false));
+ return object;
+ },
+ [this](Local<Value> value) {
+ EXPECT_TRUE(
+ EvaluateScriptForResultBool("result.a instanceof ArrayBuffer"));
+ EXPECT_TRUE(EvaluateScriptForResultBool("result.a === result.b"));
+ EXPECT_TRUE(EvaluateScriptForResultBool(
+ "new Uint8Array(result.a).toString() === '0,1,128,255'"));
+ });
+}
+
} // namespace
} // namespace v8
« no previous file with comments | « src/value-serializer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698