summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
blob: 76defe97a56a4c54677118e878af399e855bbdf3 (plain)
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include "TestRaceDeadlock.h"

#include "IPDLUnitTests.h"  // fail etc.

// #define TEST_TIMEOUT 5000

using namespace mozilla::ipc;
typedef mozilla::ipc::MessageChannel::Message Message;
typedef mozilla::ipc::MessageChannel::MessageInfo MessageInfo;

namespace mozilla {
namespace _ipdltest {

static RacyInterruptPolicy MediateRace(const MessageInfo& parent,
                                       const MessageInfo& child) {
  return (PTestRaceDeadlock::Msg_Win__ID == parent.type()) ? RIPParentWins
                                                           : RIPChildWins;
}

//-----------------------------------------------------------------------------
// parent

TestRaceDeadlockParent::TestRaceDeadlockParent() {
  MOZ_COUNT_CTOR(TestRaceDeadlockParent);
}

TestRaceDeadlockParent::~TestRaceDeadlockParent() {
  MOZ_COUNT_DTOR(TestRaceDeadlockParent);
}

void TestRaceDeadlockParent::Main() {
  Test1();

  Close();
}

bool TestRaceDeadlockParent::ShouldContinueFromReplyTimeout() {
  fail("This test should not hang");
  GetIPCChannel()->CloseWithTimeout();
  return false;
}

void TestRaceDeadlockParent::Test1() {
#if defined(TEST_TIMEOUT)
  SetReplyTimeoutMs(TEST_TIMEOUT);
#endif
  if (!SendStartRace()) {
    fail("sending StartRace");
  }
  if (!CallRpc()) {
    fail("calling Rpc");
  }
}

mozilla::ipc::IPCResult TestRaceDeadlockParent::AnswerLose() {
  return IPC_OK();
}

RacyInterruptPolicy TestRaceDeadlockParent::MediateInterruptRace(
    const MessageInfo& parent, const MessageInfo& child) {
  return MediateRace(parent, child);
}

//-----------------------------------------------------------------------------
// child

TestRaceDeadlockChild::TestRaceDeadlockChild() {
  MOZ_COUNT_CTOR(TestRaceDeadlockChild);
}

TestRaceDeadlockChild::~TestRaceDeadlockChild() {
  MOZ_COUNT_DTOR(TestRaceDeadlockChild);
}

mozilla::ipc::IPCResult TestRaceDeadlockParent::RecvStartRace() {
  if (!CallWin()) {
    fail("calling Win");
  }
  return IPC_OK();
}

mozilla::ipc::IPCResult TestRaceDeadlockChild::RecvStartRace() {
  if (!SendStartRace()) {
    fail("calling SendStartRace");
  }
  if (!CallLose()) {
    fail("calling Lose");
  }
  return IPC_OK();
}

mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerWin() { return IPC_OK(); }

mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerRpc() { return IPC_OK(); }

RacyInterruptPolicy TestRaceDeadlockChild::MediateInterruptRace(
    const MessageInfo& parent, const MessageInfo& child) {
  return MediateRace(parent, child);
}

}  // namespace _ipdltest
}  // namespace mozilla