1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "mojo/public/cpp/test_support/test_utils.h"
6
7#include "mojo/public/cpp/system/core.h"
8#include "mojo/public/cpp/test_support/test_support.h"
9
10namespace mojo {
11namespace test {
12
13bool WriteTextMessage(const MessagePipeHandle& handle,
14                      const std::string& text) {
15  MojoResult rv = WriteMessageRaw(handle,
16                                  text.data(),
17                                  static_cast<uint32_t>(text.size()),
18                                  NULL,
19                                  0,
20                                  MOJO_WRITE_MESSAGE_FLAG_NONE);
21  return rv == MOJO_RESULT_OK;
22}
23
24bool ReadTextMessage(const MessagePipeHandle& handle, std::string* text) {
25  MojoResult rv;
26  bool did_wait = false;
27
28  uint32_t num_bytes = 0, num_handles = 0;
29  for (;;) {
30    rv = ReadMessageRaw(handle,
31                        NULL,
32                        &num_bytes,
33                        NULL,
34                        &num_handles,
35                        MOJO_READ_MESSAGE_FLAG_NONE);
36    if (rv == MOJO_RESULT_SHOULD_WAIT) {
37      if (did_wait) {
38        assert(false);  // Looping endlessly!?
39        return false;
40      }
41      rv = Wait(handle, MOJO_HANDLE_SIGNAL_READABLE, MOJO_DEADLINE_INDEFINITE);
42      if (rv != MOJO_RESULT_OK)
43        return false;
44      did_wait = true;
45    } else {
46      assert(!num_handles);
47      break;
48    }
49  }
50
51  text->resize(num_bytes);
52  rv = ReadMessageRaw(handle,
53                      &text->at(0),
54                      &num_bytes,
55                      NULL,
56                      &num_handles,
57                      MOJO_READ_MESSAGE_FLAG_NONE);
58  return rv == MOJO_RESULT_OK;
59}
60
61bool DiscardMessage(const MessagePipeHandle& handle) {
62  MojoResult rv = ReadMessageRaw(handle, NULL, NULL, NULL, NULL,
63                                 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
64  return rv == MOJO_RESULT_OK;
65}
66
67void IterateAndReportPerf(const char* test_name,
68                          PerfTestSingleIteration single_iteration,
69                          void* closure) {
70  // TODO(vtl): These should be specifiable using command-line flags.
71  static const size_t kGranularity = 100;
72  static const MojoTimeTicks kPerftestTimeMicroseconds = 3 * 1000000;
73
74  const MojoTimeTicks start_time = GetTimeTicksNow();
75  MojoTimeTicks end_time;
76  size_t iterations = 0;
77  do {
78    for (size_t i = 0; i < kGranularity; i++)
79      (*single_iteration)(closure);
80    iterations += kGranularity;
81
82    end_time = GetTimeTicksNow();
83  } while (end_time - start_time < kPerftestTimeMicroseconds);
84
85  MojoTestSupportLogPerfResult(test_name,
86                               1000000.0 * iterations / (end_time - start_time),
87                               "iterations/second");
88}
89
90}  // namespace test
91}  // namespace mojo
92