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

Side by Side Diff: ppapi/tests/test_websocket.cc

Issue 9802027: WebSocket Pepper API: synchronous completion support (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: add TestAbortCalls Created 8 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 | « ppapi/tests/test_websocket.h ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ppapi/tests/test_websocket.h" 5 #include "ppapi/tests/test_websocket.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <string.h> 8 #include <string.h>
9
9 #include <algorithm> 10 #include <algorithm>
11 #include <memory>
10 #include <string> 12 #include <string>
11 #include <vector> 13 #include <vector>
12 14
13 #include "ppapi/c/dev/ppb_testing_dev.h" 15 #include "ppapi/c/dev/ppb_testing_dev.h"
14 #include "ppapi/c/pp_bool.h" 16 #include "ppapi/c/pp_bool.h"
15 #include "ppapi/c/pp_completion_callback.h" 17 #include "ppapi/c/pp_completion_callback.h"
16 #include "ppapi/c/pp_errors.h" 18 #include "ppapi/c/pp_errors.h"
17 #include "ppapi/c/pp_instance.h" 19 #include "ppapi/c/pp_instance.h"
18 #include "ppapi/c/pp_resource.h" 20 #include "ppapi/c/pp_resource.h"
19 #include "ppapi/c/pp_var.h" 21 #include "ppapi/c/pp_var.h"
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 RUN_TEST_WITH_REFERENCE_CHECK(Protocols, filter); 193 RUN_TEST_WITH_REFERENCE_CHECK(Protocols, filter);
192 RUN_TEST_WITH_REFERENCE_CHECK(GetURL, filter); 194 RUN_TEST_WITH_REFERENCE_CHECK(GetURL, filter);
193 RUN_TEST_WITH_REFERENCE_CHECK(ValidConnect, filter); 195 RUN_TEST_WITH_REFERENCE_CHECK(ValidConnect, filter);
194 RUN_TEST_WITH_REFERENCE_CHECK(InvalidClose, filter); 196 RUN_TEST_WITH_REFERENCE_CHECK(InvalidClose, filter);
195 RUN_TEST_WITH_REFERENCE_CHECK(ValidClose, filter); 197 RUN_TEST_WITH_REFERENCE_CHECK(ValidClose, filter);
196 RUN_TEST_WITH_REFERENCE_CHECK(GetProtocol, filter); 198 RUN_TEST_WITH_REFERENCE_CHECK(GetProtocol, filter);
197 RUN_TEST_WITH_REFERENCE_CHECK(TextSendReceive, filter); 199 RUN_TEST_WITH_REFERENCE_CHECK(TextSendReceive, filter);
198 RUN_TEST_WITH_REFERENCE_CHECK(BinarySendReceive, filter); 200 RUN_TEST_WITH_REFERENCE_CHECK(BinarySendReceive, filter);
199 RUN_TEST_WITH_REFERENCE_CHECK(StressedSendReceive, filter); 201 RUN_TEST_WITH_REFERENCE_CHECK(StressedSendReceive, filter);
200 RUN_TEST_WITH_REFERENCE_CHECK(BufferedAmount, filter); 202 RUN_TEST_WITH_REFERENCE_CHECK(BufferedAmount, filter);
203 RUN_TEST_WITH_REFERENCE_CHECK(AbortCalls, filter);
201 204
202 RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter); 205 RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter);
203 206
204 RUN_TEST_WITH_REFERENCE_CHECK(UtilityInvalidConnect, filter); 207 RUN_TEST_WITH_REFERENCE_CHECK(UtilityInvalidConnect, filter);
205 RUN_TEST_WITH_REFERENCE_CHECK(UtilityProtocols, filter); 208 RUN_TEST_WITH_REFERENCE_CHECK(UtilityProtocols, filter);
206 RUN_TEST_WITH_REFERENCE_CHECK(UtilityGetURL, filter); 209 RUN_TEST_WITH_REFERENCE_CHECK(UtilityGetURL, filter);
207 RUN_TEST_WITH_REFERENCE_CHECK(UtilityValidConnect, filter); 210 RUN_TEST_WITH_REFERENCE_CHECK(UtilityValidConnect, filter);
208 RUN_TEST_WITH_REFERENCE_CHECK(UtilityInvalidClose, filter); 211 RUN_TEST_WITH_REFERENCE_CHECK(UtilityInvalidClose, filter);
209 RUN_TEST_WITH_REFERENCE_CHECK(UtilityValidClose, filter); 212 RUN_TEST_WITH_REFERENCE_CHECK(UtilityValidClose, filter);
210 RUN_TEST_WITH_REFERENCE_CHECK(UtilityGetProtocol, filter); 213 RUN_TEST_WITH_REFERENCE_CHECK(UtilityGetProtocol, filter);
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 ASSERT_TRUE(ws); 645 ASSERT_TRUE(ws);
643 ASSERT_EQ(PP_OK, connect_result); 646 ASSERT_EQ(PP_OK, connect_result);
644 647
645 // Prepare PP_Var objects to send. 648 // Prepare PP_Var objects to send.
646 const char* text = "hello pepper"; 649 const char* text = "hello pepper";
647 PP_Var text_var = CreateVarString(text); 650 PP_Var text_var = CreateVarString(text);
648 std::vector<uint8_t> binary(256); 651 std::vector<uint8_t> binary(256);
649 for (uint32_t i = 0; i < binary.size(); ++i) 652 for (uint32_t i = 0; i < binary.size(); ++i)
650 binary[i] = i; 653 binary[i] = i;
651 PP_Var binary_var = CreateVarBinary(binary); 654 PP_Var binary_var = CreateVarBinary(binary);
655 // Prepare very large binary data over 64KiB. Object serializer in
656 // ppapi_proxy has a limitation of 64KiB as maximum return PP_Var data size
657 // to SRPC. In case received data over 64KiB exists, a specific code handles
658 // this large data via asynchronous callback from main thread. This data
659 // intends to test the code.
660 std::vector<uint8_t> large_binary(65 * 1024);
661 for (uint32_t i = 0; i < large_binary.size(); ++i)
662 large_binary[i] = i & 0xff;
663 PP_Var large_binary_var = CreateVarBinary(large_binary);
652 664
653 // Send many messages. 665 // Send many messages.
666 int32_t result;
654 for (int i = 0; i < 256; ++i) { 667 for (int i = 0; i < 256; ++i) {
655 int32_t result = websocket_interface_->SendMessage(ws, text_var); 668 result = websocket_interface_->SendMessage(ws, text_var);
656 ASSERT_EQ(PP_OK, result); 669 ASSERT_EQ(PP_OK, result);
657 result = websocket_interface_->SendMessage(ws, binary_var); 670 result = websocket_interface_->SendMessage(ws, binary_var);
658 ASSERT_EQ(PP_OK, result); 671 ASSERT_EQ(PP_OK, result);
659 } 672 }
673 result = websocket_interface_->SendMessage(ws, large_binary_var);
674 ASSERT_EQ(PP_OK, result);
660 ReleaseVar(text_var); 675 ReleaseVar(text_var);
661 ReleaseVar(binary_var); 676 ReleaseVar(binary_var);
677 ReleaseVar(large_binary_var);
662 678
663 // Receive echoed data. 679 // Receive echoed data.
664 for (int i = 0; i < 512; ++i) { 680 for (int i = 0; i <= 512; ++i) {
665 TestCompletionCallback callback(instance_->pp_instance(), force_async_); 681 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
666 PP_Var received_message; 682 PP_Var received_message;
667 int32_t result = websocket_interface_->ReceiveMessage( 683 result = websocket_interface_->ReceiveMessage(
668 ws, &received_message, callback.GetCallback().pp_completion_callback()); 684 ws, &received_message, callback.GetCallback().pp_completion_callback());
669 ASSERT_TRUE(result == PP_OK || result == PP_OK_COMPLETIONPENDING); 685 ASSERT_TRUE(result == PP_OK || result == PP_OK_COMPLETIONPENDING);
670 if (result == PP_OK_COMPLETIONPENDING) 686 if (result == PP_OK_COMPLETIONPENDING)
671 result = callback.WaitForResult(); 687 result = callback.WaitForResult();
672 ASSERT_EQ(PP_OK, result); 688 ASSERT_EQ(PP_OK, result);
673 if (i & 1) { 689 if (i == 512) {
690 ASSERT_TRUE(AreEqualWithBinary(received_message, large_binary));
691 } else if (i & 1) {
674 ASSERT_TRUE(AreEqualWithBinary(received_message, binary)); 692 ASSERT_TRUE(AreEqualWithBinary(received_message, binary));
675 } else { 693 } else {
676 ASSERT_TRUE(AreEqualWithString(received_message, text)); 694 ASSERT_TRUE(AreEqualWithString(received_message, text));
677 } 695 }
678 ReleaseVar(received_message); 696 ReleaseVar(received_message);
679 } 697 }
680 core_interface_->ReleaseResource(ws); 698 core_interface_->ReleaseResource(ws);
681 699
682 PASS(); 700 PASS();
683 } 701 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 ASSERT_EQ(base_buffered_amount + reason_frame_size, buffered_amount); 757 ASSERT_EQ(base_buffered_amount + reason_frame_size, buffered_amount);
740 758
741 ReleaseVar(message_var); 759 ReleaseVar(message_var);
742 ReleaseVar(reason); 760 ReleaseVar(reason);
743 ReleaseVar(empty_string); 761 ReleaseVar(empty_string);
744 core_interface_->ReleaseResource(ws); 762 core_interface_->ReleaseResource(ws);
745 763
746 PASS(); 764 PASS();
747 } 765 }
748 766
767 std::string TestWebSocket::TestAbortCalls() {
768 // Test abort behaviors where a WebSocket PP_Resource is released while
769 // each function is in-flight on the WebSocket PP_Resource.
770 std::vector<uint8_t> large_binary(65 * 1024);
771 PP_Var large_var = CreateVarBinary(large_binary);
772
773 // Firstly, make sure the behavior for SendMessage().
dmichael (off chromium) 2012/04/13 18:48:21 nit: make sure->test?
Takashi Toyoshima 2012/04/16 14:09:16 Done.
774 // This function doesn't require a callback, but operation will be done
775 // asynchronously in WebKit and browser process.
776 int32_t result;
777 std::string url = GetFullURL(kEchoServerURL);
778 PP_Resource ws = Connect(url, &result, "");
779 ASSERT_TRUE(ws);
780 ASSERT_EQ(PP_OK, result);
781 result = websocket_interface_->SendMessage(ws, large_var);
782 ASSERT_EQ(PP_OK, result);
783 core_interface_->ReleaseResource(ws);
784
785 // Following tests make sure the behavior for functions which require a
786 // callback. The callback must get a PP_ERROR_ABORTED.
787 // Make sure the behavior for Connect().
dmichael (off chromium) 2012/04/13 18:48:21 Make sure -> Test? (globally)
Takashi Toyoshima 2012/04/16 14:09:16 Done.
788 ws = websocket_interface_->Create(instance_->pp_instance());
789 ASSERT_TRUE(ws);
790 PP_Var url_var = CreateVarString(url);
791 TestCompletionCallback connect_callback(
792 instance_->pp_instance(), force_async_);
793 result = websocket_interface_->Connect(ws, url_var, NULL, 0,
794 connect_callback.GetCallback().pp_completion_callback());
795 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
796 core_interface_->ReleaseResource(ws);
797 result = connect_callback.WaitForResult();
798 ASSERT_EQ(PP_ERROR_ABORTED, result);
799 ReleaseVar(url_var);
800
801 // Make sure the behavior for Close().
802 ws = Connect(url, &result, "");
803 ASSERT_TRUE(ws);
804 ASSERT_EQ(PP_OK, result);
805 PP_Var reason_var = CreateVarString("abort");
806 TestCompletionCallback close_callback(
807 instance_->pp_instance(), force_async_);
808 result = websocket_interface_->Close(ws,
809 PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, reason_var,
810 close_callback.GetCallback().pp_completion_callback());
811 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
812 core_interface_->ReleaseResource(ws);
813 result = close_callback.WaitForResult();
814 ASSERT_EQ(PP_ERROR_ABORTED, result);
815 ReleaseVar(reason_var);
816
817 // Make sure the behavior for ReceiveMessage().
818 // Firstly, make sure the simplest case to wait for data which never arrives.
819 ws = Connect(url, &result, "");
820 ASSERT_TRUE(ws);
821 ASSERT_EQ(PP_OK, result);
822 PP_Var receive_var;
823 TestCompletionCallback receive_callback(
824 instance_->pp_instance(), force_async_);
825 result = websocket_interface_->ReceiveMessage(ws, &receive_var,
826 receive_callback.GetCallback().pp_completion_callback());
827 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
828 core_interface_->ReleaseResource(ws);
829 result = receive_callback.WaitForResult();
830 ASSERT_EQ(PP_ERROR_ABORTED, result);
831
832 // Make sure the behavior where receive process might be in-flight.
833 const char* text = "yukarin";
834 PP_Var text_var = CreateVarString(text);
835
836 // Each trial sends 17 messages and receives just |trial| number of
837 // message(s) before releasing the WebSocket. The WebSocket is released while
838 // the next message is going to be received.
839 for (int trial = 1; trial <= 16; trial++) {
840 ws = Connect(url, &result, "");
841 ASSERT_TRUE(ws);
842 ASSERT_EQ(PP_OK, result);
843 for (int i = 0; i <= 16; ++i) {
844 result = websocket_interface_->SendMessage(ws, text_var);
845 ASSERT_EQ(PP_OK, result);
846 }
847 std::auto_ptr<TestCompletionCallback> callback;
848 PP_Var var;
849 for (int i = 0; i < trial; ++i) {
850 callback.reset(
851 new TestCompletionCallback(instance_->pp_instance(), force_async_));
852 result = websocket_interface_->ReceiveMessage(
853 ws, &var, callback->GetCallback().pp_completion_callback());
854 if (result == PP_OK_COMPLETIONPENDING)
855 result = callback->WaitForResult();
856 ASSERT_EQ(PP_OK, result);
857 ASSERT_TRUE(AreEqualWithString(var, text));
858 ReleaseVar(var);
859 }
860 result = websocket_interface_->ReceiveMessage(
861 ws, &var, callback->GetCallback().pp_completion_callback());
862 core_interface_->ReleaseResource(ws);
863 if (result != PP_OK) {
864 result = callback->WaitForResult();
865 ASSERT_EQ(PP_ERROR_ABORTED, result);
866 }
867 }
868 // Same test, but the last receiving message is large message over 64KiB.
869 for (int trial = 1; trial <= 16; trial++) {
870 ws = Connect(url, &result, "");
871 ASSERT_TRUE(ws);
872 ASSERT_EQ(PP_OK, result);
873 for (int i = 0; i <= 16; ++i) {
874 if (i == trial)
875 result = websocket_interface_->SendMessage(ws, large_var);
876 else
877 result = websocket_interface_->SendMessage(ws, text_var);
878 ASSERT_EQ(PP_OK, result);
879 }
880 std::auto_ptr<TestCompletionCallback> callback;
881 PP_Var var;
882 for (int i = 0; i < trial; ++i) {
883 callback.reset(
884 new TestCompletionCallback(instance_->pp_instance(), force_async_));
885 result = websocket_interface_->ReceiveMessage(
886 ws, &var, callback->GetCallback().pp_completion_callback());
887 if (result == PP_OK_COMPLETIONPENDING)
888 result = callback->WaitForResult();
889 ASSERT_EQ(PP_OK, result);
890 ASSERT_TRUE(AreEqualWithString(var, text));
891 ReleaseVar(var);
892 }
893 result = websocket_interface_->ReceiveMessage(
894 ws, &var, callback->GetCallback().pp_completion_callback());
895 core_interface_->ReleaseResource(ws);
896 if (result != PP_OK) {
897 result = callback->WaitForResult();
898 ASSERT_EQ(PP_ERROR_ABORTED, result);
899 }
900 }
901
902 ReleaseVar(large_var);
903 ReleaseVar(text_var);
904
905 PASS();
906 }
907
749 std::string TestWebSocket::TestCcInterfaces() { 908 std::string TestWebSocket::TestCcInterfaces() {
750 // C++ bindings is simple straightforward, then just verifies interfaces work 909 // C++ bindings is simple straightforward, then just verifies interfaces work
751 // as a interface bridge fine. 910 // as a interface bridge fine.
752 pp::WebSocket ws(instance_); 911 pp::WebSocket ws(instance_);
753 912
754 // Check uninitialized properties access. 913 // Check uninitialized properties access.
755 ASSERT_EQ(0, ws.GetBufferedAmount()); 914 ASSERT_EQ(0, ws.GetBufferedAmount());
756 ASSERT_EQ(0, ws.GetCloseCode()); 915 ASSERT_EQ(0, ws.GetCloseCode());
757 ASSERT_TRUE(AreEqualWithString(ws.GetCloseReason().pp_var(), "")); 916 ASSERT_TRUE(AreEqualWithString(ws.GetCloseReason().pp_var(), ""));
758 ASSERT_EQ(false, ws.GetCloseWasClean()); 917 ASSERT_EQ(false, ws.GetCloseWasClean());
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 size_t last_event = events_on_closed - 1; 1304 size_t last_event = events_on_closed - 1;
1146 for (uint32_t i = 1; i < last_event; ++i) { 1305 for (uint32_t i = 1; i < last_event; ++i) {
1147 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[i].event_type); 1306 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[i].event_type);
1148 ASSERT_TRUE(AreEqualWithString(events[i].var.pp_var(), message)); 1307 ASSERT_TRUE(AreEqualWithString(events[i].var.pp_var(), message));
1149 } 1308 }
1150 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[last_event].event_type); 1309 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[last_event].event_type);
1151 ASSERT_TRUE(events[last_event].was_clean); 1310 ASSERT_TRUE(events[last_event].was_clean);
1152 1311
1153 PASS(); 1312 PASS();
1154 } 1313 }
1314
OLDNEW
« no previous file with comments | « ppapi/tests/test_websocket.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698