flutter_tester_test.dart 3.72 KB
Newer Older
1 2 3 4 5
// Copyright 2018 The Chromium 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';
6
import 'dart:convert';
7 8 9

import 'package:file/file.dart';
import 'package:flutter_tools/src/base/file_system.dart';
10 11
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/process_manager.dart';
12 13 14 15 16
import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/tester/flutter_tester.dart';
import 'package:test/test.dart';

17
import '../src/common.dart';
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
import '../src/context.dart';

void main() {
  Directory tempDir;
  Directory oldCurrentDir;

  setUp(() async {
    tempDir = await fs.systemTempDirectory.createTemp('flutter_tester_device');
    oldCurrentDir = fs.currentDirectory;
    fs.currentDirectory = tempDir;
  });

  tearDown(() {
    fs.currentDirectory = oldCurrentDir;
    try {
      tempDir?.deleteSync(recursive: true);
      tempDir = null;
    } catch (e) {
      // Ignored.
    }
  });

  group('FlutterTesterDevice', () {
    FlutterTesterDevice device;

    setUp(() {
      device = new FlutterTesterDevice('flutter-tester');
    });

    Future<LaunchResult> start(String mainPath) async {
      return await device.startApp(null,
          mainPath: mainPath,
          debuggingOptions: new DebuggingOptions.enabled(
              const BuildInfo(BuildMode.debug, null)));
    }

    testUsingContext('start', () async {
      _writePubspec();
      _writePackages();

      final String mainPath = fs.path.join('lib', 'main.dart');
      _writeFile(mainPath, r'''
import 'dart:async';
void main() {
  new Timer.periodic(const Duration(milliseconds: 1), (Timer timer) {
    print('Hello!');
  });
}
''');

      final LaunchResult result = await start(mainPath);
      expect(result.started, isTrue);
      expect(result.observatoryUri, isNotNull);

      final String line = await device.getLogReader().logLines.first;
      expect(line, 'Hello!');

      expect(await device.stopApp(null), isTrue);
    });
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 103 104 105 106 107 108 109

    testUsingContext('keeps running', () async {
      _writePubspec();
      _writePackages();
      await _getPackages();

      final String mainPath = fs.path.join('lib', 'main.dart');
      _writeFile(mainPath, r'''
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new Container(),
    );
  }
}
''');

      final LaunchResult result = await start(mainPath);

      expect(result.started, isTrue);
      expect(result.observatoryUri, isNotNull);

      await new Future<void>.delayed(const Duration(seconds: 3));
      expect(device.isRunning, true);

      expect(await device.stopApp(null), isTrue);
    });
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
  });
}

void _writeFile(String path, String content) {
  fs.file(path)
    ..createSync(recursive: true)
    ..writeAsStringSync(content);
}

void _writePackages() {
  _writeFile('.packages', '''
test:${fs.path.join(fs.currentDirectory.path, 'lib')}/
''');
}

void _writePubspec() {
  _writeFile('pubspec.yaml', '''
name: test
dependencies:
  flutter:
    sdk: flutter
''');
}
133 134 135 136 137 138 139 140

Future<void> _getPackages() async {
  final List<String> command = <String>[
    fs.path.join(getFlutterRoot(), 'bin', 'flutter'),
    'packages',
    'get'
  ];
  final Process process = await processManager.start(command);
141 142
  final StringBuffer errorOutput = new StringBuffer();
  process.stderr.transform(utf8.decoder).listen(errorOutput.write);
143 144
  final int exitCode = await process.exitCode;
  if (exitCode != 0)
145
    throw new Exception('flutter packages get failed: ${errorOutput.toString()}');
146
}