// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:async'; import 'dart:io'; import 'package:flutter_driver/flutter_driver.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; import 'package:vm_service_client/vm_service_client.dart'; // Connect and disconnect from the empty app. void main() { // Load the license file from disk to compare it with the one in the app. final File licenseFile = File(path.join('..', '..', '..', 'packages', 'flutter', 'LICENSE')); if (!licenseFile.existsSync()) { print('Test failed. Unable to find LICENSE file at ${licenseFile.path}'); exit(-1); } final RegExp newlineSplit = RegExp(r'\s+'); final String license = licenseFile.readAsStringSync().split(newlineSplit).join(' ').trim(); group('License file check', () { FlutterDriver driver; IsolatesWorkaround workaround; setUpAll(() async { driver = await FlutterDriver.connect(); workaround = IsolatesWorkaround(driver); await workaround.resumeIsolates(); await driver.waitUntilFirstFrameRasterized(); }); tearDownAll(() async { if (driver != null) { await driver.close(); await workaround.tearDown(); } }); test('flutter license', () async { await driver.waitFor(find.byValueKey('Header')); final String foundPackage = await driver.getText(find.byValueKey('FlutterPackage')); final String foundLicense = await driver.getText(find.byValueKey('FlutterLicense')); expect(foundPackage, equals('flutter')); expect(foundLicense, equals(license)); }); test('engine license', () async { await driver.waitFor(find.byValueKey('Header')); final String foundPackage = await driver.getText(find.byValueKey('EnginePackage')); final String foundLicense = await driver.getText(find.byValueKey('EngineLicense')); expect(foundPackage, equals('engine')); // The engine has the same license, but with a different Copyright date. expect(foundLicense, contains(license.replaceFirst('2014', '2013'))); }); }); } /// Workaround for isolates being paused by driver tests. /// https://github.com/flutter/flutter/issues/24703 class IsolatesWorkaround { IsolatesWorkaround(this._driver); final FlutterDriver _driver; StreamSubscription<VMIsolateRef> _streamSubscription; Future<void> resumeIsolates() async { final VM vm = await _driver.serviceClient.getVM(); // Resume any paused isolate for (final VMIsolateRef isolateRef in vm.isolates) { final VMIsolate isolate = await isolateRef.load(); if (isolate.isPaused) { isolate.resume(); } } if (_streamSubscription != null) { return; } _streamSubscription = _driver.serviceClient.onIsolateRunnable .asBroadcastStream() .listen((VMIsolateRef isolateRef) async { final VMIsolate isolate = await isolateRef.load(); if (isolate.isPaused) { isolate.resume(); } }); } Future<void> tearDown() async { if (_streamSubscription != null) { await _streamSubscription.cancel(); } } }