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

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

Issue 2481013010: [parser, serializer] Fix more -Wsign-compare warnings. (Closed)
Patch Set: Created 4 years, 1 month 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
« no previous file with comments | « test/cctest/test-serialize.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 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 const OutputFunctor& output_functor) { 168 const OutputFunctor& output_functor) {
169 Local<Context> context = deserialization_context(); 169 Local<Context> context = deserialization_context();
170 Context::Scope scope(context); 170 Context::Scope scope(context);
171 TryCatch try_catch(isolate()); 171 TryCatch try_catch(isolate());
172 ValueDeserializer deserializer(isolate(), &data[0], 172 ValueDeserializer deserializer(isolate(), &data[0],
173 static_cast<int>(data.size()), 173 static_cast<int>(data.size()),
174 GetDeserializerDelegate()); 174 GetDeserializerDelegate());
175 deserializer.SetSupportsLegacyWireFormat(true); 175 deserializer.SetSupportsLegacyWireFormat(true);
176 BeforeDecode(&deserializer); 176 BeforeDecode(&deserializer);
177 ASSERT_TRUE(deserializer.ReadHeader(context).FromMaybe(false)); 177 ASSERT_TRUE(deserializer.ReadHeader(context).FromMaybe(false));
178 ASSERT_EQ(0, deserializer.GetWireFormatVersion()); 178 ASSERT_EQ(0u, deserializer.GetWireFormatVersion());
179 Local<Value> result; 179 Local<Value> result;
180 ASSERT_TRUE(deserializer.ReadValue(context).ToLocal(&result)); 180 ASSERT_TRUE(deserializer.ReadValue(context).ToLocal(&result));
181 ASSERT_FALSE(result.IsEmpty()); 181 ASSERT_FALSE(result.IsEmpty());
182 ASSERT_FALSE(try_catch.HasCaught()); 182 ASSERT_FALSE(try_catch.HasCaught());
183 ASSERT_TRUE( 183 ASSERT_TRUE(
184 context->Global() 184 context->Global()
185 ->CreateDataProperty(context, StringFromUtf8("result"), result) 185 ->CreateDataProperty(context, StringFromUtf8("result"), result)
186 .FromMaybe(false)); 186 .FromMaybe(false));
187 output_functor(result); 187 output_functor(result);
188 ASSERT_FALSE(try_catch.HasCaught()); 188 ASSERT_FALSE(try_catch.HasCaught());
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after
795 "Object.getOwnPropertyNames(result).toString() === '42,a'")); 795 "Object.getOwnPropertyNames(result).toString() === '42,a'"));
796 EXPECT_TRUE(EvaluateScriptForResultBool("result[42] === 'a'")); 796 EXPECT_TRUE(EvaluateScriptForResultBool("result[42] === 'a'"));
797 EXPECT_TRUE(EvaluateScriptForResultBool("result.a === 42")); 797 EXPECT_TRUE(EvaluateScriptForResultBool("result.a === 42"));
798 }); 798 });
799 } 799 }
800 800
801 TEST_F(ValueSerializerTest, RoundTripArray) { 801 TEST_F(ValueSerializerTest, RoundTripArray) {
802 // A simple array of integers. 802 // A simple array of integers.
803 RoundTripTest("[1, 2, 3, 4, 5]", [this](Local<Value> value) { 803 RoundTripTest("[1, 2, 3, 4, 5]", [this](Local<Value> value) {
804 ASSERT_TRUE(value->IsArray()); 804 ASSERT_TRUE(value->IsArray());
805 EXPECT_EQ(5, Array::Cast(*value)->Length()); 805 EXPECT_EQ(5u, Array::Cast(*value)->Length());
806 EXPECT_TRUE(EvaluateScriptForResultBool( 806 EXPECT_TRUE(EvaluateScriptForResultBool(
807 "Object.getPrototypeOf(result) === Array.prototype")); 807 "Object.getPrototypeOf(result) === Array.prototype"));
808 EXPECT_TRUE( 808 EXPECT_TRUE(
809 EvaluateScriptForResultBool("result.toString() === '1,2,3,4,5'")); 809 EvaluateScriptForResultBool("result.toString() === '1,2,3,4,5'"));
810 }); 810 });
811 // A long (sparse) array. 811 // A long (sparse) array.
812 RoundTripTest( 812 RoundTripTest(
813 "(() => { var x = new Array(1000); x[500] = 42; return x; })()", 813 "(() => { var x = new Array(1000); x[500] = 42; return x; })()",
814 [this](Local<Value> value) { 814 [this](Local<Value> value) {
815 ASSERT_TRUE(value->IsArray()); 815 ASSERT_TRUE(value->IsArray());
816 EXPECT_EQ(1000, Array::Cast(*value)->Length()); 816 EXPECT_EQ(1000u, Array::Cast(*value)->Length());
817 EXPECT_TRUE(EvaluateScriptForResultBool("result[500] === 42")); 817 EXPECT_TRUE(EvaluateScriptForResultBool("result[500] === 42"));
818 }); 818 });
819 // Duplicate reference. 819 // Duplicate reference.
820 RoundTripTest( 820 RoundTripTest(
821 "(() => { var y = {}; return [y, y]; })()", [this](Local<Value> value) { 821 "(() => { var y = {}; return [y, y]; })()", [this](Local<Value> value) {
822 ASSERT_TRUE(value->IsArray()); 822 ASSERT_TRUE(value->IsArray());
823 ASSERT_EQ(2, Array::Cast(*value)->Length()); 823 ASSERT_EQ(2u, Array::Cast(*value)->Length());
824 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result[1]")); 824 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result[1]"));
825 }); 825 });
826 // Duplicate reference in a sparse array. 826 // Duplicate reference in a sparse array.
827 RoundTripTest( 827 RoundTripTest(
828 "(() => { var x = new Array(1000); x[1] = x[500] = {}; return x; })()", 828 "(() => { var x = new Array(1000); x[1] = x[500] = {}; return x; })()",
829 [this](Local<Value> value) { 829 [this](Local<Value> value) {
830 ASSERT_TRUE(value->IsArray()); 830 ASSERT_TRUE(value->IsArray());
831 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 831 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
832 EXPECT_TRUE( 832 EXPECT_TRUE(
833 EvaluateScriptForResultBool("typeof result[1] === 'object'")); 833 EvaluateScriptForResultBool("typeof result[1] === 'object'"));
834 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === result[500]")); 834 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === result[500]"));
835 }); 835 });
836 // Self reference. 836 // Self reference.
837 RoundTripTest( 837 RoundTripTest(
838 "(() => { var y = []; y[0] = y; return y; })()", 838 "(() => { var y = []; y[0] = y; return y; })()",
839 [this](Local<Value> value) { 839 [this](Local<Value> value) {
840 ASSERT_TRUE(value->IsArray()); 840 ASSERT_TRUE(value->IsArray());
841 ASSERT_EQ(1, Array::Cast(*value)->Length()); 841 ASSERT_EQ(1u, Array::Cast(*value)->Length());
842 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result")); 842 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result"));
843 }); 843 });
844 // Self reference in a sparse array. 844 // Self reference in a sparse array.
845 RoundTripTest( 845 RoundTripTest(
846 "(() => { var y = new Array(1000); y[519] = y; return y; })()", 846 "(() => { var y = new Array(1000); y[519] = y; return y; })()",
847 [this](Local<Value> value) { 847 [this](Local<Value> value) {
848 ASSERT_TRUE(value->IsArray()); 848 ASSERT_TRUE(value->IsArray());
849 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 849 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
850 EXPECT_TRUE(EvaluateScriptForResultBool("result[519] === result")); 850 EXPECT_TRUE(EvaluateScriptForResultBool("result[519] === result"));
851 }); 851 });
852 // Array with additional properties. 852 // Array with additional properties.
853 RoundTripTest( 853 RoundTripTest(
854 "(() => { var y = [1, 2]; y.foo = 'bar'; return y; })()", 854 "(() => { var y = [1, 2]; y.foo = 'bar'; return y; })()",
855 [this](Local<Value> value) { 855 [this](Local<Value> value) {
856 ASSERT_TRUE(value->IsArray()); 856 ASSERT_TRUE(value->IsArray());
857 ASSERT_EQ(2, Array::Cast(*value)->Length()); 857 ASSERT_EQ(2u, Array::Cast(*value)->Length());
858 EXPECT_TRUE(EvaluateScriptForResultBool("result.toString() === '1,2'")); 858 EXPECT_TRUE(EvaluateScriptForResultBool("result.toString() === '1,2'"));
859 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'")); 859 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'"));
860 }); 860 });
861 // Sparse array with additional properties. 861 // Sparse array with additional properties.
862 RoundTripTest( 862 RoundTripTest(
863 "(() => { var y = new Array(1000); y.foo = 'bar'; return y; })()", 863 "(() => { var y = new Array(1000); y.foo = 'bar'; return y; })()",
864 [this](Local<Value> value) { 864 [this](Local<Value> value) {
865 ASSERT_TRUE(value->IsArray()); 865 ASSERT_TRUE(value->IsArray());
866 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 866 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
867 EXPECT_TRUE(EvaluateScriptForResultBool( 867 EXPECT_TRUE(EvaluateScriptForResultBool(
868 "result.toString() === ','.repeat(999)")); 868 "result.toString() === ','.repeat(999)"));
869 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'")); 869 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'"));
870 }); 870 });
871 // The distinction between holes and undefined elements must be maintained. 871 // The distinction between holes and undefined elements must be maintained.
872 RoundTripTest("[,undefined]", [this](Local<Value> value) { 872 RoundTripTest("[,undefined]", [this](Local<Value> value) {
873 ASSERT_TRUE(value->IsArray()); 873 ASSERT_TRUE(value->IsArray());
874 ASSERT_EQ(2, Array::Cast(*value)->Length()); 874 ASSERT_EQ(2u, Array::Cast(*value)->Length());
875 EXPECT_TRUE( 875 EXPECT_TRUE(
876 EvaluateScriptForResultBool("typeof result[0] === 'undefined'")); 876 EvaluateScriptForResultBool("typeof result[0] === 'undefined'"));
877 EXPECT_TRUE( 877 EXPECT_TRUE(
878 EvaluateScriptForResultBool("typeof result[1] === 'undefined'")); 878 EvaluateScriptForResultBool("typeof result[1] === 'undefined'"));
879 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(0)")); 879 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(0)"));
880 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty(1)")); 880 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty(1)"));
881 }); 881 });
882 } 882 }
883 883
884 TEST_F(ValueSerializerTest, DecodeArray) { 884 TEST_F(ValueSerializerTest, DecodeArray) {
885 // A simple array of integers. 885 // A simple array of integers.
886 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x41, 0x05, 0x3f, 0x01, 0x49, 0x02, 886 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x41, 0x05, 0x3f, 0x01, 0x49, 0x02,
887 0x3f, 0x01, 0x49, 0x04, 0x3f, 0x01, 0x49, 0x06, 0x3f, 0x01, 887 0x3f, 0x01, 0x49, 0x04, 0x3f, 0x01, 0x49, 0x06, 0x3f, 0x01,
888 0x49, 0x08, 0x3f, 0x01, 0x49, 0x0a, 0x24, 0x00, 0x05, 0x00}, 888 0x49, 0x08, 0x3f, 0x01, 0x49, 0x0a, 0x24, 0x00, 0x05, 0x00},
889 [this](Local<Value> value) { 889 [this](Local<Value> value) {
890 ASSERT_TRUE(value->IsArray()); 890 ASSERT_TRUE(value->IsArray());
891 EXPECT_EQ(5, Array::Cast(*value)->Length()); 891 EXPECT_EQ(5u, Array::Cast(*value)->Length());
892 EXPECT_TRUE(EvaluateScriptForResultBool( 892 EXPECT_TRUE(EvaluateScriptForResultBool(
893 "Object.getPrototypeOf(result) === Array.prototype")); 893 "Object.getPrototypeOf(result) === Array.prototype"));
894 EXPECT_TRUE(EvaluateScriptForResultBool( 894 EXPECT_TRUE(EvaluateScriptForResultBool(
895 "result.toString() === '1,2,3,4,5'")); 895 "result.toString() === '1,2,3,4,5'"));
896 }); 896 });
897 // A long (sparse) array. 897 // A long (sparse) array.
898 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49, 898 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49,
899 0xe8, 0x07, 0x3f, 0x01, 0x49, 0x54, 0x40, 0x01, 0xe8, 0x07}, 899 0xe8, 0x07, 0x3f, 0x01, 0x49, 0x54, 0x40, 0x01, 0xe8, 0x07},
900 [this](Local<Value> value) { 900 [this](Local<Value> value) {
901 ASSERT_TRUE(value->IsArray()); 901 ASSERT_TRUE(value->IsArray());
902 EXPECT_EQ(1000, Array::Cast(*value)->Length()); 902 EXPECT_EQ(1000u, Array::Cast(*value)->Length());
903 EXPECT_TRUE(EvaluateScriptForResultBool("result[500] === 42")); 903 EXPECT_TRUE(EvaluateScriptForResultBool("result[500] === 42"));
904 }); 904 });
905 // Duplicate reference. 905 // Duplicate reference.
906 DecodeTest( 906 DecodeTest(
907 {0xff, 0x09, 0x3f, 0x00, 0x41, 0x02, 0x3f, 0x01, 0x6f, 0x7b, 0x00, 0x3f, 907 {0xff, 0x09, 0x3f, 0x00, 0x41, 0x02, 0x3f, 0x01, 0x6f, 0x7b, 0x00, 0x3f,
908 0x02, 0x5e, 0x01, 0x24, 0x00, 0x02}, 908 0x02, 0x5e, 0x01, 0x24, 0x00, 0x02},
909 [this](Local<Value> value) { 909 [this](Local<Value> value) {
910 ASSERT_TRUE(value->IsArray()); 910 ASSERT_TRUE(value->IsArray());
911 ASSERT_EQ(2, Array::Cast(*value)->Length()); 911 ASSERT_EQ(2u, Array::Cast(*value)->Length());
912 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result[1]")); 912 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result[1]"));
913 }); 913 });
914 // Duplicate reference in a sparse array. 914 // Duplicate reference in a sparse array.
915 DecodeTest( 915 DecodeTest(
916 {0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49, 916 {0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49,
917 0x02, 0x3f, 0x01, 0x6f, 0x7b, 0x00, 0x3f, 0x02, 0x49, 0xe8, 917 0x02, 0x3f, 0x01, 0x6f, 0x7b, 0x00, 0x3f, 0x02, 0x49, 0xe8,
918 0x07, 0x3f, 0x02, 0x5e, 0x01, 0x40, 0x02, 0xe8, 0x07, 0x00}, 918 0x07, 0x3f, 0x02, 0x5e, 0x01, 0x40, 0x02, 0xe8, 0x07, 0x00},
919 [this](Local<Value> value) { 919 [this](Local<Value> value) {
920 ASSERT_TRUE(value->IsArray()); 920 ASSERT_TRUE(value->IsArray());
921 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 921 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
922 EXPECT_TRUE( 922 EXPECT_TRUE(
923 EvaluateScriptForResultBool("typeof result[1] === 'object'")); 923 EvaluateScriptForResultBool("typeof result[1] === 'object'"));
924 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === result[500]")); 924 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === result[500]"));
925 }); 925 });
926 // Self reference. 926 // Self reference.
927 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x41, 0x01, 0x3f, 0x01, 0x5e, 0x00, 0x24, 927 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x41, 0x01, 0x3f, 0x01, 0x5e, 0x00, 0x24,
928 0x00, 0x01, 0x00}, 928 0x00, 0x01, 0x00},
929 [this](Local<Value> value) { 929 [this](Local<Value> value) {
930 ASSERT_TRUE(value->IsArray()); 930 ASSERT_TRUE(value->IsArray());
931 ASSERT_EQ(1, Array::Cast(*value)->Length()); 931 ASSERT_EQ(1u, Array::Cast(*value)->Length());
932 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result")); 932 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === result"));
933 }); 933 });
934 // Self reference in a sparse array. 934 // Self reference in a sparse array.
935 DecodeTest( 935 DecodeTest(
936 {0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49, 936 {0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 0x49,
937 0x8e, 0x08, 0x3f, 0x01, 0x5e, 0x00, 0x40, 0x01, 0xe8, 0x07}, 937 0x8e, 0x08, 0x3f, 0x01, 0x5e, 0x00, 0x40, 0x01, 0xe8, 0x07},
938 [this](Local<Value> value) { 938 [this](Local<Value> value) {
939 ASSERT_TRUE(value->IsArray()); 939 ASSERT_TRUE(value->IsArray());
940 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 940 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
941 EXPECT_TRUE(EvaluateScriptForResultBool("result[519] === result")); 941 EXPECT_TRUE(EvaluateScriptForResultBool("result[519] === result"));
942 }); 942 });
943 // Array with additional properties. 943 // Array with additional properties.
944 DecodeTest( 944 DecodeTest(
945 {0xff, 0x09, 0x3f, 0x00, 0x41, 0x02, 0x3f, 0x01, 0x49, 0x02, 0x3f, 945 {0xff, 0x09, 0x3f, 0x00, 0x41, 0x02, 0x3f, 0x01, 0x49, 0x02, 0x3f,
946 0x01, 0x49, 0x04, 0x3f, 0x01, 0x53, 0x03, 0x66, 0x6f, 0x6f, 0x3f, 946 0x01, 0x49, 0x04, 0x3f, 0x01, 0x53, 0x03, 0x66, 0x6f, 0x6f, 0x3f,
947 0x01, 0x53, 0x03, 0x62, 0x61, 0x72, 0x24, 0x01, 0x02, 0x00}, 947 0x01, 0x53, 0x03, 0x62, 0x61, 0x72, 0x24, 0x01, 0x02, 0x00},
948 [this](Local<Value> value) { 948 [this](Local<Value> value) {
949 ASSERT_TRUE(value->IsArray()); 949 ASSERT_TRUE(value->IsArray());
950 ASSERT_EQ(2, Array::Cast(*value)->Length()); 950 ASSERT_EQ(2u, Array::Cast(*value)->Length());
951 EXPECT_TRUE(EvaluateScriptForResultBool("result.toString() === '1,2'")); 951 EXPECT_TRUE(EvaluateScriptForResultBool("result.toString() === '1,2'"));
952 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'")); 952 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'"));
953 }); 953 });
954 // Sparse array with additional properties. 954 // Sparse array with additional properties.
955 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01, 955 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x61, 0xe8, 0x07, 0x3f, 0x01,
956 0x53, 0x03, 0x66, 0x6f, 0x6f, 0x3f, 0x01, 0x53, 0x03, 956 0x53, 0x03, 0x66, 0x6f, 0x6f, 0x3f, 0x01, 0x53, 0x03,
957 0x62, 0x61, 0x72, 0x40, 0x01, 0xe8, 0x07, 0x00}, 957 0x62, 0x61, 0x72, 0x40, 0x01, 0xe8, 0x07, 0x00},
958 [this](Local<Value> value) { 958 [this](Local<Value> value) {
959 ASSERT_TRUE(value->IsArray()); 959 ASSERT_TRUE(value->IsArray());
960 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 960 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
961 EXPECT_TRUE(EvaluateScriptForResultBool( 961 EXPECT_TRUE(EvaluateScriptForResultBool(
962 "result.toString() === ','.repeat(999)")); 962 "result.toString() === ','.repeat(999)"));
963 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'")); 963 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'"));
964 }); 964 });
965 // The distinction between holes and undefined elements must be maintained. 965 // The distinction between holes and undefined elements must be maintained.
966 // Note that since the previous output from Chrome fails this test, an 966 // Note that since the previous output from Chrome fails this test, an
967 // encoding using the sparse format was constructed instead. 967 // encoding using the sparse format was constructed instead.
968 DecodeTest( 968 DecodeTest(
969 {0xff, 0x09, 0x61, 0x02, 0x49, 0x02, 0x5f, 0x40, 0x01, 0x02}, 969 {0xff, 0x09, 0x61, 0x02, 0x49, 0x02, 0x5f, 0x40, 0x01, 0x02},
970 [this](Local<Value> value) { 970 [this](Local<Value> value) {
971 ASSERT_TRUE(value->IsArray()); 971 ASSERT_TRUE(value->IsArray());
972 ASSERT_EQ(2, Array::Cast(*value)->Length()); 972 ASSERT_EQ(2u, Array::Cast(*value)->Length());
973 EXPECT_TRUE( 973 EXPECT_TRUE(
974 EvaluateScriptForResultBool("typeof result[0] === 'undefined'")); 974 EvaluateScriptForResultBool("typeof result[0] === 'undefined'"));
975 EXPECT_TRUE( 975 EXPECT_TRUE(
976 EvaluateScriptForResultBool("typeof result[1] === 'undefined'")); 976 EvaluateScriptForResultBool("typeof result[1] === 'undefined'"));
977 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(0)")); 977 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(0)"));
978 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty(1)")); 978 EXPECT_TRUE(EvaluateScriptForResultBool("result.hasOwnProperty(1)"));
979 }); 979 });
980 } 980 }
981 981
982 TEST_F(ValueSerializerTest, DecodeInvalidOverLargeArray) { 982 TEST_F(ValueSerializerTest, DecodeInvalidOverLargeArray) {
983 // So large it couldn't exist in the V8 heap, and its size couldn't fit in a 983 // So large it couldn't exist in the V8 heap, and its size couldn't fit in a
984 // SMI on 32-bit systems (2^30). 984 // SMI on 32-bit systems (2^30).
985 InvalidDecodeTest({0xff, 0x09, 0x41, 0x80, 0x80, 0x80, 0x80, 0x04}); 985 InvalidDecodeTest({0xff, 0x09, 0x41, 0x80, 0x80, 0x80, 0x80, 0x04});
986 // Not so large, but there isn't enough data left in the buffer. 986 // Not so large, but there isn't enough data left in the buffer.
987 InvalidDecodeTest({0xff, 0x09, 0x41, 0x01}); 987 InvalidDecodeTest({0xff, 0x09, 0x41, 0x01});
988 } 988 }
989 989
990 TEST_F(ValueSerializerTest, RoundTripArrayWithNonEnumerableElement) { 990 TEST_F(ValueSerializerTest, RoundTripArrayWithNonEnumerableElement) {
991 // Even though this array looks like [1,5,3], the 5 should be missing from the 991 // Even though this array looks like [1,5,3], the 5 should be missing from the
992 // perspective of structured clone, which only clones properties that were 992 // perspective of structured clone, which only clones properties that were
993 // enumerable. 993 // enumerable.
994 RoundTripTest( 994 RoundTripTest(
995 "(() => {" 995 "(() => {"
996 " var x = [1,2,3];" 996 " var x = [1,2,3];"
997 " Object.defineProperty(x, '1', {enumerable:false, value:5});" 997 " Object.defineProperty(x, '1', {enumerable:false, value:5});"
998 " return x;" 998 " return x;"
999 "})()", 999 "})()",
1000 [this](Local<Value> value) { 1000 [this](Local<Value> value) {
1001 ASSERT_TRUE(value->IsArray()); 1001 ASSERT_TRUE(value->IsArray());
1002 ASSERT_EQ(3, Array::Cast(*value)->Length()); 1002 ASSERT_EQ(3u, Array::Cast(*value)->Length());
1003 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty('1')")); 1003 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty('1')"));
1004 }); 1004 });
1005 } 1005 }
1006 1006
1007 TEST_F(ValueSerializerTest, RoundTripArrayWithTrickyGetters) { 1007 TEST_F(ValueSerializerTest, RoundTripArrayWithTrickyGetters) {
1008 // If an element is deleted before it is serialized, then it's deleted. 1008 // If an element is deleted before it is serialized, then it's deleted.
1009 RoundTripTest( 1009 RoundTripTest(
1010 "(() => {" 1010 "(() => {"
1011 " var x = [{ get a() { delete x[1]; }}, 42];" 1011 " var x = [{ get a() { delete x[1]; }}, 42];"
1012 " return x;" 1012 " return x;"
1013 "})()", 1013 "})()",
1014 [this](Local<Value> value) { 1014 [this](Local<Value> value) {
1015 ASSERT_TRUE(value->IsArray()); 1015 ASSERT_TRUE(value->IsArray());
1016 ASSERT_EQ(2, Array::Cast(*value)->Length()); 1016 ASSERT_EQ(2u, Array::Cast(*value)->Length());
1017 EXPECT_TRUE( 1017 EXPECT_TRUE(
1018 EvaluateScriptForResultBool("typeof result[1] === 'undefined'")); 1018 EvaluateScriptForResultBool("typeof result[1] === 'undefined'"));
1019 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(1)")); 1019 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(1)"));
1020 }); 1020 });
1021 // Same for sparse arrays. 1021 // Same for sparse arrays.
1022 RoundTripTest( 1022 RoundTripTest(
1023 "(() => {" 1023 "(() => {"
1024 " var x = [{ get a() { delete x[1]; }}, 42];" 1024 " var x = [{ get a() { delete x[1]; }}, 42];"
1025 " x.length = 1000;" 1025 " x.length = 1000;"
1026 " return x;" 1026 " return x;"
1027 "})()", 1027 "})()",
1028 [this](Local<Value> value) { 1028 [this](Local<Value> value) {
1029 ASSERT_TRUE(value->IsArray()); 1029 ASSERT_TRUE(value->IsArray());
1030 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1030 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1031 EXPECT_TRUE( 1031 EXPECT_TRUE(
1032 EvaluateScriptForResultBool("typeof result[1] === 'undefined'")); 1032 EvaluateScriptForResultBool("typeof result[1] === 'undefined'"));
1033 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(1)")); 1033 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(1)"));
1034 }); 1034 });
1035 // If the length is changed, then the resulting array still has the original 1035 // If the length is changed, then the resulting array still has the original
1036 // length, but elements that were not yet serialized are gone. 1036 // length, but elements that were not yet serialized are gone.
1037 RoundTripTest( 1037 RoundTripTest(
1038 "(() => {" 1038 "(() => {"
1039 " var x = [1, { get a() { x.length = 0; }}, 3, 4];" 1039 " var x = [1, { get a() { x.length = 0; }}, 3, 4];"
1040 " return x;" 1040 " return x;"
1041 "})()", 1041 "})()",
1042 [this](Local<Value> value) { 1042 [this](Local<Value> value) {
1043 ASSERT_TRUE(value->IsArray()); 1043 ASSERT_TRUE(value->IsArray());
1044 ASSERT_EQ(4, Array::Cast(*value)->Length()); 1044 ASSERT_EQ(4u, Array::Cast(*value)->Length());
1045 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === 1")); 1045 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === 1"));
1046 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(2)")); 1046 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(2)"));
1047 }); 1047 });
1048 // The same is true if the length is shortened, but there are still items 1048 // The same is true if the length is shortened, but there are still items
1049 // remaining. 1049 // remaining.
1050 RoundTripTest( 1050 RoundTripTest(
1051 "(() => {" 1051 "(() => {"
1052 " var x = [1, { get a() { x.length = 3; }}, 3, 4];" 1052 " var x = [1, { get a() { x.length = 3; }}, 3, 4];"
1053 " return x;" 1053 " return x;"
1054 "})()", 1054 "})()",
1055 [this](Local<Value> value) { 1055 [this](Local<Value> value) {
1056 ASSERT_TRUE(value->IsArray()); 1056 ASSERT_TRUE(value->IsArray());
1057 ASSERT_EQ(4, Array::Cast(*value)->Length()); 1057 ASSERT_EQ(4u, Array::Cast(*value)->Length());
1058 EXPECT_TRUE(EvaluateScriptForResultBool("result[2] === 3")); 1058 EXPECT_TRUE(EvaluateScriptForResultBool("result[2] === 3"));
1059 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(3)")); 1059 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(3)"));
1060 }); 1060 });
1061 // Same for sparse arrays. 1061 // Same for sparse arrays.
1062 RoundTripTest( 1062 RoundTripTest(
1063 "(() => {" 1063 "(() => {"
1064 " var x = [1, { get a() { x.length = 0; }}, 3, 4];" 1064 " var x = [1, { get a() { x.length = 0; }}, 3, 4];"
1065 " x.length = 1000;" 1065 " x.length = 1000;"
1066 " return x;" 1066 " return x;"
1067 "})()", 1067 "})()",
1068 [this](Local<Value> value) { 1068 [this](Local<Value> value) {
1069 ASSERT_TRUE(value->IsArray()); 1069 ASSERT_TRUE(value->IsArray());
1070 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1070 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1071 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === 1")); 1071 EXPECT_TRUE(EvaluateScriptForResultBool("result[0] === 1"));
1072 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(2)")); 1072 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(2)"));
1073 }); 1073 });
1074 RoundTripTest( 1074 RoundTripTest(
1075 "(() => {" 1075 "(() => {"
1076 " var x = [1, { get a() { x.length = 3; }}, 3, 4];" 1076 " var x = [1, { get a() { x.length = 3; }}, 3, 4];"
1077 " x.length = 1000;" 1077 " x.length = 1000;"
1078 " return x;" 1078 " return x;"
1079 "})()", 1079 "})()",
1080 [this](Local<Value> value) { 1080 [this](Local<Value> value) {
1081 ASSERT_TRUE(value->IsArray()); 1081 ASSERT_TRUE(value->IsArray());
1082 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1082 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1083 EXPECT_TRUE(EvaluateScriptForResultBool("result[2] === 3")); 1083 EXPECT_TRUE(EvaluateScriptForResultBool("result[2] === 3"));
1084 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(3)")); 1084 EXPECT_TRUE(EvaluateScriptForResultBool("!result.hasOwnProperty(3)"));
1085 }); 1085 });
1086 // If a getter makes a property non-enumerable, it should still be enumerated 1086 // If a getter makes a property non-enumerable, it should still be enumerated
1087 // as enumeration happens once before getters are invoked. 1087 // as enumeration happens once before getters are invoked.
1088 RoundTripTest( 1088 RoundTripTest(
1089 "(() => {" 1089 "(() => {"
1090 " var x = [{ get a() {" 1090 " var x = [{ get a() {"
1091 " Object.defineProperty(x, '1', { value: 3, enumerable: false });" 1091 " Object.defineProperty(x, '1', { value: 3, enumerable: false });"
1092 " }}, 2];" 1092 " }}, 2];"
1093 " return x;" 1093 " return x;"
1094 "})()", 1094 "})()",
1095 [this](Local<Value> value) { 1095 [this](Local<Value> value) {
1096 ASSERT_TRUE(value->IsArray()); 1096 ASSERT_TRUE(value->IsArray());
1097 ASSERT_EQ(2, Array::Cast(*value)->Length()); 1097 ASSERT_EQ(2u, Array::Cast(*value)->Length());
1098 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 3")); 1098 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 3"));
1099 }); 1099 });
1100 // Same for sparse arrays. 1100 // Same for sparse arrays.
1101 RoundTripTest( 1101 RoundTripTest(
1102 "(() => {" 1102 "(() => {"
1103 " var x = [{ get a() {" 1103 " var x = [{ get a() {"
1104 " Object.defineProperty(x, '1', { value: 3, enumerable: false });" 1104 " Object.defineProperty(x, '1', { value: 3, enumerable: false });"
1105 " }}, 2];" 1105 " }}, 2];"
1106 " x.length = 1000;" 1106 " x.length = 1000;"
1107 " return x;" 1107 " return x;"
1108 "})()", 1108 "})()",
1109 [this](Local<Value> value) { 1109 [this](Local<Value> value) {
1110 ASSERT_TRUE(value->IsArray()); 1110 ASSERT_TRUE(value->IsArray());
1111 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1111 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1112 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 3")); 1112 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 3"));
1113 }); 1113 });
1114 // Getters on the array itself must also run. 1114 // Getters on the array itself must also run.
1115 RoundTripTest( 1115 RoundTripTest(
1116 "(() => {" 1116 "(() => {"
1117 " var x = [1, 2, 3];" 1117 " var x = [1, 2, 3];"
1118 " Object.defineProperty(x, '1', { enumerable: true, get: () => 4 });" 1118 " Object.defineProperty(x, '1', { enumerable: true, get: () => 4 });"
1119 " return x;" 1119 " return x;"
1120 "})()", 1120 "})()",
1121 [this](Local<Value> value) { 1121 [this](Local<Value> value) {
1122 ASSERT_TRUE(value->IsArray()); 1122 ASSERT_TRUE(value->IsArray());
1123 ASSERT_EQ(3, Array::Cast(*value)->Length()); 1123 ASSERT_EQ(3u, Array::Cast(*value)->Length());
1124 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 4")); 1124 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 4"));
1125 }); 1125 });
1126 // Same for sparse arrays. 1126 // Same for sparse arrays.
1127 RoundTripTest( 1127 RoundTripTest(
1128 "(() => {" 1128 "(() => {"
1129 " var x = [1, 2, 3];" 1129 " var x = [1, 2, 3];"
1130 " Object.defineProperty(x, '1', { enumerable: true, get: () => 4 });" 1130 " Object.defineProperty(x, '1', { enumerable: true, get: () => 4 });"
1131 " x.length = 1000;" 1131 " x.length = 1000;"
1132 " return x;" 1132 " return x;"
1133 "})()", 1133 "})()",
1134 [this](Local<Value> value) { 1134 [this](Local<Value> value) {
1135 ASSERT_TRUE(value->IsArray()); 1135 ASSERT_TRUE(value->IsArray());
1136 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1136 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1137 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 4")); 1137 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] === 4"));
1138 }); 1138 });
1139 // Even with a getter that deletes things, we don't read from the prototype. 1139 // Even with a getter that deletes things, we don't read from the prototype.
1140 RoundTripTest( 1140 RoundTripTest(
1141 "(() => {" 1141 "(() => {"
1142 " var x = [{ get a() { delete x[1]; } }, 2];" 1142 " var x = [{ get a() { delete x[1]; } }, 2];"
1143 " x.__proto__ = Object.create(Array.prototype, { 1: { value: 6 } });" 1143 " x.__proto__ = Object.create(Array.prototype, { 1: { value: 6 } });"
1144 " return x;" 1144 " return x;"
1145 "})()", 1145 "})()",
1146 [this](Local<Value> value) { 1146 [this](Local<Value> value) {
1147 ASSERT_TRUE(value->IsArray()); 1147 ASSERT_TRUE(value->IsArray());
1148 ASSERT_EQ(2, Array::Cast(*value)->Length()); 1148 ASSERT_EQ(2u, Array::Cast(*value)->Length());
1149 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)")); 1149 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)"));
1150 }); 1150 });
1151 // Same for sparse arrays. 1151 // Same for sparse arrays.
1152 RoundTripTest( 1152 RoundTripTest(
1153 "(() => {" 1153 "(() => {"
1154 " var x = [{ get a() { delete x[1]; } }, 2];" 1154 " var x = [{ get a() { delete x[1]; } }, 2];"
1155 " x.__proto__ = Object.create(Array.prototype, { 1: { value: 6 } });" 1155 " x.__proto__ = Object.create(Array.prototype, { 1: { value: 6 } });"
1156 " x.length = 1000;" 1156 " x.length = 1000;"
1157 " return x;" 1157 " return x;"
1158 "})()", 1158 "})()",
1159 [this](Local<Value> value) { 1159 [this](Local<Value> value) {
1160 ASSERT_TRUE(value->IsArray()); 1160 ASSERT_TRUE(value->IsArray());
1161 ASSERT_EQ(1000, Array::Cast(*value)->Length()); 1161 ASSERT_EQ(1000u, Array::Cast(*value)->Length());
1162 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)")); 1162 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)"));
1163 }); 1163 });
1164 } 1164 }
1165 1165
1166 TEST_F(ValueSerializerTest, DecodeSparseArrayVersion0) { 1166 TEST_F(ValueSerializerTest, DecodeSparseArrayVersion0) {
1167 // Empty (sparse) array. 1167 // Empty (sparse) array.
1168 DecodeTestForVersion0({0x40, 0x00, 0x00, 0x00}, 1168 DecodeTestForVersion0({0x40, 0x00, 0x00, 0x00},
1169 [this](Local<Value> value) { 1169 [this](Local<Value> value) {
1170 ASSERT_TRUE(value->IsArray()); 1170 ASSERT_TRUE(value->IsArray());
1171 ASSERT_EQ(0, Array::Cast(*value)->Length()); 1171 ASSERT_EQ(0u, Array::Cast(*value)->Length());
1172 }); 1172 });
1173 // Sparse array with a mixture of elements and properties. 1173 // Sparse array with a mixture of elements and properties.
1174 DecodeTestForVersion0( 1174 DecodeTestForVersion0(
1175 {0x55, 0x00, 0x53, 0x01, 'a', 0x55, 0x02, 0x55, 0x05, 0x53, 1175 {0x55, 0x00, 0x53, 0x01, 'a', 0x55, 0x02, 0x55, 0x05, 0x53,
1176 0x03, 'f', 'o', 'o', 0x53, 0x03, 'b', 'a', 'r', 0x53, 1176 0x03, 'f', 'o', 'o', 0x53, 0x03, 'b', 'a', 'r', 0x53,
1177 0x03, 'b', 'a', 'z', 0x49, 0x0b, 0x40, 0x04, 0x03, 0x00}, 1177 0x03, 'b', 'a', 'z', 0x49, 0x0b, 0x40, 0x04, 0x03, 0x00},
1178 [this](Local<Value> value) { 1178 [this](Local<Value> value) {
1179 ASSERT_TRUE(value->IsArray()); 1179 ASSERT_TRUE(value->IsArray());
1180 EXPECT_EQ(3, Array::Cast(*value)->Length()); 1180 EXPECT_EQ(3u, Array::Cast(*value)->Length());
1181 EXPECT_TRUE( 1181 EXPECT_TRUE(
1182 EvaluateScriptForResultBool("result.toString() === 'a,,5'")); 1182 EvaluateScriptForResultBool("result.toString() === 'a,,5'"));
1183 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)")); 1183 EXPECT_TRUE(EvaluateScriptForResultBool("!(1 in result)"));
1184 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'")); 1184 EXPECT_TRUE(EvaluateScriptForResultBool("result.foo === 'bar'"));
1185 EXPECT_TRUE(EvaluateScriptForResultBool("result.baz === -6")); 1185 EXPECT_TRUE(EvaluateScriptForResultBool("result.baz === -6"));
1186 }); 1186 });
1187 // Sparse array in a sparse array (sanity check of nesting). 1187 // Sparse array in a sparse array (sanity check of nesting).
1188 DecodeTestForVersion0( 1188 DecodeTestForVersion0(
1189 {0x55, 0x01, 0x55, 0x01, 0x54, 0x40, 0x01, 0x02, 0x40, 0x01, 0x02, 0x00}, 1189 {0x55, 0x01, 0x55, 0x01, 0x54, 0x40, 0x01, 0x02, 0x40, 0x01, 0x02, 0x00},
1190 [this](Local<Value> value) { 1190 [this](Local<Value> value) {
1191 ASSERT_TRUE(value->IsArray()); 1191 ASSERT_TRUE(value->IsArray());
1192 EXPECT_EQ(2, Array::Cast(*value)->Length()); 1192 EXPECT_EQ(2u, Array::Cast(*value)->Length());
1193 EXPECT_TRUE(EvaluateScriptForResultBool("!(0 in result)")); 1193 EXPECT_TRUE(EvaluateScriptForResultBool("!(0 in result)"));
1194 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] instanceof Array")); 1194 EXPECT_TRUE(EvaluateScriptForResultBool("result[1] instanceof Array"));
1195 EXPECT_TRUE(EvaluateScriptForResultBool("!(0 in result[1])")); 1195 EXPECT_TRUE(EvaluateScriptForResultBool("!(0 in result[1])"));
1196 EXPECT_TRUE(EvaluateScriptForResultBool("result[1][1] === true")); 1196 EXPECT_TRUE(EvaluateScriptForResultBool("result[1][1] === true"));
1197 }); 1197 });
1198 } 1198 }
1199 1199
1200 TEST_F(ValueSerializerTest, RoundTripDate) { 1200 TEST_F(ValueSerializerTest, RoundTripDate) {
1201 RoundTripTest("new Date(1e6)", [this](Local<Value> value) { 1201 RoundTripTest("new Date(1e6)", [this](Local<Value> value) {
1202 ASSERT_TRUE(value->IsDate()); 1202 ASSERT_TRUE(value->IsDate());
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 "new Uint8Array(result.a).toString() === '0,1,128,255'")); 1801 "new Uint8Array(result.a).toString() === '0,1,128,255'"));
1802 }); 1802 });
1803 } 1803 }
1804 1804
1805 TEST_F(ValueSerializerTest, RoundTripTypedArray) { 1805 TEST_F(ValueSerializerTest, RoundTripTypedArray) {
1806 // Check that the right type comes out the other side for every kind of typed 1806 // Check that the right type comes out the other side for every kind of typed
1807 // array. 1807 // array.
1808 #define TYPED_ARRAY_ROUND_TRIP_TEST(Type, type, TYPE, ctype, size) \ 1808 #define TYPED_ARRAY_ROUND_TRIP_TEST(Type, type, TYPE, ctype, size) \
1809 RoundTripTest("new " #Type "Array(2)", [this](Local<Value> value) { \ 1809 RoundTripTest("new " #Type "Array(2)", [this](Local<Value> value) { \
1810 ASSERT_TRUE(value->Is##Type##Array()); \ 1810 ASSERT_TRUE(value->Is##Type##Array()); \
1811 EXPECT_EQ(2 * size, TypedArray::Cast(*value)->ByteLength()); \ 1811 EXPECT_EQ(2u * size, TypedArray::Cast(*value)->ByteLength()); \
1812 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); \ 1812 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length()); \
1813 EXPECT_TRUE(EvaluateScriptForResultBool( \ 1813 EXPECT_TRUE(EvaluateScriptForResultBool( \
1814 "Object.getPrototypeOf(result) === " #Type "Array.prototype")); \ 1814 "Object.getPrototypeOf(result) === " #Type "Array.prototype")); \
1815 }); 1815 });
1816 TYPED_ARRAYS(TYPED_ARRAY_ROUND_TRIP_TEST) 1816 TYPED_ARRAYS(TYPED_ARRAY_ROUND_TRIP_TEST)
1817 #undef TYPED_ARRAY_CASE 1817 #undef TYPED_ARRAY_CASE
1818 1818
1819 // Check that values of various kinds are suitably preserved. 1819 // Check that values of various kinds are suitably preserved.
1820 RoundTripTest("new Uint8Array([1, 128, 255])", [this](Local<Value> value) { 1820 RoundTripTest("new Uint8Array([1, 128, 255])", [this](Local<Value> value) {
1821 EXPECT_TRUE( 1821 EXPECT_TRUE(
1822 EvaluateScriptForResultBool("result.toString() === '1,128,255'")); 1822 EvaluateScriptForResultBool("result.toString() === '1,128,255'"));
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1856 }); 1856 });
1857 } 1857 }
1858 1858
1859 TEST_F(ValueSerializerTest, DecodeTypedArray) { 1859 TEST_F(ValueSerializerTest, DecodeTypedArray) {
1860 // Check that the right type comes out the other side for every kind of typed 1860 // Check that the right type comes out the other side for every kind of typed
1861 // array. 1861 // array.
1862 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x02, 0x00, 0x00, 0x56, 1862 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x02, 0x00, 0x00, 0x56,
1863 0x42, 0x00, 0x02}, 1863 0x42, 0x00, 0x02},
1864 [this](Local<Value> value) { 1864 [this](Local<Value> value) {
1865 ASSERT_TRUE(value->IsUint8Array()); 1865 ASSERT_TRUE(value->IsUint8Array());
1866 EXPECT_EQ(2, TypedArray::Cast(*value)->ByteLength()); 1866 EXPECT_EQ(2u, TypedArray::Cast(*value)->ByteLength());
1867 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1867 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1868 EXPECT_TRUE(EvaluateScriptForResultBool( 1868 EXPECT_TRUE(EvaluateScriptForResultBool(
1869 "Object.getPrototypeOf(result) === Uint8Array.prototype")); 1869 "Object.getPrototypeOf(result) === Uint8Array.prototype"));
1870 }); 1870 });
1871 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x02, 0x00, 0x00, 0x56, 1871 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x02, 0x00, 0x00, 0x56,
1872 0x62, 0x00, 0x02}, 1872 0x62, 0x00, 0x02},
1873 [this](Local<Value> value) { 1873 [this](Local<Value> value) {
1874 ASSERT_TRUE(value->IsInt8Array()); 1874 ASSERT_TRUE(value->IsInt8Array());
1875 EXPECT_EQ(2, TypedArray::Cast(*value)->ByteLength()); 1875 EXPECT_EQ(2u, TypedArray::Cast(*value)->ByteLength());
1876 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1876 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1877 EXPECT_TRUE(EvaluateScriptForResultBool( 1877 EXPECT_TRUE(EvaluateScriptForResultBool(
1878 "Object.getPrototypeOf(result) === Int8Array.prototype")); 1878 "Object.getPrototypeOf(result) === Int8Array.prototype"));
1879 }); 1879 });
1880 #if defined(V8_TARGET_LITTLE_ENDIAN) 1880 #if defined(V8_TARGET_LITTLE_ENDIAN)
1881 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00, 1881 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00,
1882 0x00, 0x56, 0x57, 0x00, 0x04}, 1882 0x00, 0x56, 0x57, 0x00, 0x04},
1883 [this](Local<Value> value) { 1883 [this](Local<Value> value) {
1884 ASSERT_TRUE(value->IsUint16Array()); 1884 ASSERT_TRUE(value->IsUint16Array());
1885 EXPECT_EQ(4, TypedArray::Cast(*value)->ByteLength()); 1885 EXPECT_EQ(4u, TypedArray::Cast(*value)->ByteLength());
1886 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1886 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1887 EXPECT_TRUE(EvaluateScriptForResultBool( 1887 EXPECT_TRUE(EvaluateScriptForResultBool(
1888 "Object.getPrototypeOf(result) === Uint16Array.prototype")); 1888 "Object.getPrototypeOf(result) === Uint16Array.prototype"));
1889 }); 1889 });
1890 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00, 1890 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00,
1891 0x00, 0x56, 0x77, 0x00, 0x04}, 1891 0x00, 0x56, 0x77, 0x00, 0x04},
1892 [this](Local<Value> value) { 1892 [this](Local<Value> value) {
1893 ASSERT_TRUE(value->IsInt16Array()); 1893 ASSERT_TRUE(value->IsInt16Array());
1894 EXPECT_EQ(4, TypedArray::Cast(*value)->ByteLength()); 1894 EXPECT_EQ(4u, TypedArray::Cast(*value)->ByteLength());
1895 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1895 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1896 EXPECT_TRUE(EvaluateScriptForResultBool( 1896 EXPECT_TRUE(EvaluateScriptForResultBool(
1897 "Object.getPrototypeOf(result) === Int16Array.prototype")); 1897 "Object.getPrototypeOf(result) === Int16Array.prototype"));
1898 }); 1898 });
1899 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00, 1899 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00,
1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x44, 0x00, 0x08}, 1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x44, 0x00, 0x08},
1901 [this](Local<Value> value) { 1901 [this](Local<Value> value) {
1902 ASSERT_TRUE(value->IsUint32Array()); 1902 ASSERT_TRUE(value->IsUint32Array());
1903 EXPECT_EQ(8, TypedArray::Cast(*value)->ByteLength()); 1903 EXPECT_EQ(8u, TypedArray::Cast(*value)->ByteLength());
1904 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1904 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1905 EXPECT_TRUE(EvaluateScriptForResultBool( 1905 EXPECT_TRUE(EvaluateScriptForResultBool(
1906 "Object.getPrototypeOf(result) === Uint32Array.prototype")); 1906 "Object.getPrototypeOf(result) === Uint32Array.prototype"));
1907 }); 1907 });
1908 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00, 1908 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00,
1909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x64, 0x00, 0x08}, 1909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x64, 0x00, 0x08},
1910 [this](Local<Value> value) { 1910 [this](Local<Value> value) {
1911 ASSERT_TRUE(value->IsInt32Array()); 1911 ASSERT_TRUE(value->IsInt32Array());
1912 EXPECT_EQ(8, TypedArray::Cast(*value)->ByteLength()); 1912 EXPECT_EQ(8u, TypedArray::Cast(*value)->ByteLength());
1913 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1913 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1914 EXPECT_TRUE(EvaluateScriptForResultBool( 1914 EXPECT_TRUE(EvaluateScriptForResultBool(
1915 "Object.getPrototypeOf(result) === Int32Array.prototype")); 1915 "Object.getPrototypeOf(result) === Int32Array.prototype"));
1916 }); 1916 });
1917 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00, 1917 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x08, 0x00, 0x00,
1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x66, 0x00, 0x08}, 1918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x66, 0x00, 0x08},
1919 [this](Local<Value> value) { 1919 [this](Local<Value> value) {
1920 ASSERT_TRUE(value->IsFloat32Array()); 1920 ASSERT_TRUE(value->IsFloat32Array());
1921 EXPECT_EQ(8, TypedArray::Cast(*value)->ByteLength()); 1921 EXPECT_EQ(8u, TypedArray::Cast(*value)->ByteLength());
1922 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1922 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1923 EXPECT_TRUE(EvaluateScriptForResultBool( 1923 EXPECT_TRUE(EvaluateScriptForResultBool(
1924 "Object.getPrototypeOf(result) === Float32Array.prototype")); 1924 "Object.getPrototypeOf(result) === Float32Array.prototype"));
1925 }); 1925 });
1926 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x10, 0x00, 0x00, 1926 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x10, 0x00, 0x00,
1927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1928 0x00, 0x00, 0x00, 0x00, 0x56, 0x46, 0x00, 0x10}, 1928 0x00, 0x00, 0x00, 0x00, 0x56, 0x46, 0x00, 0x10},
1929 [this](Local<Value> value) { 1929 [this](Local<Value> value) {
1930 ASSERT_TRUE(value->IsFloat64Array()); 1930 ASSERT_TRUE(value->IsFloat64Array());
1931 EXPECT_EQ(16, TypedArray::Cast(*value)->ByteLength()); 1931 EXPECT_EQ(16u, TypedArray::Cast(*value)->ByteLength());
1932 EXPECT_EQ(2, TypedArray::Cast(*value)->Length()); 1932 EXPECT_EQ(2u, TypedArray::Cast(*value)->Length());
1933 EXPECT_TRUE(EvaluateScriptForResultBool( 1933 EXPECT_TRUE(EvaluateScriptForResultBool(
1934 "Object.getPrototypeOf(result) === Float64Array.prototype")); 1934 "Object.getPrototypeOf(result) === Float64Array.prototype"));
1935 }); 1935 });
1936 #endif // V8_TARGET_LITTLE_ENDIAN 1936 #endif // V8_TARGET_LITTLE_ENDIAN
1937 1937
1938 // Check that values of various kinds are suitably preserved. 1938 // Check that values of various kinds are suitably preserved.
1939 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x03, 0x01, 0x80, 0xff, 1939 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x03, 0x01, 0x80, 0xff,
1940 0x56, 0x42, 0x00, 0x03, 0x00}, 1940 0x56, 0x42, 0x00, 0x03, 0x00},
1941 [this](Local<Value> value) { 1941 [this](Local<Value> value) {
1942 EXPECT_TRUE(EvaluateScriptForResultBool( 1942 EXPECT_TRUE(EvaluateScriptForResultBool(
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1997 {0xff, 0x09, 0x42, 0x04, 0x00, 0x00, 0x00, 0x00, 0x56, 0x77, 0x02, 0x01}); 1997 {0xff, 0x09, 0x42, 0x04, 0x00, 0x00, 0x00, 0x00, 0x56, 0x77, 0x02, 0x01});
1998 // Invalid view type (0xff). 1998 // Invalid view type (0xff).
1999 InvalidDecodeTest( 1999 InvalidDecodeTest(
2000 {0xff, 0x09, 0x42, 0x02, 0x00, 0x00, 0x56, 0xff, 0x01, 0x01}); 2000 {0xff, 0x09, 0x42, 0x02, 0x00, 0x00, 0x56, 0xff, 0x01, 0x01});
2001 } 2001 }
2002 2002
2003 TEST_F(ValueSerializerTest, RoundTripDataView) { 2003 TEST_F(ValueSerializerTest, RoundTripDataView) {
2004 RoundTripTest("new DataView(new ArrayBuffer(4), 1, 2)", 2004 RoundTripTest("new DataView(new ArrayBuffer(4), 1, 2)",
2005 [this](Local<Value> value) { 2005 [this](Local<Value> value) {
2006 ASSERT_TRUE(value->IsDataView()); 2006 ASSERT_TRUE(value->IsDataView());
2007 EXPECT_EQ(1, DataView::Cast(*value)->ByteOffset()); 2007 EXPECT_EQ(1u, DataView::Cast(*value)->ByteOffset());
2008 EXPECT_EQ(2, DataView::Cast(*value)->ByteLength()); 2008 EXPECT_EQ(2u, DataView::Cast(*value)->ByteLength());
2009 EXPECT_EQ(4, DataView::Cast(*value)->Buffer()->ByteLength()); 2009 EXPECT_EQ(4u, DataView::Cast(*value)->Buffer()->ByteLength());
2010 EXPECT_TRUE(EvaluateScriptForResultBool( 2010 EXPECT_TRUE(EvaluateScriptForResultBool(
2011 "Object.getPrototypeOf(result) === DataView.prototype")); 2011 "Object.getPrototypeOf(result) === DataView.prototype"));
2012 }); 2012 });
2013 } 2013 }
2014 2014
2015 TEST_F(ValueSerializerTest, DecodeDataView) { 2015 TEST_F(ValueSerializerTest, DecodeDataView) {
2016 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00, 2016 DecodeTest({0xff, 0x09, 0x3f, 0x00, 0x3f, 0x00, 0x42, 0x04, 0x00, 0x00, 0x00,
2017 0x00, 0x56, 0x3f, 0x01, 0x02}, 2017 0x00, 0x56, 0x3f, 0x01, 0x02},
2018 [this](Local<Value> value) { 2018 [this](Local<Value> value) {
2019 ASSERT_TRUE(value->IsDataView()); 2019 ASSERT_TRUE(value->IsDataView());
2020 EXPECT_EQ(1, DataView::Cast(*value)->ByteOffset()); 2020 EXPECT_EQ(1u, DataView::Cast(*value)->ByteOffset());
2021 EXPECT_EQ(2, DataView::Cast(*value)->ByteLength()); 2021 EXPECT_EQ(2u, DataView::Cast(*value)->ByteLength());
2022 EXPECT_EQ(4, DataView::Cast(*value)->Buffer()->ByteLength()); 2022 EXPECT_EQ(4u, DataView::Cast(*value)->Buffer()->ByteLength());
2023 EXPECT_TRUE(EvaluateScriptForResultBool( 2023 EXPECT_TRUE(EvaluateScriptForResultBool(
2024 "Object.getPrototypeOf(result) === DataView.prototype")); 2024 "Object.getPrototypeOf(result) === DataView.prototype"));
2025 }); 2025 });
2026 } 2026 }
2027 2027
2028 TEST_F(ValueSerializerTest, DecodeInvalidDataView) { 2028 TEST_F(ValueSerializerTest, DecodeInvalidDataView) {
2029 // Byte offset out of range. 2029 // Byte offset out of range.
2030 InvalidDecodeTest( 2030 InvalidDecodeTest(
2031 {0xff, 0x09, 0x42, 0x02, 0x00, 0x00, 0x56, 0x3f, 0x03, 0x01}); 2031 {0xff, 0x09, 0x42, 0x02, 0x00, 0x00, 0x56, 0x3f, 0x03, 0x01});
2032 // Byte offset in range, offset + length out of range. 2032 // Byte offset in range, offset + length out of range.
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
2524 InvalidDecodeTest(raw); 2524 InvalidDecodeTest(raw);
2525 } 2525 }
2526 2526
2527 TEST_F(ValueSerializerTestWithWasm, DecodeWasmModuleWithInvalidDataLength) { 2527 TEST_F(ValueSerializerTestWithWasm, DecodeWasmModuleWithInvalidDataLength) {
2528 InvalidDecodeTest({0xff, 0x09, 0x3f, 0x00, 0x57, 0x79, 0x7f, 0x00}); 2528 InvalidDecodeTest({0xff, 0x09, 0x3f, 0x00, 0x57, 0x79, 0x7f, 0x00});
2529 InvalidDecodeTest({0xff, 0x09, 0x3f, 0x00, 0x57, 0x79, 0x00, 0x7f}); 2529 InvalidDecodeTest({0xff, 0x09, 0x3f, 0x00, 0x57, 0x79, 0x00, 0x7f});
2530 } 2530 }
2531 2531
2532 } // namespace 2532 } // namespace
2533 } // namespace v8 2533 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/test-serialize.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698