1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
// 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"
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. So I bumped it up to 30 ms, which made things
// reliable. Currently, |tiny_timeout()| is 100 ms, which means that this will
// be 25 ms, which will hopefully be okay.
return TestTimeouts::tiny_timeout() / 4;
}
// 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
|