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

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

Issue 1885663002: EDK: Add implementation of data pipe producer write threshold stuff. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 8 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
« no previous file with comments | « mojo/edk/system/data_pipe_impl.h ('k') | mojo/edk/system/data_pipe_producer_dispatcher.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 // This file contains tests that are shared between different implementations of 5 // This file contains tests that are shared between different implementations of
6 // |DataPipeImpl|. 6 // |DataPipeImpl|.
7 7
8 #include "mojo/edk/system/data_pipe_impl.h" 8 #include "mojo/edk/system/data_pipe_impl.h"
9 9
10 #include <stdint.h> 10 #include <stdint.h>
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 113
114 void Reset() { 114 void Reset() {
115 if (helper_) 115 if (helper_)
116 helper_->TearDown(); 116 helper_->TearDown();
117 117
118 helper_.reset(new Helper()); 118 helper_.reset(new Helper());
119 helper_->SetUp(); 119 helper_->SetUp();
120 } 120 }
121 121
122 void ProducerClose() { helper_->ProducerClose(); } 122 void ProducerClose() { helper_->ProducerClose(); }
123 MojoResult ProducerSetOptions(uint32_t write_threshold_num_bytes) {
124 return dpp()->ProducerSetOptions(write_threshold_num_bytes);
125 }
126 void ProducerGetOptions(uint32_t* write_threshold_num_bytes) {
127 dpp()->ProducerGetOptions(write_threshold_num_bytes);
128 }
123 MojoResult ProducerWriteData(UserPointer<const void> elements, 129 MojoResult ProducerWriteData(UserPointer<const void> elements,
124 UserPointer<uint32_t> num_bytes, 130 UserPointer<uint32_t> num_bytes,
125 bool all_or_none) { 131 bool all_or_none) {
126 return dpp()->ProducerWriteData(elements, num_bytes, all_or_none); 132 return dpp()->ProducerWriteData(elements, num_bytes, all_or_none);
127 } 133 }
128 MojoResult ProducerBeginWriteData(UserPointer<void*> buffer, 134 MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
129 UserPointer<uint32_t> buffer_num_bytes) { 135 UserPointer<uint32_t> buffer_num_bytes) {
130 return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes); 136 return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes);
131 } 137 }
132 MojoResult ProducerEndWriteData(uint32_t num_bytes_written) { 138 MojoResult ProducerEndWriteData(uint32_t num_bytes_written) {
(...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 Waiter cwaiter; // For consumer. 776 Waiter cwaiter; // For consumer.
771 HandleSignalsState hss; 777 HandleSignalsState hss;
772 uint32_t context; 778 uint32_t context;
773 779
774 // Never readable. 780 // Never readable.
775 pwaiter.Init(); 781 pwaiter.Init();
776 hss = HandleSignalsState(); 782 hss = HandleSignalsState();
777 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, 783 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
778 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_READABLE, 12, 784 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_READABLE, 12,
779 &hss)); 785 &hss));
780 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 786 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
781 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 787 hss.satisfied_signals);
788 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
789 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
782 hss.satisfiable_signals); 790 hss.satisfiable_signals);
783 791
784 // Already writable. 792 // Already writable.
785 pwaiter.Init(); 793 pwaiter.Init();
786 hss = HandleSignalsState(); 794 hss = HandleSignalsState();
787 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 795 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
788 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34, 796 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 34,
789 &hss)); 797 &hss));
790 798
791 // We'll need to wait for readability for the remote cases. 799 // We'll need to wait for readability for the remote cases.
(...skipping 13 matching lines...) Expand all
805 // Adding a waiter should now succeed. 813 // Adding a waiter should now succeed.
806 pwaiter.Init(); 814 pwaiter.Init();
807 ASSERT_EQ(MOJO_RESULT_OK, 815 ASSERT_EQ(MOJO_RESULT_OK,
808 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, 816 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56,
809 nullptr)); 817 nullptr));
810 // And it shouldn't be writable yet. 818 // And it shouldn't be writable yet.
811 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); 819 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr));
812 hss = HandleSignalsState(); 820 hss = HandleSignalsState();
813 this->ProducerRemoveAwakable(&pwaiter, &hss); 821 this->ProducerRemoveAwakable(&pwaiter, &hss);
814 EXPECT_EQ(0u, hss.satisfied_signals); 822 EXPECT_EQ(0u, hss.satisfied_signals);
815 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 823 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
824 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
816 hss.satisfiable_signals); 825 hss.satisfiable_signals);
817 826
818 // Wait for data to become available to the consumer. 827 // Wait for data to become available to the consumer.
819 context = 0; 828 context = 0;
820 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), &context)); 829 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), &context));
821 EXPECT_EQ(1234u, context); 830 EXPECT_EQ(1234u, context);
822 hss = HandleSignalsState(); 831 hss = HandleSignalsState();
823 this->ConsumerRemoveAwakable(&cwaiter, &hss); 832 this->ConsumerRemoveAwakable(&cwaiter, &hss);
824 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 833 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
825 hss.satisfied_signals); 834 hss.satisfied_signals);
(...skipping 15 matching lines...) Expand all
841 // Add a waiter. 850 // Add a waiter.
842 pwaiter.Init(); 851 pwaiter.Init();
843 ASSERT_EQ(MOJO_RESULT_OK, 852 ASSERT_EQ(MOJO_RESULT_OK,
844 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, 853 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56,
845 nullptr)); 854 nullptr));
846 // And it still shouldn't be writable yet. 855 // And it still shouldn't be writable yet.
847 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); 856 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr));
848 hss = HandleSignalsState(); 857 hss = HandleSignalsState();
849 this->ProducerRemoveAwakable(&pwaiter, &hss); 858 this->ProducerRemoveAwakable(&pwaiter, &hss);
850 EXPECT_EQ(0u, hss.satisfied_signals); 859 EXPECT_EQ(0u, hss.satisfied_signals);
851 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 860 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
861 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
852 hss.satisfiable_signals); 862 hss.satisfiable_signals);
853 863
854 // Do it again. 864 // Do it again.
855 pwaiter.Init(); 865 pwaiter.Init();
856 ASSERT_EQ(MOJO_RESULT_OK, 866 ASSERT_EQ(MOJO_RESULT_OK,
857 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78, 867 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 78,
858 nullptr)); 868 nullptr));
859 869
860 // Read one element. 870 // Read one element.
861 elements[0] = -1; 871 elements[0] = -1;
862 elements[1] = -1; 872 elements[1] = -1;
863 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 873 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
864 EXPECT_EQ(MOJO_RESULT_OK, 874 EXPECT_EQ(MOJO_RESULT_OK,
865 this->ConsumerReadData(UserPointer<void>(elements), 875 this->ConsumerReadData(UserPointer<void>(elements),
866 MakeUserPointer(&num_bytes), true, false)); 876 MakeUserPointer(&num_bytes), true, false));
867 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 877 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
868 EXPECT_EQ(123, elements[0]); 878 EXPECT_EQ(123, elements[0]);
869 EXPECT_EQ(-1, elements[1]); 879 EXPECT_EQ(-1, elements[1]);
870 880
871 // Waiting should now succeed. 881 // Waiting should now succeed.
872 context = 0; 882 context = 0;
873 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); 883 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context));
874 EXPECT_EQ(78u, context); 884 EXPECT_EQ(78u, context);
875 hss = HandleSignalsState(); 885 hss = HandleSignalsState();
876 this->ProducerRemoveAwakable(&pwaiter, &hss); 886 this->ProducerRemoveAwakable(&pwaiter, &hss);
877 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 887 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
878 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 888 hss.satisfied_signals);
889 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
890 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
879 hss.satisfiable_signals); 891 hss.satisfiable_signals);
880 892
881 // Try writing, using a two-phase write. 893 // Try writing, using a two-phase write.
882 void* buffer = nullptr; 894 void* buffer = nullptr;
883 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0])); 895 num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
884 EXPECT_EQ(MOJO_RESULT_OK, 896 EXPECT_EQ(MOJO_RESULT_OK,
885 this->ProducerBeginWriteData(MakeUserPointer(&buffer), 897 this->ProducerBeginWriteData(MakeUserPointer(&buffer),
886 MakeUserPointer(&num_bytes))); 898 MakeUserPointer(&num_bytes)));
887 EXPECT_TRUE(buffer); 899 EXPECT_TRUE(buffer);
888 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 900 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
(...skipping 22 matching lines...) Expand all
911 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]); 923 EXPECT_EQ(456, static_cast<const int32_t*>(read_buffer)[0]);
912 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>( 924 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(static_cast<uint32_t>(
913 1u * sizeof(elements[0])))); 925 1u * sizeof(elements[0]))));
914 926
915 // Waiting should succeed. 927 // Waiting should succeed.
916 context = 0; 928 context = 0;
917 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context)); 929 EXPECT_EQ(MOJO_RESULT_OK, pwaiter.Wait(test::TinyTimeout(), &context));
918 EXPECT_EQ(90u, context); 930 EXPECT_EQ(90u, context);
919 hss = HandleSignalsState(); 931 hss = HandleSignalsState();
920 this->ProducerRemoveAwakable(&pwaiter, &hss); 932 this->ProducerRemoveAwakable(&pwaiter, &hss);
921 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 933 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
922 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 934 hss.satisfied_signals);
935 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
936 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
923 hss.satisfiable_signals); 937 hss.satisfiable_signals);
924 938
925 // Write one element. 939 // Write one element.
926 elements[0] = 123; 940 elements[0] = 123;
927 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); 941 num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0]));
928 EXPECT_EQ(MOJO_RESULT_OK, 942 EXPECT_EQ(MOJO_RESULT_OK,
929 this->ProducerWriteData(UserPointer<const void>(elements), 943 this->ProducerWriteData(UserPointer<const void>(elements),
930 MakeUserPointer(&num_bytes), false)); 944 MakeUserPointer(&num_bytes), false));
931 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); 945 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
932 946
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after
1334 Waiter pwaiter; // For producer. 1348 Waiter pwaiter; // For producer.
1335 Waiter cwaiter; // For consumer. 1349 Waiter cwaiter; // For consumer.
1336 HandleSignalsState hss; 1350 HandleSignalsState hss;
1337 1351
1338 // It should be writable. 1352 // It should be writable.
1339 pwaiter.Init(); 1353 pwaiter.Init();
1340 hss = HandleSignalsState(); 1354 hss = HandleSignalsState();
1341 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 1355 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
1342 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0, 1356 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 0,
1343 &hss)); 1357 &hss));
1344 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 1358 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1345 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1359 hss.satisfied_signals);
1360 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1361 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1346 hss.satisfiable_signals); 1362 hss.satisfiable_signals);
1347 1363
1348 void* write_ptr = nullptr; 1364 void* write_ptr = nullptr;
1349 uint32_t num_bytes = 0u; 1365 uint32_t num_bytes = 0u;
1350 EXPECT_EQ(MOJO_RESULT_OK, 1366 EXPECT_EQ(MOJO_RESULT_OK,
1351 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr), 1367 this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
1352 MakeUserPointer(&num_bytes))); 1368 MakeUserPointer(&num_bytes)));
1353 EXPECT_TRUE(write_ptr); 1369 EXPECT_TRUE(write_ptr);
1354 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t))); 1370 EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
1355 1371
1356 // At this point, it shouldn't be writable. 1372 // At this point, it shouldn't be writable.
1357 pwaiter.Init(); 1373 pwaiter.Init();
1358 ASSERT_EQ(MOJO_RESULT_OK, 1374 ASSERT_EQ(MOJO_RESULT_OK,
1359 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1, 1375 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 1,
1360 nullptr)); 1376 nullptr));
1361 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr)); 1377 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, pwaiter.Wait(0, nullptr));
1362 hss = HandleSignalsState(); 1378 hss = HandleSignalsState();
1363 this->ProducerRemoveAwakable(&pwaiter, &hss); 1379 this->ProducerRemoveAwakable(&pwaiter, &hss);
1364 EXPECT_EQ(0u, hss.satisfied_signals); 1380 EXPECT_EQ(0u, hss.satisfied_signals);
1365 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1381 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1382 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1366 hss.satisfiable_signals); 1383 hss.satisfiable_signals);
1367 1384
1368 // It shouldn't be readable yet either (we'll wait later). 1385 // It shouldn't be readable yet either (we'll wait later).
1369 cwaiter.Init(); 1386 cwaiter.Init();
1370 ASSERT_EQ(MOJO_RESULT_OK, 1387 ASSERT_EQ(MOJO_RESULT_OK,
1371 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 2, 1388 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 2,
1372 nullptr)); 1389 nullptr));
1373 1390
1374 static_cast<int32_t*>(write_ptr)[0] = 123; 1391 static_cast<int32_t*>(write_ptr)[0] = 123;
1375 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData( 1392 EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(
1376 static_cast<uint32_t>(1u * sizeof(int32_t)))); 1393 static_cast<uint32_t>(1u * sizeof(int32_t))));
1377 1394
1378 // It should immediately be writable again. 1395 // It should immediately be writable again.
1379 pwaiter.Init(); 1396 pwaiter.Init();
1380 hss = HandleSignalsState(); 1397 hss = HandleSignalsState();
1381 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 1398 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
1382 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3, 1399 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 3,
1383 &hss)); 1400 &hss));
1384 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 1401 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1385 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1402 hss.satisfied_signals);
1403 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1404 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1386 hss.satisfiable_signals); 1405 hss.satisfiable_signals);
1387 1406
1388 // It should become readable. 1407 // It should become readable.
1389 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), nullptr)); 1408 EXPECT_EQ(MOJO_RESULT_OK, cwaiter.Wait(test::TinyTimeout(), nullptr));
1390 hss = HandleSignalsState(); 1409 hss = HandleSignalsState();
1391 this->ConsumerRemoveAwakable(&cwaiter, &hss); 1410 this->ConsumerRemoveAwakable(&cwaiter, &hss);
1392 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1411 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
1393 hss.satisfied_signals); 1412 hss.satisfied_signals);
1394 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | 1413 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1395 MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 1414 MOJO_HANDLE_SIGNAL_READ_THRESHOLD,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1428 MakeUserPointer(&num_bytes))); 1447 MakeUserPointer(&num_bytes)));
1429 EXPECT_TRUE(read_ptr); 1448 EXPECT_TRUE(read_ptr);
1430 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes); 1449 EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
1431 1450
1432 // At this point, it should still be writable. 1451 // At this point, it should still be writable.
1433 pwaiter.Init(); 1452 pwaiter.Init();
1434 hss = HandleSignalsState(); 1453 hss = HandleSignalsState();
1435 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, 1454 EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS,
1436 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6, 1455 this->ProducerAddAwakable(&pwaiter, MOJO_HANDLE_SIGNAL_WRITABLE, 6,
1437 &hss)); 1456 &hss));
1438 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); 1457 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1439 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED, 1458 hss.satisfied_signals);
1459 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
1460 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
1440 hss.satisfiable_signals); 1461 hss.satisfiable_signals);
1441 1462
1442 // But not readable. 1463 // But not readable.
1443 cwaiter.Init(); 1464 cwaiter.Init();
1444 ASSERT_EQ(MOJO_RESULT_OK, 1465 ASSERT_EQ(MOJO_RESULT_OK,
1445 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 7, 1466 this->ConsumerAddAwakable(&cwaiter, MOJO_HANDLE_SIGNAL_READABLE, 7,
1446 nullptr)); 1467 nullptr));
1447 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr)); 1468 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, cwaiter.Wait(0, nullptr));
1448 hss = HandleSignalsState(); 1469 hss = HandleSignalsState();
1449 this->ConsumerRemoveAwakable(&cwaiter, &hss); 1470 this->ConsumerRemoveAwakable(&cwaiter, &hss);
(...skipping 1092 matching lines...) Expand 10 before | Expand all | Expand 10 after
2542 // |ConsumerEndReadData()| below) we want |producer_open()| to be false but 2563 // |ConsumerEndReadData()| below) we want |producer_open()| to be false but
2543 // the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can 2564 // the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can
2544 // occur without the sleep, but is much less likely.) 2565 // occur without the sleep, but is much less likely.)
2545 ThreadSleep(10u); 2566 ThreadSleep(10u);
2546 2567
2547 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes)); 2568 EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes));
2548 2569
2549 this->ConsumerClose(); 2570 this->ConsumerClose();
2550 } 2571 }
2551 2572
2573 TYPED_TEST(DataPipeImplTest, WriteThreshold) {
2574 const MojoCreateDataPipeOptions options = {
2575 kSizeOfOptions, // |struct_size|.
2576 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
2577 1u, // |element_num_bytes|.
2578 10u // |capacity_num_bytes|.
2579 };
2580 this->Create(options);
2581 this->DoTransfer();
2582
2583 // The default write threshold should be 0 (which means "default", i.e., one
2584 // element).
2585 uint32_t write_threshold_num_bytes = 123;
2586 this->ProducerGetOptions(&write_threshold_num_bytes);
2587 EXPECT_EQ(0u, write_threshold_num_bytes);
2588
2589 Waiter waiter;
2590 HandleSignalsState hss;
2591
2592 // Try to wait to the write threshold signal; it should already have it.
2593 waiter.Init();
2594 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS,
2595 this->ProducerAddAwakable(
2596 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, &hss));
2597 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
2598 hss.satisfied_signals);
2599 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
2600 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
2601 hss.satisfiable_signals);
2602
2603 // Before writing, add a waiter on the consumer (since we'll need to know when
2604 // the written bytes have propagated).
2605 Waiter read_waiter;
2606 read_waiter.Init();
2607 ASSERT_EQ(MOJO_RESULT_OK,
2608 this->ConsumerAddAwakable(&read_waiter, MOJO_HANDLE_SIGNAL_READABLE,
2609 0, nullptr));
2610
2611 // Write 5 bytes.
2612 static const char kTestData[5] = {'A', 'B', 'C', 'D', 'E'};
2613 uint32_t num_bytes = 5;
2614 EXPECT_EQ(MOJO_RESULT_OK,
2615 this->ProducerWriteData(UserPointer<const void>(kTestData),
2616 MakeUserPointer(&num_bytes), false));
2617 EXPECT_EQ(5u, num_bytes);
2618
2619 // It should still have the write threshold signal.
2620 waiter.Init();
2621 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS,
2622 this->ProducerAddAwakable(
2623 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2624
2625 // Set the write threshold to 5.
2626 this->ProducerSetOptions(5);
2627 write_threshold_num_bytes = 123u;
2628 this->ProducerGetOptions(&write_threshold_num_bytes);
2629 EXPECT_EQ(5u, write_threshold_num_bytes);
2630
2631 // Should still have the write threshold signal.
2632 waiter.Init();
2633 ASSERT_EQ(MOJO_RESULT_ALREADY_EXISTS,
2634 this->ProducerAddAwakable(
2635 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2636
2637 // Set the write threshold to 6.
2638 this->ProducerSetOptions(6);
2639
2640 // Should no longer have the write threshold signal.
2641 waiter.Init();
2642 ASSERT_EQ(MOJO_RESULT_OK,
2643 this->ProducerAddAwakable(
2644 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2645 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
2646 hss = HandleSignalsState();
2647 this->ProducerRemoveAwakable(&waiter, &hss);
2648 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals);
2649 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
2650 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
2651 hss.satisfiable_signals);
2652
2653 // Add a waiter.
2654 waiter.Init();
2655 ASSERT_EQ(MOJO_RESULT_OK,
2656 this->ProducerAddAwakable(
2657 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2658
2659 // Wait for the consumer to be readable.
2660 EXPECT_EQ(MOJO_RESULT_OK, read_waiter.Wait(test::TinyTimeout(), nullptr));
2661 this->ConsumerRemoveAwakable(&read_waiter, nullptr);
2662
2663 // Read a byte.
2664 char read_byte = 'a';
2665 num_bytes = sizeof(read_byte);
2666 EXPECT_EQ(MOJO_RESULT_OK,
2667 this->ConsumerReadData(UserPointer<void>(&read_byte),
2668 MakeUserPointer(&num_bytes), true, false));
2669 EXPECT_EQ(1u, num_bytes);
2670 EXPECT_EQ(kTestData[0], read_byte);
2671
2672 // Wait; should get the write threshold signal.
2673 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyTimeout(), nullptr));
2674 hss = HandleSignalsState();
2675 this->ProducerRemoveAwakable(&waiter, &hss);
2676 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
2677 hss.satisfied_signals);
2678 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED |
2679 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD,
2680 hss.satisfiable_signals);
2681
2682 // Write 6 more bytes.
2683 static const char kMoreTestData[6] = {'1', '2', '3', '4', '5', '6'};
2684 num_bytes = 6;
2685 EXPECT_EQ(MOJO_RESULT_OK,
2686 this->ProducerWriteData(UserPointer<const void>(kMoreTestData),
2687 MakeUserPointer(&num_bytes), false));
2688 EXPECT_EQ(6u, num_bytes);
2689
2690 // Should no longer have the write threshold signal.
2691 waiter.Init();
2692 ASSERT_EQ(MOJO_RESULT_OK,
2693 this->ProducerAddAwakable(
2694 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2695 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
2696 this->ProducerRemoveAwakable(&waiter, nullptr);
2697
2698 // Set the write threshold to 0 (which means the element size, 1).
2699 this->ProducerSetOptions(0);
2700 write_threshold_num_bytes = 123u;
2701 this->ProducerGetOptions(&write_threshold_num_bytes);
2702 EXPECT_EQ(0u, write_threshold_num_bytes);
2703
2704 // Should still not have the write threshold signal.
2705 waiter.Init();
2706 ASSERT_EQ(MOJO_RESULT_OK,
2707 this->ProducerAddAwakable(
2708 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2709 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr));
2710 this->ProducerRemoveAwakable(&waiter, nullptr);
2711
2712 // Add a waiter.
2713 waiter.Init();
2714 ASSERT_EQ(MOJO_RESULT_OK,
2715 this->ProducerAddAwakable(
2716 &waiter, MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, 0, nullptr));
2717
2718 // Close the consumer.
2719 this->ConsumerClose();
2720
2721 // Wait; the condition should now never be satisfiable.
2722 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
2723 waiter.Wait(test::TinyTimeout(), nullptr));
2724 hss = HandleSignalsState();
2725 this->ProducerRemoveAwakable(&waiter, &hss);
2726 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
2727 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
2728
2729 this->ProducerClose();
2730 }
2731
2552 TYPED_TEST(DataPipeImplTest, ReadThreshold) { 2732 TYPED_TEST(DataPipeImplTest, ReadThreshold) {
2553 const MojoCreateDataPipeOptions options = { 2733 const MojoCreateDataPipeOptions options = {
2554 kSizeOfOptions, // |struct_size|. 2734 kSizeOfOptions, // |struct_size|.
2555 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|. 2735 MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE, // |flags|.
2556 1u, // |element_num_bytes|. 2736 1u, // |element_num_bytes|.
2557 1000u // |capacity_num_bytes|. 2737 1000u // |capacity_num_bytes|.
2558 }; 2738 };
2559 this->Create(options); 2739 this->Create(options);
2560 this->DoTransfer(); 2740 this->DoTransfer();
2561 2741
2562 // The default read threshold should be 0 (which means "default", i.e., one 2742 // The default read threshold should be 0 (which means "default", i.e., one
2563 // element). 2743 // element).
2564 uint32_t read_threshold_num_bytes = 123u; 2744 uint32_t read_threshold_num_bytes = 123;
2565 this->ConsumerGetOptions(&read_threshold_num_bytes); 2745 this->ConsumerGetOptions(&read_threshold_num_bytes);
2566 EXPECT_EQ(0u, read_threshold_num_bytes); 2746 EXPECT_EQ(0u, read_threshold_num_bytes);
2567 2747
2568 Waiter waiter; 2748 Waiter waiter;
2569 HandleSignalsState hss; 2749 HandleSignalsState hss;
2570 2750
2571 // Add a waiter. 2751 // Add a waiter.
2572 waiter.Init(); 2752 waiter.Init();
2573 ASSERT_EQ(MOJO_RESULT_OK, 2753 ASSERT_EQ(MOJO_RESULT_OK,
2574 this->ConsumerAddAwakable( 2754 this->ConsumerAddAwakable(
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
2748 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss)); 2928 &waiter, MOJO_HANDLE_SIGNAL_READ_THRESHOLD, 0, &hss));
2749 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals); 2929 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfied_signals);
2750 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals); 2930 EXPECT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, hss.satisfiable_signals);
2751 2931
2752 this->ConsumerClose(); 2932 this->ConsumerClose();
2753 } 2933 }
2754 2934
2755 } // namespace 2935 } // namespace
2756 } // namespace system 2936 } // namespace system
2757 } // namespace mojo 2937 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/data_pipe_impl.h ('k') | mojo/edk/system/data_pipe_producer_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698