@@ -19,6 +19,17 @@ import 'js_interop_mocks/adsense_test_js_interop.dart';
19
19
const String testClient = 'test_client' ;
20
20
const String testSlot = 'test_slot' ;
21
21
22
+ class CallbackTracker {
23
+ void Function () createCallback () {
24
+ final int callbackIndex = _callbackStates.length;
25
+ _callbackStates.add (false );
26
+ return () => _callbackStates[callbackIndex] = true ;
27
+ }
28
+
29
+ bool get allCalled => _callbackStates.every ((bool state) => state);
30
+ final List <bool > _callbackStates = < bool > [];
31
+ }
32
+
22
33
void main () async {
23
34
IntegrationTestWidgetsFlutterBinding .ensureInitialized ();
24
35
@@ -47,15 +58,17 @@ void main() async {
47
58
48
59
await adSense.initialize (testClient);
49
60
61
+ final CallbackTracker tracker = CallbackTracker ();
50
62
final Widget adUnitWidget = AdUnitWidget (
51
63
configuration: AdUnitConfiguration .displayAdUnit (
52
64
adSlot: testSlot,
53
65
adFormat: AdFormat .AUTO , // Important!
54
66
),
55
67
adClient: adSense.adClient,
68
+ onInjected: tracker.createCallback (),
56
69
);
57
70
58
- await pumpAdWidget (adUnitWidget, tester);
71
+ await pumpAdWidget (adUnitWidget, tester, tracker );
59
72
60
73
// Then
61
74
// Widget level
@@ -81,19 +94,21 @@ void main() async {
81
94
82
95
await adSense.initialize (testClient);
83
96
97
+ final CallbackTracker tracker = CallbackTracker ();
84
98
final Widget adUnitWidget = AdUnitWidget (
85
99
configuration: AdUnitConfiguration .displayAdUnit (
86
100
adSlot: testSlot,
87
101
),
88
102
adClient: adSense.adClient,
103
+ onInjected: tracker.createCallback (),
89
104
);
90
105
91
106
final Widget constrainedAd = Container (
92
107
constraints: constraints,
93
108
child: adUnitWidget,
94
109
);
95
110
96
- await pumpAdWidget (constrainedAd, tester);
111
+ await pumpAdWidget (constrainedAd, tester, tracker );
97
112
98
113
// Then
99
114
// Widget level
@@ -110,14 +125,17 @@ void main() async {
110
125
mockAdsByGoogle (mockAd (adStatus: AdStatus .UNFILLED ));
111
126
112
127
await adSense.initialize (testClient);
128
+
129
+ final CallbackTracker tracker = CallbackTracker ();
113
130
final Widget adUnitWidget = AdUnitWidget (
114
131
configuration: AdUnitConfiguration .displayAdUnit (
115
132
adSlot: testSlot,
116
133
),
117
134
adClient: adSense.adClient,
135
+ onInjected: tracker.createCallback (),
118
136
);
119
137
120
- await pumpAdWidget (adUnitWidget, tester);
138
+ await pumpAdWidget (adUnitWidget, tester, tracker );
121
139
122
140
// Then
123
141
expect (find.byType (HtmlElementView ), findsNothing,
@@ -142,6 +160,7 @@ void main() async {
142
160
143
161
await adSense.initialize (testClient);
144
162
163
+ final CallbackTracker tracker = CallbackTracker ();
145
164
final Widget bunchOfAds = Column (
146
165
children: < Widget > [
147
166
AdUnitWidget (
@@ -150,13 +169,15 @@ void main() async {
150
169
adFormat: AdFormat .AUTO ,
151
170
),
152
171
adClient: adSense.adClient,
172
+ onInjected: tracker.createCallback (),
153
173
),
154
174
AdUnitWidget (
155
175
configuration: AdUnitConfiguration .displayAdUnit (
156
176
adSlot: testSlot,
157
177
adFormat: AdFormat .AUTO ,
158
178
),
159
179
adClient: adSense.adClient,
180
+ onInjected: tracker.createCallback (),
160
181
),
161
182
Container (
162
183
constraints: const BoxConstraints (maxHeight: 100 ),
@@ -165,12 +186,13 @@ void main() async {
165
186
adSlot: testSlot,
166
187
),
167
188
adClient: adSense.adClient,
189
+ onInjected: tracker.createCallback (),
168
190
),
169
191
),
170
192
],
171
193
);
172
194
173
- await pumpAdWidget (bunchOfAds, tester);
195
+ await pumpAdWidget (bunchOfAds, tester, tracker );
174
196
175
197
// Then
176
198
// Widget level
@@ -192,7 +214,8 @@ void main() async {
192
214
}
193
215
194
216
// Pumps an AdUnit Widget into a given tester, with some parameters
195
- Future <void > pumpAdWidget (Widget adUnit, WidgetTester tester) async {
217
+ Future <void > pumpAdWidget (
218
+ Widget adUnit, WidgetTester tester, CallbackTracker tracker) async {
196
219
await tester.pumpWidget (
197
220
MaterialApp (
198
221
home: Scaffold (
@@ -203,10 +226,14 @@ Future<void> pumpAdWidget(Widget adUnit, WidgetTester tester) async {
203
226
),
204
227
);
205
228
206
- // This extra pump is needed for the platform view to actually render in the DOM.
207
- await tester.pump ();
208
- // One more for skwasm.
209
- await tester.pump ();
229
+ final Stopwatch timer = Stopwatch ()..start ();
230
+ while (! tracker.allCalled) {
231
+ if (timer.elapsedMilliseconds > 1000 ) {
232
+ fail ('timeout while waiting for ad widget to be injected' );
233
+ }
234
+ // Pump until all the widgets have had their platform views injected into the dom.
235
+ await tester.pump ();
236
+ }
210
237
// This extra pump is needed to simulate the async behavior of the adsense JS mock.
211
238
await tester.pumpAndSettle ();
212
239
}
0 commit comments