| // 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/cpp/test_support/test_utils.h" |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "mojo/public/cpp/system/core.h" |
| #include "mojo/public/cpp/test_support/test_support.h" |
| |
| namespace mojo { |
| namespace test { |
| |
| bool WriteTextMessage(const MessagePipeHandle& handle, |
| const std::string& text) { |
| MojoResult rv = WriteMessageRaw(handle, |
| text.data(), |
| static_cast<uint32_t>(text.size()), |
| nullptr, |
| 0, |
| MOJO_WRITE_MESSAGE_FLAG_NONE); |
| return rv == MOJO_RESULT_OK; |
| } |
| |
| bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text) { |
| MojoResult rv; |
| bool did_wait = false; |
| |
| uint32_t num_bytes = 0, num_handles = 0; |
| for (;;) { |
| rv = ReadMessageRaw(handle, |
| nullptr, |
| &num_bytes, |
| nullptr, |
| &num_handles, |
| MOJO_READ_MESSAGE_FLAG_NONE); |
| if (rv == MOJO_RESULT_SHOULD_WAIT) { |
| if (did_wait) { |
| assert(false); // Looping endlessly!? |
| return false; |
| } |
| rv = Wait(handle, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE, |
| nullptr); |
| 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, |
| nullptr, |
| &num_handles, |
| MOJO_READ_MESSAGE_FLAG_NONE); |
| return rv == MOJO_RESULT_OK; |
| } |
| |
| bool DiscardMessage(const MessagePipeHandle& handle) { |
| MojoResult rv = ReadMessageRaw(handle, |
| nullptr, |
| nullptr, |
| nullptr, |
| nullptr, |
| MOJO_READ_MESSAGE_FLAG_MAY_DISCARD); |
| return rv == MOJO_RESULT_OK; |
| } |
| |
| void IterateAndReportPerf(const char* test_name, |
| const char* sub_test_name, |
| PerfTestSingleIteration single_iteration, |
| void* closure) { |
| // TODO(vtl): These should be specifiable using command-line flags. |
| static const size_t kGranularity = 100; |
| static const MojoTimeTicks kPerftestTimeMicroseconds = 3 * 1000000; |
| |
| const MojoTimeTicks start_time = GetTimeTicksNow(); |
| MojoTimeTicks end_time; |
| size_t iterations = 0; |
| do { |
| for (size_t i = 0; i < kGranularity; i++) |
| (*single_iteration)(closure); |
| iterations += kGranularity; |
| |
| end_time = GetTimeTicksNow(); |
| } while (end_time - start_time < kPerftestTimeMicroseconds); |
| |
| MojoTestSupportLogPerfResult(test_name, sub_test_name, |
| 1000000.0 * iterations / (end_time - start_time), |
| "iterations/second"); |
| } |
| |
| } // namespace test |
| } // namespace mojo |