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

Side by Side Diff: mojo/edk/system/core_unittest.cc

Issue 1350023003: Add a Mojo EDK for Chrome that uses one OS pipe per message pipe. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move to mojo::edk namespace in preparation for runtim flag Created 5 years, 3 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium 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 "mojo/edk/system/core.h" 5 #include "mojo/edk/system/core.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <limits> 9 #include <limits>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "mojo/edk/embedder/embedder_internal.h"
12 #include "mojo/edk/system/awakable.h" 13 #include "mojo/edk/system/awakable.h"
13 #include "mojo/edk/system/core_test_base.h" 14 #include "mojo/edk/system/core_test_base.h"
14 #include "mojo/edk/system/test_utils.h" 15 #include "mojo/edk/system/test_utils.h"
15 #include "mojo/public/cpp/system/macros.h" 16 #include "mojo/public/cpp/system/macros.h"
16 17
17 namespace mojo { 18 namespace mojo {
18 namespace system { 19 namespace edk {
19 namespace { 20 namespace {
20 21
21 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u}; 22 const MojoHandleSignalsState kEmptyMojoHandleSignalsState = {0u, 0u};
22 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u}; 23 const MojoHandleSignalsState kFullMojoHandleSignalsState = {~0u, ~0u};
23 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | 24 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE |
24 MOJO_HANDLE_SIGNAL_WRITABLE | 25 MOJO_HANDLE_SIGNAL_WRITABLE |
25 MOJO_HANDLE_SIGNAL_PEER_CLOSED; 26 MOJO_HANDLE_SIGNAL_PEER_CLOSED;
26 27
27 using CoreTest = test::CoreTestBase; 28 using CoreTest = test::CoreTestBase;
28 29
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 // Write to |h[0]|. 652 // Write to |h[0]|.
652 buffer[0] = 'd'; 653 buffer[0] = 'd';
653 EXPECT_EQ( 654 EXPECT_EQ(
654 MOJO_RESULT_OK, 655 MOJO_RESULT_OK,
655 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1, 656 core()->WriteMessage(h[0], UserPointer<const void>(buffer), 1,
656 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE)); 657 NullUserPointer(), 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
657 658
658 // Close |h[0]|. 659 // Close |h[0]|.
659 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0])); 660 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
660 661
662 // Wait for |h[1]| to learn about the other end's closure.
663 EXPECT_EQ(MOJO_RESULT_OK,
664 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000,
665 MakeUserPointer(&hss[0])));
666
661 // Check that |h[1]| is no longer writable (and will never be). 667 // Check that |h[1]| is no longer writable (and will never be).
662 hss[0] = kEmptyMojoHandleSignalsState; 668 hss[0] = kEmptyMojoHandleSignalsState;
663 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 669 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
664 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000, 670 core()->Wait(h[1], MOJO_HANDLE_SIGNAL_WRITABLE, 1000000000,
665 MakeUserPointer(&hss[0]))); 671 MakeUserPointer(&hss[0])));
666 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 672 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
667 hss[0].satisfied_signals); 673 hss[0].satisfied_signals);
668 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 674 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
669 hss[0].satisfiable_signals); 675 hss[0].satisfiable_signals);
670 676
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 899
894 // Write. 900 // Write.
895 signed char elements[2] = {'A', 'B'}; 901 signed char elements[2] = {'A', 'B'};
896 uint32_t num_bytes = 2u; 902 uint32_t num_bytes = 2u;
897 EXPECT_EQ(MOJO_RESULT_OK, 903 EXPECT_EQ(MOJO_RESULT_OK,
898 core()->WriteData(ph, UserPointer<const void>(elements), 904 core()->WriteData(ph, UserPointer<const void>(elements),
899 MakeUserPointer(&num_bytes), 905 MakeUserPointer(&num_bytes),
900 MOJO_WRITE_DATA_FLAG_NONE)); 906 MOJO_WRITE_DATA_FLAG_NONE));
901 EXPECT_EQ(2u, num_bytes); 907 EXPECT_EQ(2u, num_bytes);
902 908
909 // Wait for the data to arrive to the consumer.
910 EXPECT_EQ(MOJO_RESULT_OK,
911 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
912 MakeUserPointer(&hss)));
913
903 // Consumer should now be readable. 914 // Consumer should now be readable.
904 hss = kEmptyMojoHandleSignalsState; 915 hss = kEmptyMojoHandleSignalsState;
905 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, 916 EXPECT_EQ(MOJO_RESULT_OK, core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0,
906 MakeUserPointer(&hss))); 917 MakeUserPointer(&hss)));
907 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); 918 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
908 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 919 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
909 hss.satisfiable_signals); 920 hss.satisfiable_signals);
910 921
911 // Peek one character. 922 // Peek one character.
912 elements[0] = -1; 923 elements[0] = -1;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 core()->WriteData(ph, UserPointer<const void>(elements), 957 core()->WriteData(ph, UserPointer<const void>(elements),
947 MakeUserPointer(&num_bytes), 958 MakeUserPointer(&num_bytes),
948 MOJO_WRITE_DATA_FLAG_NONE)); 959 MOJO_WRITE_DATA_FLAG_NONE));
949 960
950 // Actually write the data, and complete it now. 961 // Actually write the data, and complete it now.
951 static_cast<char*>(write_ptr)[0] = 'C'; 962 static_cast<char*>(write_ptr)[0] = 'C';
952 static_cast<char*>(write_ptr)[1] = 'D'; 963 static_cast<char*>(write_ptr)[1] = 'D';
953 static_cast<char*>(write_ptr)[2] = 'E'; 964 static_cast<char*>(write_ptr)[2] = 'E';
954 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u)); 965 EXPECT_EQ(MOJO_RESULT_OK, core()->EndWriteData(ph, 3u));
955 966
967 // Wait for the data to arrive to the consumer.
968 EXPECT_EQ(MOJO_RESULT_OK,
969 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
970 MakeUserPointer(&hss)));
971
956 // Query how much data we have. 972 // Query how much data we have.
957 num_bytes = 0; 973 num_bytes = 0;
958 EXPECT_EQ(MOJO_RESULT_OK, 974 EXPECT_EQ(MOJO_RESULT_OK,
959 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 975 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
960 MOJO_READ_DATA_FLAG_QUERY)); 976 MOJO_READ_DATA_FLAG_QUERY));
961 EXPECT_EQ(4u, num_bytes); 977 EXPECT_GE(num_bytes, 1u);
962 978
963 // Try to query with peek. Should fail. 979 // Try to query with peek. Should fail.
964 num_bytes = 0; 980 num_bytes = 0;
965 EXPECT_EQ( 981 EXPECT_EQ(
966 MOJO_RESULT_INVALID_ARGUMENT, 982 MOJO_RESULT_INVALID_ARGUMENT,
967 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 983 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
968 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK)); 984 MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK));
969 EXPECT_EQ(0u, num_bytes); 985 EXPECT_EQ(0u, num_bytes);
970 986
971 // Try to discard ten characters, in all-or-none mode. Should fail. 987 // Try to discard ten characters, in all-or-none mode. Should fail.
972 num_bytes = 10; 988 num_bytes = 10;
973 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, 989 EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
974 core()->ReadData( 990 core()->ReadData(
975 ch, NullUserPointer(), MakeUserPointer(&num_bytes), 991 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
976 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 992 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
977 993
978 // Try to discard two characters, in peek mode. Should fail. 994 // Try to discard two characters, in peek mode. Should fail.
979 num_bytes = 2; 995 num_bytes = 2;
980 EXPECT_EQ( 996 EXPECT_EQ(
981 MOJO_RESULT_INVALID_ARGUMENT, 997 MOJO_RESULT_INVALID_ARGUMENT,
982 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 998 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
983 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK)); 999 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK));
984 1000
985 // Discard two characters. 1001 // Discard a character.
986 num_bytes = 2; 1002 num_bytes = 1;
987 EXPECT_EQ(MOJO_RESULT_OK, 1003 EXPECT_EQ(MOJO_RESULT_OK,
988 core()->ReadData( 1004 core()->ReadData(
989 ch, NullUserPointer(), MakeUserPointer(&num_bytes), 1005 ch, NullUserPointer(), MakeUserPointer(&num_bytes),
990 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 1006 MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE));
991 1007
992 // Try a two-phase read of the remaining two bytes with peek. Should fail. 1008 // Ensure the 3 bytes were read.
1009 EXPECT_EQ(MOJO_RESULT_OK,
1010 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 1000000000,
1011 MakeUserPointer(&hss)));
1012
1013 // Try a two-phase read of the remaining three bytes with peek. Should fail.
993 const void* read_ptr = nullptr; 1014 const void* read_ptr = nullptr;
994 num_bytes = 2; 1015 num_bytes = 3;
995 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, 1016 ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
996 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), 1017 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
997 MakeUserPointer(&num_bytes), 1018 MakeUserPointer(&num_bytes),
998 MOJO_READ_DATA_FLAG_PEEK)); 1019 MOJO_READ_DATA_FLAG_PEEK));
999 1020
1000 // Read the remaining two characters, in two-phase mode (all-or-none). 1021 // Read the remaining two characters, in two-phase mode (all-or-none).
1001 num_bytes = 2; 1022 num_bytes = 3;
1002 ASSERT_EQ(MOJO_RESULT_OK, 1023 ASSERT_EQ(MOJO_RESULT_OK,
1003 core()->BeginReadData(ch, MakeUserPointer(&read_ptr), 1024 core()->BeginReadData(ch, MakeUserPointer(&read_ptr),
1004 MakeUserPointer(&num_bytes), 1025 MakeUserPointer(&num_bytes),
1005 MOJO_READ_DATA_FLAG_ALL_OR_NONE)); 1026 MOJO_READ_DATA_FLAG_ALL_OR_NONE));
1006 // Note: Count on still being able to do the contiguous read here. 1027 // Note: Count on still being able to do the contiguous read here.
1007 ASSERT_EQ(2u, num_bytes); 1028 ASSERT_EQ(3u, num_bytes);
1008 1029
1009 // Discarding right now should fail. 1030 // Discarding right now should fail.
1010 num_bytes = 1; 1031 num_bytes = 1;
1011 EXPECT_EQ(MOJO_RESULT_BUSY, 1032 EXPECT_EQ(MOJO_RESULT_BUSY,
1012 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes), 1033 core()->ReadData(ch, NullUserPointer(), MakeUserPointer(&num_bytes),
1013 MOJO_READ_DATA_FLAG_DISCARD)); 1034 MOJO_READ_DATA_FLAG_DISCARD));
1014 1035
1015 // Actually check our data and end the two-phase read. 1036 // Actually check our data and end the two-phase read.
1016 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[0]); 1037 EXPECT_EQ('C', static_cast<const char*>(read_ptr)[0]);
1017 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[1]); 1038 EXPECT_EQ('D', static_cast<const char*>(read_ptr)[1]);
1018 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 2u)); 1039 EXPECT_EQ('E', static_cast<const char*>(read_ptr)[2]);
1040 EXPECT_EQ(MOJO_RESULT_OK, core()->EndReadData(ch, 3u));
1019 1041
1020 // Consumer should now be no longer readable. 1042 // Consumer should now be no longer readable.
1021 hss = kFullMojoHandleSignalsState; 1043 hss = kFullMojoHandleSignalsState;
1022 EXPECT_EQ( 1044 EXPECT_EQ(
1023 MOJO_RESULT_DEADLINE_EXCEEDED, 1045 MOJO_RESULT_DEADLINE_EXCEEDED,
1024 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 1046 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1025 EXPECT_EQ(0u, hss.satisfied_signals); 1047 EXPECT_EQ(0u, hss.satisfied_signals);
1026 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1048 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
1027 hss.satisfiable_signals); 1049 hss.satisfiable_signals);
1028 1050
1029 // TODO(vtl): More. 1051 // TODO(vtl): More.
1030 1052
1031 // Close the producer. 1053 // Close the producer.
1032 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph)); 1054 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ph));
1033 1055
1056 // Wait for this to get to the consumer.
1057 EXPECT_EQ(MOJO_RESULT_OK,
1058 core()->Wait(ch, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1000000000,
1059 MakeUserPointer(&hss)));
1060
1034 // The consumer should now be never-readable. 1061 // The consumer should now be never-readable.
1035 hss = kFullMojoHandleSignalsState; 1062 hss = kFullMojoHandleSignalsState;
1036 EXPECT_EQ( 1063 EXPECT_EQ(
1037 MOJO_RESULT_FAILED_PRECONDITION, 1064 MOJO_RESULT_FAILED_PRECONDITION,
1038 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); 1065 core()->Wait(ch, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss)));
1039 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 1066 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
1040 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 1067 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
1041 1068
1042 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch)); 1069 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(ch));
1043 } 1070 }
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 1333
1307 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); 1334 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0));
1308 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); 1335 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result);
1309 1336
1310 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); 1337 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
1311 } 1338 }
1312 1339
1313 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. 1340 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|.
1314 1341
1315 } // namespace 1342 } // namespace
1316 } // namespace system 1343 } // namespace edk
1317 } // namespace mojo 1344 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698