Index: ppapi/tests/test_websocket.cc |
diff --git a/ppapi/tests/test_websocket.cc b/ppapi/tests/test_websocket.cc |
index 311ce84e7bf1a46d085bffe30fa90670d9f7b31f..28b56b2a1c2e5bc741914fcf49dc27d227af5280 100644 |
--- a/ppapi/tests/test_websocket.cc |
+++ b/ppapi/tests/test_websocket.cc |
@@ -42,6 +42,10 @@ const char* const kInvalidURLs[] = { |
// See section 7.4.1. of RFC 6455. |
const uint16_t kCloseCodeNormalClosure = 1000U; |
+// Internal packet sizes. |
+const uint64_t kCloseFrameSize = 6; |
+const uint64_t kMessageFrameOverhead = 6; |
+ |
REGISTER_TEST_CASE(WebSocket); |
bool TestWebSocket::Init() { |
@@ -73,6 +77,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(BufferedAmount, filter); |
RUN_TEST_WITH_REFERENCE_CHECK(CcInterfaces, filter); |
} |
@@ -476,13 +481,67 @@ std::string TestWebSocket::TestBinarySendReceive() { |
PASS(); |
} |
-// TODO(toyoshim): Add tests for GetBufferedAmount(). |
-// For now, the function doesn't work fine because update callback in WebKit is |
-// not landed yet. |
+std::string TestWebSocket::TestBufferedAmount() { |
+ // Connect to test echo server. |
+ int32_t connect_result; |
+ PP_Resource ws = Connect(kEchoServerURL, &connect_result, NULL); |
+ ASSERT_TRUE(ws); |
+ ASSERT_EQ(PP_OK, connect_result); |
+ |
+ // Prepare a large message unfitting internal buffer sizes. |
dmichael (off chromium)
2012/01/11 05:01:57
"unfitting" -> "that is too big for the"
Takashi Toyoshima
2012/01/11 05:50:29
Actually, the internal buffer size is 32K, so 8K f
|
+ char message[8194]; |
+ memset(message, 'x', 8193); |
+ message[8193] = 0; |
+ PP_Var message_var = CreateVarString(message); |
+ |
+ uint64_t buffered_amount = 0; |
+ int32_t result; |
+ for (int i = 0; i < 100; i++) { |
+ result = websocket_interface_->SendMessage(ws, message_var); |
+ ASSERT_EQ(PP_OK, result); |
+ buffered_amount = websocket_interface_->GetBufferedAmount(ws); |
+ if (buffered_amount > 262144) |
dmichael (off chromium)
2012/01/11 05:01:57
Can you document this magic number?
Takashi Toyoshima
2012/01/11 05:50:29
Done.
|
+ break; |
+ } |
+ |
+ // Close connection. |
+ PP_Var reason = CreateVarString("close in busy"); |
dmichael (off chromium)
2012/01/11 05:01:57
Did you mean "close while busy"?
Takashi Toyoshima
2012/01/11 05:50:29
Yes.
I fixed it.
|
+ TestCompletionCallback callback(instance_->pp_instance()); |
+ result = websocket_interface_->Close(ws, kCloseCodeNormalClosure, reason, |
+ static_cast<pp::CompletionCallback>(callback).pp_completion_callback()); |
+ ASSERT_EQ(PP_OK_COMPLETIONPENDING, result); |
+ ASSERT_EQ(PP_WEBSOCKETREADYSTATE_CLOSING_DEV, |
+ websocket_interface_->GetReadyState(ws)); |
+ |
+ result = callback.WaitForResult(); |
+ ASSERT_EQ(PP_OK, result); |
+ ASSERT_EQ(PP_WEBSOCKETREADYSTATE_CLOSED_DEV, |
+ websocket_interface_->GetReadyState(ws)); |
+ |
+ uint64_t base_buffered_amount = websocket_interface_->GetBufferedAmount(ws); |
-// TODO(toyoshim): Add tests for didReceiveMessageError(). |
+ // After connection closure, all sending requests fail and just increase |
+ // the bufferedAmount property. |
+ PP_Var empty_string = CreateVarString(""); |
+ result = websocket_interface_->SendMessage(ws, empty_string); |
+ ASSERT_EQ(PP_ERROR_FAILED, result); |
+ buffered_amount = websocket_interface_->GetBufferedAmount(ws); |
+ ASSERT_EQ(base_buffered_amount + kMessageFrameOverhead, buffered_amount); |
+ base_buffered_amount = buffered_amount; |
-// TODO(toyoshim): Add other function tests. |
+ result = websocket_interface_->SendMessage(ws, reason); |
+ ASSERT_EQ(PP_ERROR_FAILED, result); |
+ buffered_amount = websocket_interface_->GetBufferedAmount(ws); |
+ uint64_t reason_frame_size = kMessageFrameOverhead + 13; |
dmichael (off chromium)
2012/01/11 05:01:57
Please determine the size programmatically. E.g. a
Takashi Toyoshima
2012/01/11 05:50:29
That's nice.
I fixed.
|
+ ASSERT_EQ(base_buffered_amount + reason_frame_size, buffered_amount); |
+ |
+ ReleaseVar(message_var); |
+ ReleaseVar(reason); |
+ ReleaseVar(empty_string); |
+ core_interface_->ReleaseResource(ws); |
+ |
+ PASS(); |
+} |
std::string TestWebSocket::TestCcInterfaces() { |
// C++ bindings is simple straightforward, then just verifies interfaces work |