| Index: ppapi/tests/test_websocket.cc
|
| diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc
|
| index 05310aaf1e240855b8e59e0bf9683eabec16536b..bf5c0ee15975609b8efe17376ad5c7167c3117ce 100644
|
| --- a/ppapi/tests/test_websocket.cc
|
| +++ b/ppapi/tests/test_websocket.cc
|
| @@ -17,19 +17,24 @@
|
| #include "ppapi/tests/test_utils.h"
|
| #include "ppapi/tests/testing_instance.h"
|
|
|
| -static const char kEchoServerURL[] =
|
| +const char kEchoServerURL[] =
|
| "ws://localhost:8880/websocket/tests/hybi/echo";
|
|
|
| -static const char kProtocolTestServerURL[] =
|
| +const char kProtocolTestServerURL[] =
|
| "ws://localhost:8880/websocket/tests/hybi/protocol-test?protocol=";
|
|
|
| -static const char* kInvalidURLs[] = {
|
| +const char* const kInvalidURLs[] = {
|
| "http://www.google.com/invalid_scheme",
|
| "ws://www.google.com/invalid#fragment",
|
| "ws://www.google.com:65535/invalid_port",
|
| NULL
|
| };
|
|
|
| +// Connection close code is defined in WebSocket protocol specification.
|
| +// The magic number 1000 means gracefull closure without any error.
|
| +// See section 7.4.1. of RFC 6455.
|
| +const uint16_t kCloseCodeNormalClosure = 1000;
|
| +
|
| REGISTER_TEST_CASE(WebSocket);
|
|
|
| bool TestWebSocket::Init() {
|
| @@ -51,6 +56,8 @@ void TestWebSocket::RunTests(const std::string& filter) {
|
| RUN_TEST(InvalidConnect, filter);
|
| RUN_TEST(GetURL, filter);
|
| RUN_TEST(ValidConnect, filter);
|
| + RUN_TEST(InvalidClose, filter);
|
| + RUN_TEST(ValidClose, filter);
|
| RUN_TEST(GetProtocol, filter);
|
| RUN_TEST(TextSendReceive, filter);
|
| }
|
| @@ -209,6 +216,109 @@ std::string TestWebSocket::TestValidConnect() {
|
| PASS();
|
| }
|
|
|
| +std::string TestWebSocket::TestInvalidClose() {
|
| + PP_Var reason = CreateVar("close for test");
|
| + TestCompletionCallback callback(instance_->pp_instance());
|
| +
|
| + // Close before connect.
|
| + PP_Resource ws = websocket_interface_->Create(instance_->pp_instance());
|
| + int32_t result = websocket_interface_->Close(
|
| + ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_ERROR_FAILED, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + // Close with bad arguments.
|
| + ws = Connect(kEchoServerURL, &result, NULL);
|
| + ASSERT_TRUE(ws);
|
| + ASSERT_EQ(PP_OK, result);
|
| + result = websocket_interface_->Close(ws, 1, reason,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_ERROR_NOACCESS, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + ReleaseVar(reason);
|
| +
|
| + PASS();
|
| +}
|
| +
|
| +std::string TestWebSocket::TestValidClose() {
|
| + PP_Var reason = CreateVar("close for test");
|
| + PP_Var url = CreateVar(kEchoServerURL);
|
| + PP_Var protocols[] = { PP_MakeUndefined() };
|
| + TestCompletionCallback callback(instance_->pp_instance());
|
| + TestCompletionCallback another_callback(instance_->pp_instance());
|
| +
|
| + // Close.
|
| + int32_t result;
|
| + PP_Resource ws = Connect(kEchoServerURL, &result, NULL);
|
| + ASSERT_TRUE(ws);
|
| + ASSERT_EQ(PP_OK, result);
|
| + result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + // Close in connecting.
|
| + // The ongoing connect failed with PP_ERROR_ABORTED, then the close is done
|
| + // successfully.
|
| + ws = websocket_interface_->Create(instance_->pp_instance());
|
| + result = websocket_interface_->Connect(ws, url, protocols, 0,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(
|
| + another_callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = callback.WaitForResult();
|
| + ASSERT_EQ(PP_ERROR_ABORTED, result);
|
| + result = another_callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + // Close in closing.
|
| + // The first close will be done successfully, then the second one failed with
|
| + // with PP_ERROR_INPROGRESS immediately.
|
| + ws = Connect(kEchoServerURL, &result, NULL);
|
| + ASSERT_TRUE(ws);
|
| + ASSERT_EQ(PP_OK, result);
|
| + result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(
|
| + another_callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_ERROR_INPROGRESS, result);
|
| + result = callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + // Close with ongoing receive message.
|
| + ws = Connect(kEchoServerURL, &result, NULL);
|
| + ASSERT_TRUE(ws);
|
| + ASSERT_EQ(PP_OK, result);
|
| + PP_Var receive_message_var;
|
| + result = websocket_interface_->ReceiveMessage(ws, &receive_message_var,
|
| + static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason,
|
| + static_cast<pp::CompletionCallback>(
|
| + another_callback).pp_completion_callback());
|
| + ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
|
| + result = callback.WaitForResult();
|
| + ASSERT_EQ(PP_ERROR_ABORTED, result);
|
| + result = another_callback.WaitForResult();
|
| + ASSERT_EQ(PP_OK, result);
|
| + core_interface_->ReleaseResource(ws);
|
| +
|
| + ReleaseVar(reason);
|
| + ReleaseVar(url);
|
| +
|
| + PASS();
|
| +}
|
| +
|
| std::string TestWebSocket::TestGetProtocol() {
|
| const char* expected_protocols[] = {
|
| "x-chat",
|
|
|