Index: ppapi/tests/test_transport.cc |
diff --git a/ppapi/tests/test_transport.cc b/ppapi/tests/test_transport.cc |
deleted file mode 100644 |
index d8bb134029b10c37d683fa464f73eb11df59208e..0000000000000000000000000000000000000000 |
--- a/ppapi/tests/test_transport.cc |
+++ /dev/null |
@@ -1,373 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "ppapi/tests/test_transport.h" |
- |
-#include <stdlib.h> |
-#include <string.h> |
- |
-#include <list> |
-#include <map> |
- |
-#include "ppapi/c/dev/ppb_testing_dev.h" |
-#include "ppapi/c/pp_errors.h" |
-#include "ppapi/c/pp_macros.h" |
-#include "ppapi/cpp/dev/transport_dev.h" |
-#include "ppapi/cpp/instance.h" |
-#include "ppapi/cpp/module.h" |
-#include "ppapi/cpp/var.h" |
-#include "ppapi/tests/test_utils.h" |
-#include "ppapi/tests/testing_instance.h" |
-#include "ppapi/utility/completion_callback_factory.h" |
- |
-REGISTER_TEST_CASE(Transport); |
- |
-namespace { |
- |
-const char kTestChannelName[] = "test"; |
-const int kReadBufferSize = 65536; |
- |
-class StreamReader { |
- public: |
- StreamReader(pp::Transport_Dev* transport, |
- int expected_size, |
- pp::CompletionCallback done_callback) |
- : expected_size_(expected_size), |
- done_callback_(done_callback), |
- PP_ALLOW_THIS_IN_INITIALIZER_LIST(callback_factory_(this)), |
- transport_(transport), |
- received_size_(0) { |
- Read(); |
- } |
- |
- const std::list<std::vector<char> >& received() { return received_; } |
- std::list<std::string> errors() { return errors_; } |
- |
- private: |
- void Read() { |
- while (true) { |
- buffer_.resize(kReadBufferSize); |
- int result = transport_->Recv( |
- &buffer_[0], buffer_.size(), |
- callback_factory_.NewOptionalCallback(&StreamReader::OnReadFinished)); |
- if (result > 0) |
- DidFinishRead(result); |
- else |
- break; |
- } |
- } |
- |
- void OnReadFinished(int result) { |
- DidFinishRead(result); |
- if (result > 0) |
- Read(); |
- } |
- |
- void DidFinishRead(int result) { |
- if (result > 0) { |
- if (result > static_cast<int>(buffer_.size())) { |
- errors_.push_back(TestCase::MakeFailureMessage( |
- __FILE__, __LINE__, |
- "Recv() returned value that is bigger than the buffer.")); |
- } |
- buffer_.resize(result); |
- received_.push_back(buffer_); |
- received_size_ += buffer_.size(); |
- if (received_size_ >= expected_size_) |
- done_callback_.Run(0); |
- } |
- } |
- |
- int expected_size_; |
- pp::CompletionCallback done_callback_; |
- pp::CompletionCallbackFactory<StreamReader> callback_factory_; |
- pp::Transport_Dev* transport_; |
- std::vector<char> buffer_; |
- std::list<std::vector<char> > received_; |
- int received_size_; |
- std::list<std::string> errors_; |
-}; |
- |
-} // namespace |
- |
-TestTransport::~TestTransport() { |
- delete transport1_; |
- delete transport2_; |
-} |
- |
-bool TestTransport::Init() { |
- transport_interface_ = static_cast<const PPB_Transport_Dev*>( |
- pp::Module::Get()->GetBrowserInterface(PPB_TRANSPORT_DEV_INTERFACE)); |
- return transport_interface_ && CheckTestingInterface(); |
-} |
- |
-void TestTransport::RunTests(const std::string& filter) { |
- RUN_TEST(Create, filter); |
- RUN_TEST_FORCEASYNC_AND_NOT(Connect, filter); |
- RUN_TEST(SetProperty, filter); |
- RUN_TEST_FORCEASYNC_AND_NOT(SendDataUdp, filter); |
- RUN_TEST_FORCEASYNC_AND_NOT(SendDataTcp, filter); |
- RUN_TEST_FORCEASYNC_AND_NOT(ConnectAndCloseUdp, filter); |
- RUN_TEST_FORCEASYNC_AND_NOT(ConnectAndCloseTcp, filter); |
-} |
- |
-std::string TestTransport::InitTargets(PP_TransportType type) { |
- transport1_ = new pp::Transport_Dev(instance_, kTestChannelName, type); |
- transport2_ = new pp::Transport_Dev(instance_, kTestChannelName, type); |
- |
- ASSERT_NE(NULL, transport1_); |
- ASSERT_NE(NULL, transport2_); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::Connect() { |
- TestCompletionCallback connect_cb1(instance_->pp_instance()); |
- TestCompletionCallback connect_cb2(instance_->pp_instance()); |
- ASSERT_EQ(transport1_->Connect(connect_cb1), PP_OK_COMPLETIONPENDING); |
- ASSERT_EQ(transport2_->Connect(connect_cb2), PP_OK_COMPLETIONPENDING); |
- |
- pp::Var address1; |
- pp::Var address2; |
- TestCompletionCallback next_address_cb1(instance_->pp_instance()); |
- TestCompletionCallback next_address_cb2(instance_->pp_instance()); |
- ASSERT_EQ(transport1_->GetNextAddress(&address1, next_address_cb1), |
- PP_OK_COMPLETIONPENDING); |
- ASSERT_EQ(transport2_->GetNextAddress(&address2, next_address_cb2), |
- PP_OK_COMPLETIONPENDING); |
- ASSERT_EQ(next_address_cb1.WaitForResult(), PP_OK); |
- ASSERT_EQ(next_address_cb2.WaitForResult(), PP_OK); |
- ASSERT_EQ(transport1_->GetNextAddress(&address1, next_address_cb1), PP_OK); |
- ASSERT_EQ(transport2_->GetNextAddress(&address2, next_address_cb2), PP_OK); |
- |
- ASSERT_EQ(transport1_->ReceiveRemoteAddress(address2), PP_OK); |
- ASSERT_EQ(transport2_->ReceiveRemoteAddress(address1), PP_OK); |
- |
- |
- ASSERT_EQ(connect_cb1.WaitForResult(), PP_OK); |
- ASSERT_EQ(connect_cb2.WaitForResult(), PP_OK); |
- |
- ASSERT_TRUE(transport1_->IsWritable()); |
- ASSERT_TRUE(transport2_->IsWritable()); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::Clean() { |
- delete transport1_; |
- transport1_ = NULL; |
- delete transport2_; |
- transport2_ = NULL; |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::TestCreate() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_DATAGRAM)); |
- |
- Clean(); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::TestSetProperty() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_STREAM)); |
- |
- // Try settings STUN and Relay properties. |
- ASSERT_EQ(transport1_->SetProperty( |
- PP_TRANSPORTPROPERTY_STUN_SERVER, |
- pp::Var("stun.example.com:19302")), PP_OK); |
- |
- ASSERT_EQ(transport1_->SetProperty( |
- PP_TRANSPORTPROPERTY_RELAY_SERVER, |
- pp::Var("ralay.example.com:80")), PP_OK); |
- |
- ASSERT_EQ(transport1_->SetProperty( |
- PP_TRANSPORTPROPERTY_RELAY_USERNAME, |
- pp::Var("USERNAME")), PP_OK); |
- ASSERT_EQ(transport1_->SetProperty( |
- PP_TRANSPORTPROPERTY_RELAY_PASSWORD, |
- pp::Var("PASSWORD")), PP_OK); |
- |
- // Try changing TCP window size. |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_RECEIVE_WINDOW, |
- pp::Var(65536)), PP_OK); |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_RECEIVE_WINDOW, |
- pp::Var(10000000)), PP_ERROR_BADARGUMENT); |
- |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_SEND_WINDOW, |
- pp::Var(65536)), PP_OK); |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_SEND_WINDOW, |
- pp::Var(10000000)), PP_ERROR_BADARGUMENT); |
- |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_NO_DELAY, |
- pp::Var(true)), PP_OK); |
- |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_ACK_DELAY, |
- pp::Var(10)), PP_OK); |
- ASSERT_EQ(transport1_->SetProperty(PP_TRANSPORTPROPERTY_TCP_ACK_DELAY, |
- pp::Var(10000)), PP_ERROR_BADARGUMENT); |
- |
- TestCompletionCallback connect_cb(instance_->pp_instance()); |
- ASSERT_EQ(transport1_->Connect(connect_cb), PP_OK_COMPLETIONPENDING); |
- |
- // SetProperty() should fail after we've connected. |
- ASSERT_EQ(transport1_->SetProperty( |
- PP_TRANSPORTPROPERTY_STUN_SERVER, |
- pp::Var("stun.example.com:31323")), PP_ERROR_FAILED); |
- |
- Clean(); |
- ASSERT_EQ(connect_cb.WaitForResult(), PP_ERROR_ABORTED); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::TestConnect() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_DATAGRAM)); |
- ASSERT_SUBTEST_SUCCESS(Connect()); |
- |
- Clean(); |
- |
- PASS(); |
-} |
- |
-// Creating datagram connection and try sending data over it. Verify |
-// that at least some packets are received (some packets may be lost). |
-std::string TestTransport::TestSendDataUdp() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_DATAGRAM)); |
- ASSERT_SUBTEST_SUCCESS(Connect()); |
- |
- const int kNumPackets = 100; |
- const int kSendBufferSize = 1200; |
- const int kUdpWaitTimeMs = 1000; // 1 second. |
- |
- TestCompletionCallback done_cb(instance_->pp_instance()); |
- StreamReader reader(transport1_, kSendBufferSize * kNumPackets, done_cb); |
- |
- std::map<int, std::vector<char> > sent_packets; |
- for (int i = 0; i < kNumPackets; ++i) { |
- std::vector<char> send_buffer(kSendBufferSize); |
- for (size_t j = 0; j < send_buffer.size(); ++j) { |
- send_buffer[j] = rand() % 256; |
- } |
- // Put packet index in the beginning. |
- memcpy(&send_buffer[0], &i, sizeof(i)); |
- |
- TestCompletionCallback send_cb(instance_->pp_instance(), force_async_); |
- int32_t result = transport2_->Send(&send_buffer[0], send_buffer.size(), |
- send_cb); |
- if (force_async_) { |
- ASSERT_EQ(result, PP_OK_COMPLETIONPENDING); |
- ASSERT_EQ(send_cb.WaitForResult(), static_cast<int>(send_buffer.size())); |
- } else { |
- ASSERT_EQ(result, static_cast<int>(send_buffer.size())); |
- } |
- sent_packets[i] = send_buffer; |
- } |
- |
- // Limit waiting time. |
- TestCompletionCallback timeout_cb(instance_->pp_instance()); |
- pp::Module::Get()->core()->CallOnMainThread(kUdpWaitTimeMs, timeout_cb); |
- ASSERT_EQ(timeout_cb.WaitForResult(), PP_OK); |
- |
- ASSERT_TRUE(reader.errors().size() == 0); |
- ASSERT_TRUE(reader.received().size() > 0); |
- for (std::list<std::vector<char> >::const_iterator it = |
- reader.received().begin(); it != reader.received().end(); ++it) { |
- int index; |
- memcpy(&index, &(*it)[0], sizeof(index)); |
- ASSERT_TRUE(sent_packets[index] == *it); |
- } |
- |
- Clean(); |
- |
- PASS(); |
-} |
- |
-// Creating reliable (TCP-like) connection and try sending data over |
-// it. Verify that all data is received correctly. |
-std::string TestTransport::TestSendDataTcp() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_STREAM)); |
- ASSERT_SUBTEST_SUCCESS(Connect()); |
- |
- const int kTcpSendSize = 100000; |
- |
- TestCompletionCallback done_cb(instance_->pp_instance()); |
- StreamReader reader(transport1_, kTcpSendSize, done_cb); |
- |
- std::vector<char> send_buffer(kTcpSendSize); |
- for (size_t j = 0; j < send_buffer.size(); ++j) { |
- send_buffer[j] = rand() % 256; |
- } |
- |
- int pos = 0; |
- while (pos < static_cast<int>(send_buffer.size())) { |
- TestCompletionCallback send_cb(instance_->pp_instance(), force_async_); |
- int result = transport2_->Send( |
- &send_buffer[0] + pos, send_buffer.size() - pos, send_cb); |
- if (force_async_) |
- ASSERT_EQ(result, PP_OK_COMPLETIONPENDING); |
- if (result == PP_OK_COMPLETIONPENDING) |
- result = send_cb.WaitForResult(); |
- ASSERT_TRUE(result > 0); |
- pos += result; |
- } |
- |
- ASSERT_EQ(done_cb.WaitForResult(), PP_OK); |
- |
- ASSERT_TRUE(reader.errors().size() == 0); |
- |
- std::vector<char> received_data; |
- for (std::list<std::vector<char> >::const_iterator it = |
- reader.received().begin(); it != reader.received().end(); ++it) { |
- received_data.insert(received_data.end(), it->begin(), it->end()); |
- } |
- ASSERT_EQ(send_buffer, received_data); |
- |
- Clean(); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::TestConnectAndCloseUdp() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_DATAGRAM)); |
- ASSERT_SUBTEST_SUCCESS(Connect()); |
- |
- std::vector<char> recv_buffer(kReadBufferSize); |
- TestCompletionCallback recv_cb(instance_->pp_instance()); |
- ASSERT_EQ( |
- transport1_->Recv(&recv_buffer[0], recv_buffer.size(), recv_cb), |
- PP_OK_COMPLETIONPENDING); |
- |
- // Close the transport and verify that callback is aborted. |
- ASSERT_EQ(transport1_->Close(), PP_OK); |
- |
- ASSERT_EQ(recv_cb.run_count(), 1); |
- ASSERT_EQ(recv_cb.result(), PP_ERROR_ABORTED); |
- |
- Clean(); |
- |
- PASS(); |
-} |
- |
-std::string TestTransport::TestConnectAndCloseTcp() { |
- ASSERT_SUBTEST_SUCCESS(InitTargets(PP_TRANSPORTTYPE_STREAM)); |
- ASSERT_SUBTEST_SUCCESS(Connect()); |
- |
- std::vector<char> recv_buffer(kReadBufferSize); |
- TestCompletionCallback recv_cb(instance_->pp_instance()); |
- ASSERT_EQ( |
- transport1_->Recv(&recv_buffer[0], recv_buffer.size(), recv_cb), |
- PP_OK_COMPLETIONPENDING); |
- |
- // Close the transport and verify that callback is aborted. |
- ASSERT_EQ(transport1_->Close(), PP_OK); |
- |
- ASSERT_EQ(recv_cb.run_count(), 1); |
- ASSERT_EQ(recv_cb.result(), PP_ERROR_ABORTED); |
- |
- Clean(); |
- |
- PASS(); |
-} |