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

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

Issue 10661026: WebSocket Pepper API: allow to release in completion callbacks (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add another unit test Created 8 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « ppapi/tests/test_utils.cc ('k') | webkit/plugins/ppapi/ppb_websocket_impl.cc » ('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 (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
10 #include <algorithm> 10 #include <algorithm>
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 enum EventType { 61 enum EventType {
62 EVENT_OPEN, 62 EVENT_OPEN,
63 EVENT_MESSAGE, 63 EVENT_MESSAGE,
64 EVENT_ERROR, 64 EVENT_ERROR,
65 EVENT_CLOSE 65 EVENT_CLOSE
66 }; 66 };
67 67
68 WebSocketEvent(EventType type, 68 WebSocketEvent(EventType type,
69 bool was_clean, 69 bool was_clean,
70 uint16_t close_code, 70 uint16_t close_code,
71 const pp::Var& var) 71 const pp::Var& var,
72 int32_t result)
72 : event_type(type), 73 : event_type(type),
73 was_clean(was_clean), 74 was_clean(was_clean),
74 close_code(close_code), 75 close_code(close_code),
75 var(var) { 76 var(var),
77 result(result) {
76 } 78 }
77 EventType event_type; 79 EventType event_type;
78 bool was_clean; 80 bool was_clean;
79 uint16_t close_code; 81 uint16_t close_code;
80 pp::Var var; 82 pp::Var var;
83 int32_t result;
84 };
85
86 class CallbackChecker {
87 public:
88 class CallbackDelegate : public TestCompletionCallback::Delegate {
89 public:
90 explicit CallbackDelegate(CallbackChecker* owner,
91 WebSocketEvent::EventType type,
92 bool release)
93 : owner_(owner),
94 type_(type),
95 release_(release) {
96 }
97
98 // TestCompletionCallback::Delegate implementation.
99 virtual void OnCallback(void* user_data, int32_t result) {
100 owner_->RecordCallback(type_, result);
101 if (release_)
102 owner_->ReleaseResource();
103 }
104
105 private:
106 CallbackChecker* owner_;
107 WebSocketEvent::EventType type_;
108 bool release_;
109 };
110
111 explicit CallbackChecker(const PPB_Core* core_interface,
112 PP_Resource resource)
113 : core_interface_(core_interface),
114 resource_(resource) {
115 }
116
117 ~CallbackChecker() {
118 for (std::vector<CallbackDelegate*>::iterator it = delegates_.begin();
119 it < delegates_.end(); it++)
120 delete *it;
121 }
122
123 CallbackDelegate* GetDelegateFor(WebSocketEvent::EventType type,
dmichael (off chromium) 2012/06/27 19:52:17 I don't think you need CallbackChecker (see below)
124 bool release) {
125 delegates_.push_back(new CallbackDelegate(this, type, release));
126 return delegates_.back();
127 }
128
129 const std::vector<WebSocketEvent>& GetSeenEvents() const {
130 return events_;
131 }
132
133 void RecordCallback(WebSocketEvent::EventType type, int32_t result) {
134 events_.push_back(WebSocketEvent(type, true, 0U, pp::Var(), result));
135 }
136
137 void ReleaseResource() {
138 core_interface_->ReleaseResource(resource_);
139 }
140
141 private:
142 const PPB_Core* core_interface_;
143 PP_Resource resource_;
144 std::vector<WebSocketEvent> events_;
145 std::vector<CallbackDelegate*> delegates_;
81 }; 146 };
82 147
83 class TestWebSocketAPI : public pp::WebSocketAPI { 148 class TestWebSocketAPI : public pp::WebSocketAPI {
84 public: 149 public:
85 explicit TestWebSocketAPI(pp::Instance* instance) 150 explicit TestWebSocketAPI(pp::Instance* instance)
86 : pp::WebSocketAPI(instance), 151 : pp::WebSocketAPI(instance),
87 connected_(false), 152 connected_(false),
88 received_(false), 153 received_(false),
89 closed_(false), 154 closed_(false),
90 wait_for_connected_(false), 155 wait_for_connected_(false),
91 wait_for_received_(false), 156 wait_for_received_(false),
92 wait_for_closed_(false), 157 wait_for_closed_(false),
93 instance_(instance->pp_instance()) { 158 instance_(instance->pp_instance()) {
94 } 159 }
95 160
96 virtual void WebSocketDidOpen() { 161 virtual void WebSocketDidOpen() {
97 events_.push_back( 162 events_.push_back(
98 WebSocketEvent(WebSocketEvent::EVENT_OPEN, true, 0U, pp::Var())); 163 WebSocketEvent(WebSocketEvent::EVENT_OPEN, true, 0U, pp::Var(), 0));
99 connected_ = true; 164 connected_ = true;
100 if (wait_for_connected_) { 165 if (wait_for_connected_) {
101 GetTestingInterface()->QuitMessageLoop(instance_); 166 GetTestingInterface()->QuitMessageLoop(instance_);
102 wait_for_connected_ = false; 167 wait_for_connected_ = false;
103 } 168 }
104 } 169 }
105 170
106 virtual void WebSocketDidClose( 171 virtual void WebSocketDidClose(
107 bool was_clean, uint16_t code, const pp::Var& reason) { 172 bool was_clean, uint16_t code, const pp::Var& reason) {
108 events_.push_back( 173 events_.push_back(WebSocketEvent(
109 WebSocketEvent(WebSocketEvent::EVENT_CLOSE, was_clean, code, reason)); 174 WebSocketEvent::EVENT_CLOSE, was_clean, code, reason, 0));
110 connected_ = true; 175 connected_ = true;
111 closed_ = true; 176 closed_ = true;
112 if (wait_for_connected_ || wait_for_closed_) { 177 if (wait_for_connected_ || wait_for_closed_) {
113 GetTestingInterface()->QuitMessageLoop(instance_); 178 GetTestingInterface()->QuitMessageLoop(instance_);
114 wait_for_connected_ = false; 179 wait_for_connected_ = false;
115 wait_for_closed_ = false; 180 wait_for_closed_ = false;
116 } 181 }
117 } 182 }
118 183
119 virtual void HandleWebSocketMessage(const pp::Var &message) { 184 virtual void HandleWebSocketMessage(const pp::Var &message) {
120 events_.push_back( 185 events_.push_back(
121 WebSocketEvent(WebSocketEvent::EVENT_MESSAGE, true, 0U, message)); 186 WebSocketEvent(WebSocketEvent::EVENT_MESSAGE, true, 0U, message, 0));
122 received_ = true; 187 received_ = true;
123 if (wait_for_received_) { 188 if (wait_for_received_) {
124 GetTestingInterface()->QuitMessageLoop(instance_); 189 GetTestingInterface()->QuitMessageLoop(instance_);
125 wait_for_received_ = false; 190 wait_for_received_ = false;
126 received_ = false; 191 received_ = false;
127 } 192 }
128 } 193 }
129 194
130 virtual void HandleWebSocketError() { 195 virtual void HandleWebSocketError() {
131 events_.push_back( 196 events_.push_back(
132 WebSocketEvent(WebSocketEvent::EVENT_ERROR, true, 0U, pp::Var())); 197 WebSocketEvent(WebSocketEvent::EVENT_ERROR, true, 0U, pp::Var(), 0));
133 } 198 }
134 199
135 void WaitForConnected() { 200 void WaitForConnected() {
136 if (!connected_) { 201 if (!connected_) {
137 wait_for_connected_ = true; 202 wait_for_connected_ = true;
138 GetTestingInterface()->RunMessageLoop(instance_); 203 GetTestingInterface()->RunMessageLoop(instance_);
139 } 204 }
140 } 205 }
141 206
142 void WaitForReceived() { 207 void WaitForReceived() {
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after
931 TestCompletionCallback receive_callback( 996 TestCompletionCallback receive_callback(
932 instance_->pp_instance(), callback_type()); 997 instance_->pp_instance(), callback_type());
933 result = websocket_interface_->ReceiveMessage( 998 result = websocket_interface_->ReceiveMessage(
934 ws, &receive_var, 999 ws, &receive_var,
935 receive_callback.GetCallback().pp_completion_callback()); 1000 receive_callback.GetCallback().pp_completion_callback());
936 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); 1001 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
937 core_interface_->ReleaseResource(ws); 1002 core_interface_->ReleaseResource(ws);
938 receive_callback.WaitForResult(result); 1003 receive_callback.WaitForResult(result);
939 ASSERT_EQ(PP_ERROR_ABORTED, receive_callback.result()); 1004 ASSERT_EQ(PP_ERROR_ABORTED, receive_callback.result());
940 1005
1006 // Release the resource in the close completion callback.
1007 ws = Connect(url, &result, "");
1008 ASSERT_TRUE(ws);
1009 ASSERT_EQ(PP_OK, result);
1010 result = websocket_interface_->Close(
1011 ws, PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeUndefined(),
1012 close_callback.GetCallback().pp_completion_callback());
1013 CallbackChecker close_checker(core_interface_, ws);
1014 close_callback.SetDelegate(close_checker.GetDelegateFor(
1015 WebSocketEvent::EVENT_CLOSE, true));
1016 close_callback.WaitForResult(result);
1017 CHECK_CALLBACK_BEHAVIOR(close_callback);
1018 ASSERT_EQ(PP_OK, close_callback.result());
1019
1020 const std::vector<WebSocketEvent>& close_events =
1021 close_checker.GetSeenEvents();
1022 ASSERT_EQ(1U, close_events.size());
1023 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, close_events[0].event_type);
1024 ASSERT_EQ(PP_OK, close_events[0].result);
dmichael (off chromium) 2012/06/27 19:52:17 I'm having trouble understanding why you wanted th
Takashi Toyoshima 2012/06/28 08:05:37 Ah... you are right. Firstly, I'd like to check wh
1025
1026 // Release the resource in the aborting receive completion callback which is
1027 // introduced by calling Close().
1028 ws = Connect(url, &result, "");
1029 ASSERT_TRUE(ws);
1030 ASSERT_EQ(PP_OK, result);
1031 CallbackChecker receive_checker(core_interface_, ws);
1032 result = websocket_interface_->ReceiveMessage(
1033 ws, &receive_var,
1034 receive_callback.GetCallback().pp_completion_callback());
1035 receive_callback.SetDelegate(receive_checker.GetDelegateFor(
1036 WebSocketEvent::EVENT_MESSAGE, true));
1037 result = websocket_interface_->Close(
1038 ws, PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE, PP_MakeUndefined(),
1039 close_callback.GetCallback().pp_completion_callback());
1040 close_callback.SetDelegate(receive_checker.GetDelegateFor(
1041 WebSocketEvent::EVENT_CLOSE, false));
1042 receive_callback.WaitForResult(result);
1043 CHECK_CALLBACK_BEHAVIOR(receive_callback);
1044 ASSERT_EQ(PP_ERROR_ABORTED, receive_callback.result());
1045 close_callback.WaitForResult(result);
1046 CHECK_CALLBACK_BEHAVIOR(close_callback);
1047 ASSERT_EQ(PP_ERROR_ABORTED, close_callback.result());
1048
1049 const std::vector<WebSocketEvent>& receive_events =
1050 receive_checker.GetSeenEvents();
1051 ASSERT_EQ(2U, receive_events.size());
1052 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, receive_events[0].event_type);
1053 ASSERT_EQ(PP_ERROR_ABORTED, receive_events[0].result);
1054 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, receive_events[1].event_type);
1055 ASSERT_EQ(PP_ERROR_ABORTED, receive_events[1].result);
1056
941 // Test the behavior where receive process might be in-flight. 1057 // Test the behavior where receive process might be in-flight.
942 const char* text = "yukarin"; 1058 const char* text = "yukarin";
943 PP_Var text_var = CreateVarString(text); 1059 PP_Var text_var = CreateVarString(text);
944 1060
945 // Each trial sends 17 messages and receives just |trial| number of 1061 // Each trial sends 17 messages and receives just |trial| number of
946 // message(s) before releasing the WebSocket. The WebSocket is released while 1062 // message(s) before releasing the WebSocket. The WebSocket is released while
947 // the next message is going to be received. 1063 // the next message is going to be received.
948 for (int trial = 1; trial <= 16; trial++) { 1064 for (int trial = 1; trial <= 16; trial++) {
949 ws = Connect(url, &result, ""); 1065 ws = Connect(url, &result, "");
950 ASSERT_TRUE(ws); 1066 ASSERT_TRUE(ws);
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
1407 size_t last_event = events_on_closed - 1; 1523 size_t last_event = events_on_closed - 1;
1408 for (uint32_t i = 1; i < last_event; ++i) { 1524 for (uint32_t i = 1; i < last_event; ++i) {
1409 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[i].event_type); 1525 ASSERT_EQ(WebSocketEvent::EVENT_MESSAGE, events[i].event_type);
1410 ASSERT_TRUE(AreEqualWithString(events[i].var.pp_var(), message)); 1526 ASSERT_TRUE(AreEqualWithString(events[i].var.pp_var(), message));
1411 } 1527 }
1412 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[last_event].event_type); 1528 ASSERT_EQ(WebSocketEvent::EVENT_CLOSE, events[last_event].event_type);
1413 ASSERT_TRUE(events[last_event].was_clean); 1529 ASSERT_TRUE(events[last_event].was_clean);
1414 1530
1415 PASS(); 1531 PASS();
1416 } 1532 }
OLDNEW
« no previous file with comments | « ppapi/tests/test_utils.cc ('k') | webkit/plugins/ppapi/ppb_websocket_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698