diff options
author | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-26 11:13:29 +0000 |
---|---|---|
committer | toyoshim@chromium.org <toyoshim@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-26 11:13:29 +0000 |
commit | 3f915fae62435f901f520286c7afeddb26644549 (patch) | |
tree | 3dd97ab7c1a7230132cd21251ea99e27fcd5ce3e /ppapi/tests/test_websocket.cc | |
parent | 146180a4bf9d9a75288f88d902dc14540f28f3dc (diff) | |
download | chromium_src-3f915fae62435f901f520286c7afeddb26644549.zip chromium_src-3f915fae62435f901f520286c7afeddb26644549.tar.gz chromium_src-3f915fae62435f901f520286c7afeddb26644549.tar.bz2 |
WebSocket Pepper API: fix data corruption at ReceiveMessage in NaCl
PpbWebSocketRpcServer::PPB_WebSocket_ReceiveMessage sometime gets unexpected
synchronous PP_OK result on PPBWebSocketInterface calling. Receiving data is
passed only in completion callbacks. Then, it causes data corruption.
This CL fix this issue and in order to reproduce this synchronous PP_OK situation,
add one stress test, StressedSendReceive.
This CL also fix CcInterface test flakiness on Mac.
BUG=111636
TEST=browser_tests --test_filter='PPAPI*Test.WebSocket_CcInterfaces'; browser_tests --test_filter='PPAPI*Test.WebSocket_StressedSendReceive'
Review URL: http://codereview.chromium.org/9724007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128890 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/tests/test_websocket.cc')
-rw-r--r-- | ppapi/tests/test_websocket.cc | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc index 1992e3e..69502a1 100644 --- a/ppapi/tests/test_websocket.cc +++ b/ppapi/tests/test_websocket.cc @@ -196,6 +196,7 @@ void TestWebSocket::RunTests(const std::string& filter) { RUN_TEST_WITH_REFERENCE_CHECK(GetProtocol, filter); RUN_TEST_WITH_REFERENCE_CHECK(TextSendReceive, filter); RUN_TEST_WITH_REFERENCE_CHECK(BinarySendReceive, filter); + RUN_TEST_WITH_REFERENCE_CHECK(StressedSendReceive, filter); RUN_TEST_WITH_REFERENCE_CHECK(BufferedAmount, filter); RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter); @@ -637,6 +638,54 @@ std::string TestWebSocket::TestBinarySendReceive() { PASS(); } +std::string TestWebSocket::TestStressedSendReceive() { + // Connect to test echo server. + int32_t connect_result; + PP_Resource ws = Connect(GetFullURL(kEchoServerURL), &connect_result, ""); + ASSERT_TRUE(ws); + ASSERT_EQ(PP_OK, connect_result); + + // Prepare PP_Var objects to send. + const char* text = "hello pepper"; + PP_Var text_var = CreateVarString(text); + std::vector<uint8_t> binary(256); + for (uint32_t i = 0; i < binary.size(); ++i) + binary[i] = i; + PP_Var binary_var = CreateVarBinary(binary); + + // Send many messages. + for (int i = 0; i < 256; ++i) { + int32_t result = websocket_interface_->SendMessage(ws, text_var); + ASSERT_EQ(PP_OK, result); + result = websocket_interface_->SendMessage(ws, binary_var); + ASSERT_EQ(PP_OK, result); + } + ReleaseVar(text_var); + ReleaseVar(binary_var); + + // Receive echoed data. + for (int i = 0; i < 512; ++i) { + TestCompletionCallback callback(instance_->pp_instance(), force_async_); + PP_Var received_message; + int32_t result = websocket_interface_->ReceiveMessage( + ws, &received_message, static_cast<pp::CompletionCallback>( + callback).pp_completion_callback()); + ASSERT_TRUE(result == PP_OK || result == PP_OK_COMPLETIONPENDING); + if (result == PP_OK_COMPLETIONPENDING) + result = callback.WaitForResult(); + ASSERT_EQ(PP_OK, result); + if (i & 1) { + ASSERT_TRUE(AreEqualWithBinary(received_message, binary)); + } else { + ASSERT_TRUE(AreEqualWithString(received_message, text)); + } + ReleaseVar(received_message); + } + core_interface_->ReleaseResource(ws); + + PASS(); +} + std::string TestWebSocket::TestBufferedAmount() { // Connect to test echo server. int32_t connect_result; |