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

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

Issue 8956008: WebSocket Pepper API: C++ utility class implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix flakiness on mac Created 9 years 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 | Annotate | Revision Log
« 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) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <string.h> 7 #include <string.h>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ppapi/c/dev/ppb_testing_dev.h" 10 #include "ppapi/c/dev/ppb_testing_dev.h"
11 #include "ppapi/c/dev/ppb_websocket_dev.h" 11 #include "ppapi/c/dev/ppb_websocket_dev.h"
12 #include "ppapi/c/pp_errors.h" 12 #include "ppapi/c/pp_errors.h"
13 #include "ppapi/c/pp_var.h" 13 #include "ppapi/c/pp_var.h"
14 #include "ppapi/c/pp_completion_callback.h" 14 #include "ppapi/c/pp_completion_callback.h"
15 #include "ppapi/c/ppb_core.h" 15 #include "ppapi/c/ppb_core.h"
16 #include "ppapi/c/ppb_var.h" 16 #include "ppapi/c/ppb_var.h"
17 #include "ppapi/cpp/dev/websocket_dev.h" 17 #include "ppapi/cpp/dev/websocket_dev.h"
18 #include "ppapi/cpp/helper/dev/websocket_api_dev.h"
18 #include "ppapi/cpp/instance.h" 19 #include "ppapi/cpp/instance.h"
19 #include "ppapi/cpp/module.h" 20 #include "ppapi/cpp/module.h"
20 #include "ppapi/tests/test_utils.h" 21 #include "ppapi/tests/test_utils.h"
21 #include "ppapi/tests/testing_instance.h" 22 #include "ppapi/tests/testing_instance.h"
22 23
23 const char kEchoServerURL[] = 24 const char kEchoServerURL[] =
24 "ws://localhost:8880/websocket/tests/hybi/echo"; 25 "ws://localhost:8880/websocket/tests/hybi/echo";
25 26
26 const char kCloseServerURL[] = 27 const char kCloseServerURL[] =
27 "ws://localhost:8880/websocket/tests/hybi/close"; 28 "ws://localhost:8880/websocket/tests/hybi/close";
28 29
29 const char kProtocolTestServerURL[] = 30 const char kProtocolTestServerURL[] =
30 "ws://localhost:8880/websocket/tests/hybi/protocol-test?protocol="; 31 "ws://localhost:8880/websocket/tests/hybi/protocol-test?protocol=";
31 32
32 const char* const kInvalidURLs[] = { 33 const char* const kInvalidURLs[] = {
33 "http://www.google.com/invalid_scheme", 34 "http://www.google.com/invalid_scheme",
34 "ws://www.google.com/invalid#fragment", 35 "ws://www.google.com/invalid#fragment",
35 "ws://www.google.com:65535/invalid_port", 36 "ws://www.google.com:65535/invalid_port",
36 NULL 37 NULL
37 }; 38 };
38 39
39 // Connection close code is defined in WebSocket protocol specification. 40 // Connection close code is defined in WebSocket protocol specification.
40 // The magic number 1000 means gracefull closure without any error. 41 // The magic number 1000 means gracefull closure without any error.
41 // See section 7.4.1. of RFC 6455. 42 // See section 7.4.1. of RFC 6455.
42 const uint16_t kCloseCodeNormalClosure = 1000U; 43 const uint16_t kCloseCodeNormalClosure = 1000U;
43 44
45 namespace {
46
47 struct WebSocketEvent {
48 enum EventType {
49 EVENT_OPEN,
50 EVENT_MESSAGE,
51 EVENT_ERROR,
52 EVENT_CLOSE
53 };
54
55 WebSocketEvent(EventType type,
56 bool was_clean,
57 uint16_t close_code,
58 const pp::Var& var)
59 : event_type(type),
60 was_clean(was_clean),
61 close_code(close_code),
62 var(var) {}
63 EventType event_type;
64 bool was_clean;
65 uint16_t close_code;
66 pp::Var var;
67 };
68
69 class TestWebSocketAPI : public pp::helper::WebSocketAPI_Dev {
70 public:
71 explicit TestWebSocketAPI(pp::Instance* instance)
72 : pp::helper::WebSocketAPI_Dev(instance),
73 connected_(false),
74 received_(false),
75 closed_(false),
76 wait_for_connected_(false),
77 wait_for_received_(false),
78 wait_for_closed_(false),
79 instance_(instance->pp_instance()) {}
80
81 virtual void OnOpen() {
82 events_.push_back(
83 WebSocketEvent(WebSocketEvent::EVENT_OPEN, true, 0U, pp::Var()));
84 connected_ = true;
85 if (wait_for_connected_) {
86 GetTestingInterface()->QuitMessageLoop(instance_);
87 wait_for_connected_ = false;
88 }
89 }
90
91 virtual void OnMessage(const pp::Var &message) {
92 events_.push_back(
93 WebSocketEvent(WebSocketEvent::EVENT_MESSAGE, true, 0U, message));
94 received_ = true;
95 if (wait_for_received_) {
96 GetTestingInterface()->QuitMessageLoop(instance_);
97 wait_for_received_ = false;
98 received_ = false;
99 }
100 }
101
102 virtual void OnError() {
103 events_.push_back(
104 WebSocketEvent(WebSocketEvent::EVENT_ERROR, true, 0U, pp::Var()));
105 }
106
107 virtual void OnClose(
108 bool was_clean, uint16_t code, const pp::Var& reason) {
109 events_.push_back(
110 WebSocketEvent(WebSocketEvent::EVENT_CLOSE, was_clean, code, reason));
111 connected_ = true;
112 closed_ = true;
113 if (wait_for_connected_ || wait_for_closed_) {
114 GetTestingInterface()->QuitMessageLoop(instance_);
115 wait_for_connected_ = false;
116 wait_for_closed_ = false;
117 }
118 }
119
120 void WaitForConnected() {
121 if (!connected_) {
122 wait_for_connected_ = true;
123 GetTestingInterface()->RunMessageLoop(instance_);
124 }
125 }
126
127 void WaitForReceived() {
128 if (!received_) {
129 wait_for_received_ = true;
130 GetTestingInterface()->RunMessageLoop(instance_);
131 }
132 }
133
134 void WaitForClosed() {
135 if (!closed_) {
136 wait_for_closed_ = true;
137 GetTestingInterface()->RunMessageLoop(instance_);
138 }
139 }
140
141 const std::vector<WebSocketEvent>& GetSeenEvents() const {
142 return events_;
143 }
144
145 private:
146 std::vector<WebSocketEvent> events_;
147 bool connected_;
148 bool received_;
149 bool closed_;
150 bool wait_for_connected_;
151 bool wait_for_received_;
152 bool wait_for_closed_;
153 PP_Instance instance_;
154 };
155
156 } // namespace
157
44 REGISTER_TEST_CASE(WebSocket); 158 REGISTER_TEST_CASE(WebSocket);
45 159
46 bool TestWebSocket::Init() { 160 bool TestWebSocket::Init() {
47 websocket_interface_ = static_cast<const PPB_WebSocket_Dev*>( 161 websocket_interface_ = static_cast<const PPB_WebSocket_Dev*>(
48 pp::Module::Get()->GetBrowserInterface(PPB_WEBSOCKET_DEV_INTERFACE)); 162 pp::Module::Get()->GetBrowserInterface(PPB_WEBSOCKET_DEV_INTERFACE));
49 var_interface_ = static_cast<const PPB_Var*>( 163 var_interface_ = static_cast<const PPB_Var*>(
50 pp::Module::Get()->GetBrowserInterface(PPB_VAR_INTERFACE)); 164 pp::Module::Get()->GetBrowserInterface(PPB_VAR_INTERFACE));
51 core_interface_ = static_cast<const PPB_Core*>( 165 core_interface_ = static_cast<const PPB_Core*>(
52 pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); 166 pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE));
53 if (!websocket_interface_ || !var_interface_ || !core_interface_) 167 if (!websocket_interface_ || !var_interface_ || !core_interface_)
54 return false; 168 return false;
55 169
56 return InitTestingInterface(); 170 return InitTestingInterface();
57 } 171 }
58 172
59 void TestWebSocket::RunTests(const std::string& filter) { 173 void TestWebSocket::RunTests(const std::string& filter) {
60 RUN_TEST_WITH_REFERENCE_CHECK(IsWebSocket, filter); 174 RUN_TEST_WITH_REFERENCE_CHECK(IsWebSocket, filter);
61 RUN_TEST_WITH_REFERENCE_CHECK(UninitializedPropertiesAccess, filter); 175 RUN_TEST_WITH_REFERENCE_CHECK(UninitializedPropertiesAccess, filter);
62 RUN_TEST_WITH_REFERENCE_CHECK(InvalidConnect, filter); 176 RUN_TEST_WITH_REFERENCE_CHECK(InvalidConnect, filter);
63 RUN_TEST_WITH_REFERENCE_CHECK(Protocols, filter); 177 RUN_TEST_WITH_REFERENCE_CHECK(Protocols, filter);
64 RUN_TEST_WITH_REFERENCE_CHECK(GetURL, filter); 178 RUN_TEST_WITH_REFERENCE_CHECK(GetURL, filter);
65 RUN_TEST_WITH_REFERENCE_CHECK(ValidConnect, filter); 179 RUN_TEST_WITH_REFERENCE_CHECK(ValidConnect, filter);
66 RUN_TEST_WITH_REFERENCE_CHECK(InvalidClose, filter); 180 RUN_TEST_WITH_REFERENCE_CHECK(InvalidClose, filter);
67 RUN_TEST_WITH_REFERENCE_CHECK(ValidClose, filter); 181 RUN_TEST_WITH_REFERENCE_CHECK(ValidClose, filter);
68 RUN_TEST_WITH_REFERENCE_CHECK(GetProtocol, filter); 182 RUN_TEST_WITH_REFERENCE_CHECK(GetProtocol, filter);
69 RUN_TEST_WITH_REFERENCE_CHECK(TextSendReceive, filter); 183 RUN_TEST_WITH_REFERENCE_CHECK(TextSendReceive, filter);
70 184
71 RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter); 185 RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter);
186
187 RUN_TEST_WITH_REFERENCE_CHECK(HelperInvalidConnect, filter);
188 RUN_TEST_WITH_REFERENCE_CHECK(HelperProtocols, filter);
189 RUN_TEST_WITH_REFERENCE_CHECK(HelperGetURL, filter);
190 RUN_TEST_WITH_REFERENCE_CHECK(HelperValidConnect, filter);
191 RUN_TEST_WITH_REFERENCE_CHECK(HelperInvalidClose, filter);
192 RUN_TEST_WITH_REFERENCE_CHECK(HelperValidClose, filter);
193 RUN_TEST_WITH_REFERENCE_CHECK(HelperGetProtocol, filter);
194 RUN_TEST_WITH_REFERENCE_CHECK(HelperTextSendReceive, filter);
72 } 195 }
73 196
74 PP_Var TestWebSocket::CreateVar(const char* string) { 197 PP_Var TestWebSocket::CreateVar(const char* string) {
75 return var_interface_->VarFromUtf8(string, strlen(string)); 198 return var_interface_->VarFromUtf8(string, strlen(string));
76 } 199 }
77 200
78 void TestWebSocket::ReleaseVar(const PP_Var& var) { 201 void TestWebSocket::ReleaseVar(const PP_Var& var) {
79 var_interface_->Release(var); 202 var_interface_->Release(var);
80 } 203 }
81 204
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 539
417 // TODO(toyoshim): Add tests for GetBufferedAmount(). 540 // TODO(toyoshim): Add tests for GetBufferedAmount().
418 // For now, the function doesn't work fine because update callback in WebKit is 541 // For now, the function doesn't work fine because update callback in WebKit is
419 // not landed yet. 542 // not landed yet.
420 543
421 // TODO(toyoshim): Add tests for didReceiveMessageError(). 544 // TODO(toyoshim): Add tests for didReceiveMessageError().
422 545
423 // TODO(toyoshim): Add other function tests. 546 // TODO(toyoshim): Add other function tests.
424 547
425 std::string TestWebSocket::TestCcInterfaces() { 548 std::string TestWebSocket::TestCcInterfaces() {
426 // C++ bindings is simple straightforward, then just verifies interfaces work 549 // The C++ bindings is simple straightforward. This just verifies that the
427 // as a interface bridge fine. 550 // bindings work fine as an interface bridge.
428 pp::WebSocket_Dev ws(instance_); 551 pp::WebSocket_Dev ws(instance_);
429 552
430 // Check uninitialized properties access. 553 // Check uninitialized properties access.
431 ASSERT_EQ(0, ws.GetBufferedAmount()); 554 ASSERT_EQ(0, ws.GetBufferedAmount());
432 ASSERT_EQ(0, ws.GetCloseCode()); 555 ASSERT_EQ(0, ws.GetCloseCode());
433 ASSERT_TRUE(AreEqual(ws.GetCloseReason().pp_var(), "")); 556 ASSERT_TRUE(AreEqual(ws.GetCloseReason().pp_var(), ""));
434 ASSERT_EQ(false, ws.GetCloseWasClean()); 557 ASSERT_EQ(false, ws.GetCloseWasClean());
435 ASSERT_TRUE(AreEqual(ws.GetExtensions().pp_var(), "")); 558 ASSERT_TRUE(AreEqual(ws.GetExtensions().pp_var(), ""));
436 ASSERT_TRUE(AreEqual(ws.GetProtocol().pp_var(), "")); 559 ASSERT_TRUE(AreEqual(ws.GetProtocol().pp_var(), ""));
437 ASSERT_EQ(PP_WEBSOCKETREADYSTATE_INVALID_DEV, ws.GetReadyState()); 560 ASSERT_EQ(PP_WEBSOCKETREADYSTATE_INVALID_DEV, ws.GetReadyState());
438 ASSERT_TRUE(AreEqual(ws.GetURL().pp_var(), "")); 561 ASSERT_TRUE(AreEqual(ws.GetURL().pp_var(), ""));
439 562
440 // Check communication interfaces (connect, send, receive, and close). 563 // Check communication interfaces (connect, send, receive, and close).
441 TestCompletionCallback connect_callback(instance_->pp_instance()); 564 TestCompletionCallback connect_callback(instance_->pp_instance());
442 int32_t result = ws.Connect(pp::Var(std::string(kCloseServerURL)), NULL, 0U, 565 int32_t result = ws.Connect(
443 connect_callback); 566 pp::Var(std::string(kCloseServerURL)), NULL, 0U, connect_callback);
444 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); 567 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
445 result = connect_callback.WaitForResult(); 568 result = connect_callback.WaitForResult();
446 ASSERT_EQ(PP_OK, result); 569 ASSERT_EQ(PP_OK, result);
447 570
448 std::string message("hello C++"); 571 std::string message("hello C++");
449 result = ws.SendMessage(pp::Var(message)); 572 result = ws.SendMessage(pp::Var(message));
450 ASSERT_EQ(PP_OK, result); 573 ASSERT_EQ(PP_OK, result);
451 574
452 pp::Var receive_var; 575 pp::Var receive_var;
453 TestCompletionCallback receive_callback(instance_->pp_instance()); 576 TestCompletionCallback receive_callback(instance_->pp_instance());
(...skipping 15 matching lines...) Expand all
469 ASSERT_EQ(kCloseCodeNormalClosure, ws.GetCloseCode()); 592 ASSERT_EQ(kCloseCodeNormalClosure, ws.GetCloseCode());
470 ASSERT_TRUE(AreEqual(ws.GetCloseReason().pp_var(), reason.c_str())); 593 ASSERT_TRUE(AreEqual(ws.GetCloseReason().pp_var(), reason.c_str()));
471 ASSERT_EQ(true, ws.GetCloseWasClean()); 594 ASSERT_EQ(true, ws.GetCloseWasClean());
472 ASSERT_TRUE(AreEqual(ws.GetExtensions().pp_var(), "")); 595 ASSERT_TRUE(AreEqual(ws.GetExtensions().pp_var(), ""));
473 ASSERT_TRUE(AreEqual(ws.GetProtocol().pp_var(), "")); 596 ASSERT_TRUE(AreEqual(ws.GetProtocol().pp_var(), ""));
474 ASSERT_EQ(PP_WEBSOCKETREADYSTATE_CLOSED_DEV, ws.GetReadyState()); 597 ASSERT_EQ(PP_WEBSOCKETREADYSTATE_CLOSED_DEV, ws.GetReadyState());
475 ASSERT_TRUE(AreEqual(ws.GetURL().pp_var(), kCloseServerURL)); 598 ASSERT_TRUE(AreEqual(ws.GetURL().pp_var(), kCloseServerURL));
476 599
477 PASS(); 600 PASS();
478 } 601 }
602
603 std::string TestWebSocket::TestHelperInvalidConnect() {
604 const pp::Var protocols[] = { pp::Var() };
605
606 TestWebSocketAPI websocket(instance_);
607 int32_t result = websocket.Connect(pp::Var(), protocols, 1U);
608 ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
609 ASSERT_EQ(0U, websocket.GetSeenEvents().size());
610
611 result = websocket.Connect(pp::Var(), protocols, 1U);
612 ASSERT_EQ(PP_ERROR_INPROGRESS, result);
613 ASSERT_EQ(0U, websocket.GetSeenEvents().size());
614
615 for (int i = 0; kInvalidURLs[i]; ++i) {
616 TestWebSocketAPI ws(instance_);
617 result = ws.Connect(pp::Var(std::string(kInvalidURLs[i])), protocols, 0U);
618 ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
619 ASSERT_EQ(0U, ws.GetSeenEvents().size());
620 }
621
622 PASS();
623 }
624
625 std::string TestWebSocket::TestHelperProtocols() {
626 const pp::Var bad_protocols[] = {
627 pp::Var(std::string("x-test")), pp::Var(std::string("x-test")) };
628 const pp::Var good_protocols[] = {
629 pp::Var(std::string("x-test")), pp::Var(std::string("x-yatest")) };
630
631 {
632 TestWebSocketAPI websocket(instance_);
633 int32_t result = websocket.Connect(
634 pp::Var(std::string(kEchoServerURL)), bad_protocols, 2U);
635 ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
636 ASSERT_EQ(0U, websocket.GetSeenEvents().size());
637 }
638
639 {
640 TestWebSocketAPI websocket(instance_);
641 int32_t result = websocket.Connect(
642 pp::Var(std::string(kEchoServerURL)), good_protocols, 2U);
643 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
644 websocket.WaitForConnected();
645 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
646 // Protocol arguments are valid, but this test run without a WebSocket
647 // server. As a result, OnError() and OnClose() are invoked because of
648 // a connection establishment failure.
649 ASSERT_EQ(2U, events.size());
650 ASSERT_EQ(WebSocketEvent::EVENT_ERROR, events[0].event_type);
651 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[1].event_type);
652 ASSERT_FALSE(events[1].was_clean);
653 }
654
655 PASS();
656 }
657
658 std::string TestWebSocket::TestHelperGetURL() {
659 const pp::Var protocols[] = { pp::Var() };
660
661 for (int i = 0; kInvalidURLs[i]; ++i) {
662 TestWebSocketAPI websocket(instance_);
663 int32_t result = websocket.Connect(
664 pp::Var(std::string(kInvalidURLs[i])), protocols, 0U);
665 ASSERT_EQ(PP_ERROR_BADARGUMENT, result);
666 pp::Var url = websocket.GetURL();
667 ASSERT_TRUE(AreEqual(url.pp_var(), kInvalidURLs[i]));
668 ASSERT_EQ(0U, websocket.GetSeenEvents().size());
669 }
670
671 PASS();
672 }
673
674 std::string TestWebSocket::TestHelperValidConnect() {
675 const pp::Var protocols[] = { pp::Var() };
676 TestWebSocketAPI websocket(instance_);
677 int32_t result = websocket.Connect(
678 pp::Var(std::string(kEchoServerURL)), protocols, 0U);
679 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
680 websocket.WaitForConnected();
681 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
682 ASSERT_EQ(1U, events.size());
683 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[0].event_type);
684
685 PASS();
686 }
687
688 std::string TestWebSocket::TestHelperInvalidClose() {
689 const pp::Var reason = pp::Var(std::string("close for test"));
690
691 // Close before connect.
692 {
693 TestWebSocketAPI websocket(instance_);
694 int32_t result = websocket.Close(kCloseCodeNormalClosure, reason);
695 ASSERT_EQ(PP_ERROR_FAILED, result);
696 ASSERT_EQ(0U, websocket.GetSeenEvents().size());
697 }
698
699 // Close with bad arguments.
700 {
701 TestWebSocketAPI websocket(instance_);
702 int32_t result = websocket.Connect(pp::Var(std::string(kEchoServerURL)),
703 NULL, 0);
704 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
705 websocket.WaitForConnected();
706 result = websocket.Close(1U, reason);
707 ASSERT_EQ(PP_ERROR_NOACCESS, result);
708 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
709 ASSERT_EQ(1U, events.size());
710 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[0].event_type);
711 }
712
713 PASS();
714 }
715
716 std::string TestWebSocket::TestHelperValidClose() {
717 std::string reason("close for test");
718 pp::Var url = pp::Var(std::string(kCloseServerURL));
719
720 // Close.
721 {
722 TestWebSocketAPI websocket(instance_);
723 int32_t result = websocket.Connect(url, NULL, 0U);
724 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
725 websocket.WaitForConnected();
726 result = websocket.Close(kCloseCodeNormalClosure, pp::Var(reason));
727 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
728 websocket.WaitForClosed();
729 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
730 ASSERT_EQ(2U, events.size());
731 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[0].event_type);
732 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[1].event_type);
733 ASSERT_TRUE(events[1].was_clean);
734 ASSERT_EQ(kCloseCodeNormalClosure, events[1].close_code);
735 ASSERT_TRUE(AreEqual(events[1].var.pp_var(), reason.c_str()));
736 }
737
738 // Close in connecting.
739 // The ongoing connect failed with PP_ERROR_ABORTED, then the close is done
740 // successfully.
741 {
742 TestWebSocketAPI websocket(instance_);
743 int32_t result = websocket.Connect(url, NULL, 0U);
744 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
745 result = websocket.Close(kCloseCodeNormalClosure, pp::Var(reason));
746 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
747 websocket.WaitForClosed();
748 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
749 ASSERT_TRUE(events.size() == 2 || events.size() == 3);
750 int index = 0;
751 if (events.size() == 3)
752 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[index++].event_type);
753 ASSERT_EQ(WebSocketEvent::EVENT_ERROR, events[index++].event_type);
754 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[index].event_type);
755 ASSERT_FALSE(events[index].was_clean);
756 }
757
758 // Close in closing.
759 // The first close will be done successfully, then the second one failed with
760 // with PP_ERROR_INPROGRESS immediately.
761 {
762 TestWebSocketAPI websocket(instance_);
763 int32_t result = websocket.Connect(url, NULL, 0U);
764 result = websocket.Close(kCloseCodeNormalClosure, pp::Var(reason));
765 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
766 result = websocket.Close(kCloseCodeNormalClosure, pp::Var(reason));
767 ASSERT_EQ(PP_ERROR_INPROGRESS, result);
768 websocket.WaitForClosed();
769 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
770 ASSERT_TRUE(events.size() == 2 || events.size() == 3)
771 int index = 0;
772 if (events.size() == 3)
773 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[index++].event_type);
774 ASSERT_EQ(WebSocketEvent::EVENT_ERROR, events[index++].event_type);
775 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[index].event_type);
776 ASSERT_FALSE(events[index].was_clean);
777 }
778
779 PASS();
780 }
781
782 std::string TestWebSocket::TestHelperGetProtocol() {
783 const std::string protocol("x-chat");
784 const pp::Var protocols[] = { pp::Var(protocol) };
785 std::string url(kProtocolTestServerURL);
786 url += protocol;
787 TestWebSocketAPI websocket(instance_);
788 int32_t result = websocket.Connect(pp::Var(url), protocols, 1U);
789 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
790 websocket.WaitForReceived();
791 ASSERT_TRUE(AreEqual(websocket.GetProtocol().pp_var(), protocol.c_str()));
792 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
793 ASSERT_EQ(2U, events.size());
794 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[0].event_type);
795 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[1].event_type);
dmichael (off chromium) 2011/12/16 16:11:10 Why do you receive a message here? Can you documen
Takashi Toyoshima 2011/12/19 05:14:01 OK, I added comments on server side handler behavi
796 ASSERT_TRUE(AreEqual(events[1].var.pp_var(), protocol.c_str()));
797 ASSERT_TRUE(events[1].was_clean);
798
799 PASS();
800 }
801
802 std::string TestWebSocket::TestHelperTextSendReceive() {
803 const pp::Var protocols[] = { pp::Var() };
804 TestWebSocketAPI websocket(instance_);
805 int32_t result =
806 websocket.Connect(pp::Var(std::string(kEchoServerURL)), protocols, 0U);
807 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
808 websocket.WaitForConnected();
809
810 // Send 'hello pepper'.
811 std::string message1("hello pepper");
812 result = websocket.Send(pp::Var(std::string(message1)));
813 ASSERT_EQ(PP_OK, result);
814
815 // Receive echoed 'hello pepper'.
816 websocket.WaitForReceived();
817
818 // Send 'goodbye pepper'.
819 std::string message2("goodbye pepper");
820 result = websocket.Send(pp::Var(std::string(message2)));
821
822 // Receive echoed 'goodbye pepper'.
823 websocket.WaitForReceived();
824
825 const std::vector<WebSocketEvent>& events = websocket.GetSeenEvents();
826 ASSERT_EQ(3U, events.size());
827 ASSERT_EQ(WebSocketEvent::EVENT_OPEN, events[0].event_type);
828 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[1].event_type);
829 ASSERT_TRUE(AreEqual(events[1].var.pp_var(), message1.c_str()));
830 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[2].event_type);
831 ASSERT_TRUE(AreEqual(events[2].var.pp_var(), message2.c_str()));
832
833 PASS();
834 }
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