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