Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

[webview_flutter] Maybe fix flakiness of integration tests #6223

Merged
merged 11 commits into from
Aug 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ import 'package:webview_flutter/webview_flutter.dart';
Future<void> main() async {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();

const bool _skipDueToIssue86757 = true;

final HttpServer server = await HttpServer.bind(InternetAddress.anyIPv4, 0);
server.forEach((HttpRequest request) {
if (request.uri.path == '/hello.txt') {
Expand All @@ -45,10 +43,10 @@ Future<void> main() async {
final String secondaryUrl = '$prefixUrl/secondary.txt';
final String headersUrl = '$prefixUrl/headers';

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('initialUrl', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
final Completer<void> pageFinishedCompleter = Completer<void>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
Expand All @@ -58,18 +56,22 @@ Future<void> main() async {
onWebViewCreated: (WebViewController controller) {
controllerCompleter.complete(controller);
},
onPageFinished: pageFinishedCompleter.complete,
),
),
);

final WebViewController controller = await controllerCompleter.future;
await pageFinishedCompleter.future;

final String? currentUrl = await controller.currentUrl();
expect(currentUrl, primaryUrl);
}, skip: _skipDueToIssue86757);
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('loadUrl', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
final StreamController<String> pageLoads = StreamController<String>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
Expand All @@ -79,14 +81,20 @@ Future<void> main() async {
onWebViewCreated: (WebViewController controller) {
controllerCompleter.complete(controller);
},
onPageFinished: (String url) {
pageLoads.add(url);
},
),
),
);
final WebViewController controller = await controllerCompleter.future;

await controller.loadUrl(secondaryUrl);
final String? currentUrl = await controller.currentUrl();
expect(currentUrl, secondaryUrl);
}, skip: _skipDueToIssue86757);
await expectLater(
pageLoads.stream.firstWhere((String url) => url == secondaryUrl),
completion(secondaryUrl),
);
});

testWidgets('evaluateJavascript', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Expand All @@ -110,7 +118,6 @@ Future<void> main() async {
expect(result, equals('2'));
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('loadUrl with headers', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
Expand Down Expand Up @@ -149,15 +156,14 @@ Future<void> main() async {
final String content = await controller
.runJavascriptReturningResult('document.documentElement.innerText');
expect(content.contains('flutter_test_header'), isTrue);
}, skip: Platform.isAndroid && _skipDueToIssue86757);
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('JavascriptChannel', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
final Completer<void> pageStarted = Completer<void>();
final Completer<void> pageLoaded = Completer<void>();
final List<String> messagesReceived = <String>[];
final Completer<String> channelCompleter = Completer<String>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
Expand All @@ -174,7 +180,7 @@ Future<void> main() async {
JavascriptChannel(
name: 'Echo',
onMessageReceived: (JavascriptMessage message) {
messagesReceived.add(message.message);
channelCompleter.complete(message.message);
},
),
},
Expand All @@ -191,10 +197,11 @@ Future<void> main() async {
await pageStarted.future;
await pageLoaded.future;

expect(messagesReceived, isEmpty);
expect(channelCompleter.isCompleted, isFalse);
await controller.runJavascript('Echo.postMessage("hello");');
expect(messagesReceived, equals(<String>['hello']));
}, skip: Platform.isAndroid && _skipDueToIssue86757);

await expectLater(channelCompleter.future, completion('hello'));
});

testWidgets('resize webview', (WidgetTester tester) async {
final Completer<void> initialResizeCompleter = Completer<void>();
Expand Down Expand Up @@ -263,7 +270,6 @@ Future<void> main() async {
expect(customUserAgent2, 'Custom_User_Agent2');
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('use default platform userAgent after webView is rebuilt',
(WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Expand Down Expand Up @@ -313,7 +319,7 @@ Future<void> main() async {

final String customUserAgent2 = await _getUserAgent(controller);
expect(customUserAgent2, defaultPlatformUserAgent);
}, skip: Platform.isAndroid && _skipDueToIssue86757);
});

group('Video playback policy', () {
late String videoTestBase64;
Expand Down Expand Up @@ -798,7 +804,6 @@ Future<void> main() async {
});

group('Programmatic Scroll', () {
// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('setAndGetScrollPosition', (WidgetTester tester) async {
const String scrollTestPage = '''
<!DOCTYPE html>
Expand Down Expand Up @@ -873,7 +878,7 @@ Future<void> main() async {
scrollPosY = await controller.getScrollY();
expect(scrollPosX, X_SCROLL * 2);
expect(scrollPosY, Y_SCROLL * 2);
}, skip: Platform.isAndroid && _skipDueToIssue86757);
});
});

// Minimial end-to-end testing of the legacy Android implementation.
Expand All @@ -889,7 +894,7 @@ Future<void> main() async {
testWidgets('initialUrl', (WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
final Completer<void> loadCompleter = Completer<void>();
final Completer<void> pageFinishedCompleter = Completer<void>();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
Expand All @@ -899,18 +904,18 @@ Future<void> main() async {
onWebViewCreated: (WebViewController controller) {
controllerCompleter.complete(controller);
},
onPageFinished: (String url) {
loadCompleter.complete();
},
onPageFinished: pageFinishedCompleter.complete,
),
),
);

final WebViewController controller = await controllerCompleter.future;
await loadCompleter.future;
await pageFinishedCompleter.future;

final String? currentUrl = await controller.currentUrl();
expect(currentUrl, primaryUrl);
});
}, skip: !Platform.isAndroid || _skipDueToIssue86757);
}, skip: !Platform.isAndroid);

group('NavigationDelegate', () {
const String blankPage = '<!DOCTYPE html><head></head><body></body></html>';
Expand Down Expand Up @@ -1149,7 +1154,6 @@ Future<void> main() async {
expect(currentUrl, primaryUrl);
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets('target _blank opens in same window',
(WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Expand All @@ -1175,9 +1179,8 @@ Future<void> main() async {
await pageLoaded.future;
final String? currentUrl = await controller.currentUrl();
expect(currentUrl, primaryUrl);
}, skip: Platform.isAndroid && _skipDueToIssue86757);
});

// TODO(bparrishMines): skipped due to https://github.com/flutter/flutter/issues/86757
testWidgets(
'can open new window and go back',
(WidgetTester tester) async {
Expand Down Expand Up @@ -1213,55 +1216,61 @@ Future<void> main() async {
expect(controller.canGoBack(), completion(true));
await controller.goBack();
await pageLoaded.future;
expect(controller.currentUrl(), completion(primaryUrl));
await expectLater(controller.currentUrl(), completion(primaryUrl));
},
skip: _skipDueToIssue86757,
);

testWidgets(
'clearCache should clear local storage',
(WidgetTester tester) async {
final Completer<WebViewController> controllerCompleter =
Completer<WebViewController>();
final Completer<void> onPageFinished = Completer<void>();

Completer<void> pageLoadCompleter = Completer<void>();

await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: WebView(
key: GlobalKey(),
initialUrl: primaryUrl,
javascriptMode: JavascriptMode.unrestricted,
onPageFinished: (_) => onPageFinished.complete(),
onPageFinished: (_) => pageLoadCompleter.complete(),
onWebViewCreated: (WebViewController controller) {
controllerCompleter.complete(controller);
},
),
),
);

final WebViewController controller = await controllerCompleter.future;
await onPageFinished.future;
await pageLoadCompleter.future;
pageLoadCompleter = Completer<void>();

final WebViewController controller = await controllerCompleter.future;
await controller.runJavascript('localStorage.setItem("myCat", "Tom");');

expect(
controller.runJavascriptReturningResult(
'localStorage.getItem("myCat");',
),
completion(_webviewString('Tom')),
final String myCatItem = await controller.runJavascriptReturningResult(
'localStorage.getItem("myCat");',
);
expect(myCatItem, _webviewString('Tom'));

await controller.clearCache();
await pageLoadCompleter.future;

expect(
controller.runJavascriptReturningResult(
late final String? nullItem;
try {
nullItem = await controller.runJavascriptReturningResult(
'localStorage.getItem("myCat");',
),
completion(_webviewNull()),
);
);
} catch (exception) {
if (defaultTargetPlatform == TargetPlatform.iOS &&
exception is ArgumentError &&
(exception.message as String).contains(
'Result of JavaScript execution returned a `null` value.')) {
nullItem = '<null>';
}
}
expect(nullItem, _webviewNull());
},
// TODO(bparrishMines): Unskip once https://github.com/flutter/plugins/pull/5086 lands and is published.
skip: Platform.isAndroid,
);
}

Expand Down
Loading