1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2013 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/test_support/test_utils.h" 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stddef.h> 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h> 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/system/core.h" 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/test_support/test_support.h" 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace test { 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool WriteTextMessage(const MessagePipeHandle& handle, 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const std::string& text) { 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MojoResult rv = WriteMessageRaw(handle, 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez text.data(), 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static_cast<uint32_t>(text.size()), 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 0, 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MOJO_WRITE_MESSAGE_FLAG_NONE); 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return rv == MOJO_RESULT_OK; 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool ReadTextMessage(const MessagePipeHandle& handle, std::string* text) { 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MojoResult rv; 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool did_wait = false; 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez uint32_t num_bytes = 0, num_handles = 0; 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (;;) { 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez rv = ReadMessageRaw(handle, 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &num_bytes, 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &num_handles, 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MOJO_READ_MESSAGE_FLAG_NONE); 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (rv == MOJO_RESULT_SHOULD_WAIT) { 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (did_wait) { 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez assert(false); // Looping endlessly!? 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez rv = Wait(handle, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr); 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (rv != MOJO_RESULT_OK) 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez did_wait = true; 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } else { 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez assert(!num_handles); 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez break; 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez text->resize(num_bytes); 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez rv = ReadMessageRaw(handle, 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &text->at(0), 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &num_bytes, 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &num_handles, 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MOJO_READ_MESSAGE_FLAG_NONE); 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return rv == MOJO_RESULT_OK; 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool DiscardMessage(const MessagePipeHandle& handle) { 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MojoResult rv = ReadMessageRaw(handle, 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr, 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MOJO_READ_MESSAGE_FLAG_MAY_DISCARD); 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return rv == MOJO_RESULT_OK; 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid IterateAndReportPerf(const char* test_name, 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const char* sub_test_name, 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PerfTestSingleIteration single_iteration, 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void* closure) { 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // TODO(vtl): These should be specifiable using command-line flags. 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static const size_t kGranularity = 100; 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez static const MojoTimeTicks kPerftestTimeMicroseconds = 3 * 1000000; 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const MojoTimeTicks start_time = GetTimeTicksNow(); 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MojoTimeTicks end_time; 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t iterations = 0; 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez do { 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < kGranularity; i++) 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez (*single_iteration)(closure); 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez iterations += kGranularity; 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez end_time = GetTimeTicksNow(); 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } while (end_time - start_time < kPerftestTimeMicroseconds); 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MojoTestSupportLogPerfResult(test_name, sub_test_name, 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 1000000.0 * iterations / (end_time - start_time), 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "iterations/second"); 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace test 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 101