1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Use of this source code is governed by a BSD-style license that can be 385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho// found in the LICENSE file. 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/command_line.h" 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/strings/string_number_conversions.h" 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/test/perf_time_logger.h" 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/c/ppp_messaging.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/proxy/ppapi_messages.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/proxy/ppapi_proxy_test.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/proxy/serialized_var.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/shared_impl/ppapi_globals.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/shared_impl/proxy_lock.h" 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/shared_impl/var.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ppapi/shared_impl/var_tracker.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querunamespace ppapi { 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querunamespace proxy { 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querunamespace { 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querubase::WaitableEvent handle_message_called(false, false); 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid HandleMessage(PP_Instance /* instance */, PP_Var message_data) { 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ppapi::ProxyAutoLock lock; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru StringVar* string_var = StringVar::FromPPVar(message_data); 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru DCHECK(string_var); 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Retrieve the string to make sure the proxy can't "optimize away" sending 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // the actual contents of the string (e.g., by doing a lazy retrieve or 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // something). Note that this test is for performance only, and assumes 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // other tests check for correctness. 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru std::string s = string_var->value(); 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Do something simple with the string so the compiler won't complain. 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (s.length() > 0) 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru s[0] = 'a'; 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(message_data); 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru handle_message_called.Signal(); 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruPPP_Messaging ppp_messaging_mock = { 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &HandleMessage 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass PppMessagingPerfTest : public TwoWayTest { 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru public: 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru PppMessagingPerfTest() : TwoWayTest(TwoWayTest::TEST_PPP_INTERFACE) { 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru plugin().RegisterTestInterface(PPP_MESSAGING_INTERFACE, 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &ppp_messaging_mock); 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} // namespace 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Tests the performance of sending strings through the proxy. 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTEST_F(PppMessagingPerfTest, StringPerformance) { 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const PP_Instance kTestInstance = pp_instance(); 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int seed = 123; 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int string_count = 1000; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int max_string_size = 1000000; 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru CommandLine* command_line = CommandLine::ForCurrentProcess(); 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (command_line) { 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (command_line->HasSwitch("seed")) { 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::StringToInt(command_line->GetSwitchValueASCII("seed"), 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &seed); 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (command_line->HasSwitch("string_count")) { 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::StringToInt(command_line->GetSwitchValueASCII("string_count"), 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &string_count); 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (command_line->HasSwitch("max_string_size")) { 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::StringToInt(command_line->GetSwitchValueASCII("max_string_size"), 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru &max_string_size); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru srand(seed); 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::PerfTimeLogger logger("PppMessagingPerfTest.StringPerformance"); 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 0; i < string_count; ++i) { 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const std::string test_string(rand() % max_string_size, 'a'); 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru PP_Var host_string = StringVar::StringToPPVar(test_string); 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // We don't have a host-side PPP_Messaging interface; just send the message 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // directly like the proxy does. 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru host().host_dispatcher()->Send(new PpapiMsg_PPPMessaging_HandleMessage( 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ppapi::API_ID_PPP_MESSAGING, 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru kTestInstance, 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ppapi::proxy::SerializedVarSendInput(host().host_dispatcher(), 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru host_string))); 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru handle_message_called.Wait(); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(host_string); 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} // namespace proxy 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} // namespace ppapi 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru