|
1 #include "TestShutdown.h" |
|
2 |
|
3 namespace mozilla { |
|
4 namespace _ipdltest { |
|
5 |
|
6 //----------------------------------------------------------------------------- |
|
7 // Parent side |
|
8 void |
|
9 TestShutdownParent::Main() |
|
10 { |
|
11 if (!SendStart()) |
|
12 fail("sending Start()"); |
|
13 } |
|
14 |
|
15 void |
|
16 TestShutdownParent::ActorDestroy(ActorDestroyReason why) |
|
17 { |
|
18 if (AbnormalShutdown != why) |
|
19 fail("should have ended test with crash!"); |
|
20 |
|
21 passed("ok"); |
|
22 |
|
23 QuitParent(); |
|
24 } |
|
25 |
|
26 void |
|
27 TestShutdownSubParent::ActorDestroy(ActorDestroyReason why) |
|
28 { |
|
29 if (Manager()->ManagedPTestShutdownSubParent().Length() == 0) |
|
30 fail("manager should still have managees!"); |
|
31 |
|
32 if (mExpectCrash && AbnormalShutdown != why) |
|
33 fail("expected crash!"); |
|
34 else if (!mExpectCrash && AbnormalShutdown == why) |
|
35 fail("wasn't expecting crash!"); |
|
36 |
|
37 if (mExpectCrash && 0 == ManagedPTestShutdownSubsubParent().Length()) |
|
38 fail("expected to *still* have kids"); |
|
39 } |
|
40 |
|
41 void |
|
42 TestShutdownSubsubParent::ActorDestroy(ActorDestroyReason why) |
|
43 { |
|
44 if (Manager()->ManagedPTestShutdownSubsubParent().Length() == 0) |
|
45 fail("manager should still have managees!"); |
|
46 |
|
47 if (mExpectParentDeleted && AncestorDeletion != why) |
|
48 fail("expected ParentDeleted == why"); |
|
49 else if (!mExpectParentDeleted && AncestorDeletion == why) |
|
50 fail("wasn't expecting parent delete"); |
|
51 } |
|
52 |
|
53 //----------------------------------------------------------------------------- |
|
54 // Child side |
|
55 |
|
56 bool |
|
57 TestShutdownChild::RecvStart() |
|
58 { |
|
59 // test 1: alloc some actors and subactors, delete in |
|
60 // managee-before-manager order |
|
61 { |
|
62 bool expectCrash = false, expectParentDeleted = false; |
|
63 |
|
64 PTestShutdownSubChild* c1 = |
|
65 SendPTestShutdownSubConstructor(expectCrash); |
|
66 if (!c1) |
|
67 fail("problem sending ctor"); |
|
68 |
|
69 PTestShutdownSubChild* c2 = |
|
70 SendPTestShutdownSubConstructor(expectCrash); |
|
71 if (!c2) |
|
72 fail("problem sending ctor"); |
|
73 |
|
74 PTestShutdownSubsubChild* c1s1 = |
|
75 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
76 if (!c1s1) |
|
77 fail("problem sending ctor"); |
|
78 PTestShutdownSubsubChild* c1s2 = |
|
79 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
80 if (!c1s2) |
|
81 fail("problem sending ctor"); |
|
82 |
|
83 PTestShutdownSubsubChild* c2s1 = |
|
84 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
85 if (!c2s1) |
|
86 fail("problem sending ctor"); |
|
87 PTestShutdownSubsubChild* c2s2 = |
|
88 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
89 if (!c2s2) |
|
90 fail("problem sending ctor"); |
|
91 |
|
92 if (!PTestShutdownSubsubChild::Send__delete__(c1s1)) |
|
93 fail("problem sending dtor"); |
|
94 if (!PTestShutdownSubsubChild::Send__delete__(c1s2)) |
|
95 fail("problem sending dtor"); |
|
96 if (!PTestShutdownSubsubChild::Send__delete__(c2s1)) |
|
97 fail("problem sending dtor"); |
|
98 if (!PTestShutdownSubsubChild::Send__delete__(c2s2)) |
|
99 fail("problem sending dtor"); |
|
100 |
|
101 if (!c1->CallStackFrame()) |
|
102 fail("problem creating dummy stack frame"); |
|
103 if (!c2->CallStackFrame()) |
|
104 fail("problem creating dummy stack frame"); |
|
105 } |
|
106 |
|
107 // test 2: alloc some actors and subactors, delete managers first |
|
108 { |
|
109 bool expectCrash = false, expectParentDeleted = true; |
|
110 |
|
111 PTestShutdownSubChild* c1 = |
|
112 SendPTestShutdownSubConstructor(expectCrash); |
|
113 if (!c1) |
|
114 fail("problem sending ctor"); |
|
115 |
|
116 PTestShutdownSubChild* c2 = |
|
117 SendPTestShutdownSubConstructor(expectCrash); |
|
118 if (!c2) |
|
119 fail("problem sending ctor"); |
|
120 |
|
121 PTestShutdownSubsubChild* c1s1 = |
|
122 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
123 if (!c1s1) |
|
124 fail("problem sending ctor"); |
|
125 PTestShutdownSubsubChild* c1s2 = |
|
126 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
127 if (!c1s2) |
|
128 fail("problem sending ctor"); |
|
129 |
|
130 PTestShutdownSubsubChild* c2s1 = |
|
131 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
132 if (!c2s1) |
|
133 fail("problem sending ctor"); |
|
134 PTestShutdownSubsubChild* c2s2 = |
|
135 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
136 if (!c2s2) |
|
137 fail("problem sending ctor"); |
|
138 |
|
139 // delete parents without deleting kids |
|
140 if (!c1->CallStackFrame()) |
|
141 fail("problem creating dummy stack frame"); |
|
142 if (!c2->CallStackFrame()) |
|
143 fail("problem creating dummy stack frame"); |
|
144 } |
|
145 |
|
146 // test 3: alloc some actors and subactors, then crash |
|
147 { |
|
148 bool expectCrash = true, expectParentDeleted = false; |
|
149 |
|
150 PTestShutdownSubChild* c1 = |
|
151 SendPTestShutdownSubConstructor(expectCrash); |
|
152 if (!c1) |
|
153 fail("problem sending ctor"); |
|
154 |
|
155 PTestShutdownSubChild* c2 = |
|
156 SendPTestShutdownSubConstructor(expectCrash); |
|
157 if (!c2) |
|
158 fail("problem sending ctor"); |
|
159 |
|
160 PTestShutdownSubsubChild* c1s1 = |
|
161 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
162 if (!c1s1) |
|
163 fail("problem sending ctor"); |
|
164 PTestShutdownSubsubChild* c1s2 = |
|
165 c1->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
166 if (!c1s2) |
|
167 fail("problem sending ctor"); |
|
168 |
|
169 PTestShutdownSubsubChild* c2s1 = |
|
170 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
171 if (!c2s1) |
|
172 fail("problem sending ctor"); |
|
173 PTestShutdownSubsubChild* c2s2 = |
|
174 c2->SendPTestShutdownSubsubConstructor(expectParentDeleted); |
|
175 if (!c2s2) |
|
176 fail("problem sending ctor"); |
|
177 |
|
178 // make sure the ctors have been processed by the other side; |
|
179 // the write end of the socket may temporarily be unwriteable |
|
180 if (!SendSync()) |
|
181 fail("can't synchronize with parent"); |
|
182 |
|
183 // "crash", but without tripping tinderbox assert/abort |
|
184 // detectors |
|
185 _exit(0); |
|
186 } |
|
187 } |
|
188 |
|
189 void |
|
190 TestShutdownChild::ActorDestroy(ActorDestroyReason why) |
|
191 { |
|
192 fail("hey wait ... we should have crashed!"); |
|
193 } |
|
194 |
|
195 bool |
|
196 TestShutdownSubChild::AnswerStackFrame() |
|
197 { |
|
198 if (!PTestShutdownSubChild::Send__delete__(this)) |
|
199 fail("problem sending dtor"); |
|
200 |
|
201 // WATCH OUT! |this| has just deleted |
|
202 |
|
203 return true; |
|
204 } |
|
205 |
|
206 void |
|
207 TestShutdownSubChild::ActorDestroy(ActorDestroyReason why) |
|
208 { |
|
209 if (Manager()->ManagedPTestShutdownSubChild().Length() == 0) |
|
210 fail("manager should still have managees!"); |
|
211 |
|
212 if (mExpectCrash && AbnormalShutdown != why) |
|
213 fail("expected crash!"); |
|
214 else if (!mExpectCrash && AbnormalShutdown == why) |
|
215 fail("wasn't expecting crash!"); |
|
216 |
|
217 if (mExpectCrash && 0 == ManagedPTestShutdownSubsubChild().Length()) |
|
218 fail("expected to *still* have kids"); |
|
219 } |
|
220 |
|
221 void |
|
222 TestShutdownSubsubChild::ActorDestroy(ActorDestroyReason why) |
|
223 { |
|
224 if (Manager()->ManagedPTestShutdownSubsubChild().Length() == 0) |
|
225 fail("manager should still have managees!"); |
|
226 |
|
227 if (mExpectParentDeleted && AncestorDeletion != why) |
|
228 fail("expected ParentDeleted == why"); |
|
229 else if (!mExpectParentDeleted && AncestorDeletion == why) |
|
230 fail("wasn't expecting parent delete"); |
|
231 } |
|
232 |
|
233 |
|
234 } // namespace _ipdltest |
|
235 } // namespace mozilla |