summaryrefslogtreecommitdiffstats
path: root/chromium/mojo/system/test_utils.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/mojo/system/test_utils.cc')
-rw-r--r--chromium/mojo/system/test_utils.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/chromium/mojo/system/test_utils.cc b/chromium/mojo/system/test_utils.cc
new file mode 100644
index 00000000000..48f109138f0
--- /dev/null
+++ b/chromium/mojo/system/test_utils.cc
@@ -0,0 +1,96 @@
+// 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/system/test_utils.h"
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/synchronization/waitable_event.h"
+#include "base/test/test_timeouts.h"
+#include "build/build_config.h"
+
+namespace mojo {
+namespace system {
+namespace test {
+
+namespace {
+
+void PostTaskAndWaitHelper(base::WaitableEvent* event,
+ const base::Closure& task) {
+ task.Run();
+ event->Signal();
+}
+
+} // namespace
+
+void PostTaskAndWait(scoped_refptr<base::TaskRunner> task_runner,
+ const tracked_objects::Location& from_here,
+ const base::Closure& task) {
+ base::WaitableEvent event(false, false);
+ task_runner->PostTask(from_here,
+ base::Bind(&PostTaskAndWaitHelper, &event, task));
+ event.Wait();
+}
+
+base::TimeDelta EpsilonTimeout() {
+ // Originally, our epsilon timeout was 10 ms, which was mostly fine but flaky
+ // on some Windows bots. I don't recall ever seeing flakes on other bots. At
+ // 30 ms tests seem reliable on Windows bots, but not at 25 ms. We'd like this
+ // timeout to be as small as possible (see the description in the .h file).
+ //
+ // Currently, |tiny_timeout()| is usually 100 ms (possibly scaled under ASAN,
+ // etc.). Based on this, set it to (usually be) 30 ms on Windows and 20 ms
+ // elsewhere.
+#if defined(OS_WIN)
+ return (TestTimeouts::tiny_timeout() * 3) / 10;
+#else
+ return (TestTimeouts::tiny_timeout() * 2) / 10;
+#endif
+}
+
+// TestIOThread ----------------------------------------------------------------
+
+TestIOThread::TestIOThread(Mode mode)
+ : io_thread_("test_io_thread"),
+ io_thread_started_(false) {
+ switch (mode) {
+ case kAutoStart:
+ Start();
+ return;
+ case kManualStart:
+ return;
+ }
+ CHECK(false) << "Invalid mode";
+}
+
+TestIOThread::~TestIOThread() {
+ Stop();
+}
+
+void TestIOThread::Start() {
+ CHECK(!io_thread_started_);
+ io_thread_started_ = true;
+ CHECK(io_thread_.StartWithOptions(
+ base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
+}
+
+void TestIOThread::Stop() {
+ // Note: It's okay to call |Stop()| even if the thread isn't running.
+ io_thread_.Stop();
+ io_thread_started_ = false;
+}
+
+void TestIOThread::PostTask(const tracked_objects::Location& from_here,
+ const base::Closure& task) {
+ task_runner()->PostTask(from_here, task);
+}
+
+void TestIOThread::PostTaskAndWait(const tracked_objects::Location& from_here,
+ const base::Closure& task) {
+ ::mojo::system::test::PostTaskAndWait(task_runner(), from_here, task);
+}
+
+} // namespace test
+} // namespace system
+} // namespace mojo