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 10 namespace mojo { 11 namespace test { 12 13 bool 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 24 bool 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 61 bool 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 67 void 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