// Copyright 2013 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 "mojo/public/tests/test_support.h" #include "base/test/perf_log.h" #include "base/time/time.h" namespace mojo { namespace test { MessagePipe::MessagePipe() { CreateMessagePipe(&handle_0, &handle_1); } MessagePipe::~MessagePipe() { } bool WriteTextMessage(MessagePipeHandle handle, const std::string& text) { MojoResult rv = WriteMessageRaw(handle, text.data(), static_cast<uint32_t>(text.size()), NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); return rv == MOJO_RESULT_OK; } bool ReadTextMessage(MessagePipeHandle handle, std::string* text) { MojoResult rv; bool did_wait = false; uint32_t num_bytes = 0, num_handles = 0; for (;;) { rv = ReadMessageRaw(handle, NULL, &num_bytes, NULL, &num_handles, MOJO_READ_MESSAGE_FLAG_NONE); if (rv == MOJO_RESULT_NOT_FOUND) { if (did_wait) { assert(false); // Looping endlessly!? return false; } rv = Wait(handle, MOJO_WAIT_FLAG_READABLE, MOJO_DEADLINE_INDEFINITE); if (rv != MOJO_RESULT_OK) return false; did_wait = true; } else { assert(!num_handles); break; } } text->resize(num_bytes); rv = ReadMessageRaw(handle, &text->at(0), &num_bytes, NULL, &num_handles, MOJO_READ_MESSAGE_FLAG_NONE); return rv == MOJO_RESULT_OK; } void IterateAndReportPerf(const char* test_name, base::Callback<void()> single_iteration) { // TODO(vtl): These should be specifiable using command-line flags. static const size_t kGranularity = 100; static const double kPerftestTimeSeconds = 3.0; const base::TimeTicks start_time = base::TimeTicks::HighResNow(); base::TimeTicks end_time; size_t iterations = 0; do { for (size_t i = 0; i < kGranularity; i++) single_iteration.Run(); iterations += kGranularity; end_time = base::TimeTicks::HighResNow(); } while ((end_time - start_time).InSecondsF() < kPerftestTimeSeconds); base::LogPerfResult(test_name, iterations / (end_time - start_time).InSecondsF(), "iterations/second"); } MojoResult WriteEmptyMessage(const MessagePipeHandle& handle) { return WriteMessageRaw(handle, NULL, 0, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE); } MojoResult ReadEmptyMessage(const MessagePipeHandle& handle) { return ReadMessageRaw(handle, NULL, NULL, NULL, NULL, MOJO_READ_MESSAGE_FLAG_MAY_DISCARD); } } // namespace test } // namespace mojo