daemon_test.dart 9.15 KB
Newer Older
Devon Carew's avatar
Devon Carew committed
1 2 3 4 5 6
// Copyright 2015 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';

7
import 'package:flutter_tools/src/base/context.dart';
8
import 'package:flutter_tools/src/base/logger.dart';
9
import 'package:flutter_tools/src/base/platform.dart';
10
import 'package:flutter_tools/src/commands/daemon.dart';
11
import 'package:flutter_tools/src/device.dart';
12
import 'package:flutter_tools/src/doctor.dart';
13
import 'package:flutter_tools/src/globals.dart';
14
import 'package:flutter_tools/src/ios/mac.dart';
Devon Carew's avatar
Devon Carew committed
15 16
import 'package:test/test.dart';

17
import 'src/context.dart';
Devon Carew's avatar
Devon Carew committed
18 19
import 'src/mocks.dart';

20
void main() {
21 22 23 24 25 26 27 28 29
  Daemon daemon;
  AppContext appContext;
  NotifyingLogger notifyingLogger;

  void _testUsingContext(String description, dynamic testMethod()) {
    test(description, () {
      return appContext.runInZone(testMethod);
    });
  }
30

31
  group('daemon', () {
32
    setUp(() {
33 34
      appContext = new AppContext();
      notifyingLogger = new NotifyingLogger();
35
      appContext.setVariable(Platform, new LocalPlatform());
36 37
      appContext.setVariable(Logger, notifyingLogger);
      appContext.setVariable(Doctor, new Doctor());
38
      if (platform.isMacOS)
39 40
        appContext.setVariable(XCode, new XCode());
      appContext.setVariable(DeviceManager, new MockDeviceManager());
41
    });
Devon Carew's avatar
Devon Carew committed
42 43 44 45

    tearDown(() {
      if (daemon != null)
        return daemon.shutdown();
46
      notifyingLogger.dispose();
Devon Carew's avatar
Devon Carew committed
47 48
    });

49
    _testUsingContext('daemon.version', () async {
Ian Hickson's avatar
Ian Hickson committed
50 51
      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
Devon Carew's avatar
Devon Carew committed
52 53
      daemon = new Daemon(
        commands.stream,
54
        (Map<String, dynamic> result) => responses.add(result),
55
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
56
      );
Ian Hickson's avatar
Ian Hickson committed
57 58
      commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.version'});
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
Devon Carew's avatar
Devon Carew committed
59 60 61
      expect(response['id'], 0);
      expect(response['result'], isNotEmpty);
      expect(response['result'] is String, true);
62 63
      responses.close();
      commands.close();
Devon Carew's avatar
Devon Carew committed
64 65
    });

66
    _testUsingContext('daemon.logMessage', () {
67
      return appContext.runInZone(() async {
Ian Hickson's avatar
Ian Hickson committed
68 69
        StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
        StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
70 71 72
        daemon = new Daemon(
          commands.stream,
          (Map<String, dynamic> result) => responses.add(result),
73
          notifyingLogger: notifyingLogger
74 75 76 77 78 79 80 81 82 83
        );
        printError('daemon.logMessage test');
        Map<String, dynamic> response = await responses.stream.where((Map<String, dynamic> map) {
          return map['event'] == 'daemon.logMessage' && map['params']['level'] == 'error';
        }).first;
        expect(response['id'], isNull);
        expect(response['event'], 'daemon.logMessage');
        Map<String, String> logMessage = response['params'];
        expect(logMessage['level'], 'error');
        expect(logMessage['message'], 'daemon.logMessage test');
84 85
        responses.close();
        commands.close();
86
      });
87 88
    });

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
    _testUsingContext('daemon.logMessage logToStdout', () async {
      StringBuffer buffer = new StringBuffer();

      await runZoned(() async {
        return appContext.runInZone(() async {
          StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
          StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
          daemon = new Daemon(
            commands.stream,
            (Map<String, dynamic> result) => responses.add(result),
            notifyingLogger: notifyingLogger,
            logToStdout: true
          );
          printStatus('daemon.logMessage test');
          // Service the event loop.
          await new Future<Null>.value();
        });
      }, zoneSpecification: new ZoneSpecification(print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
        buffer.writeln(line);
      }));

      expect(buffer.toString().trim(), 'daemon.logMessage test');
    });

113
    _testUsingContext('daemon.shutdown', () async {
Ian Hickson's avatar
Ian Hickson committed
114 115
      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
Devon Carew's avatar
Devon Carew committed
116 117
      daemon = new Daemon(
        commands.stream,
118
        (Map<String, dynamic> result) => responses.add(result),
119
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
120
      );
121
      commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.shutdown'});
122
      return daemon.onExit.then<Null>((int code) {
123 124
        responses.close();
        commands.close();
Devon Carew's avatar
Devon Carew committed
125 126 127 128
        expect(code, 0);
      });
    });

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
    _testUsingContext('daemon.start', () async {
      DaemonCommand command = new DaemonCommand();
      applyMocksToCommand(command);

      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
      daemon = new Daemon(
        commands.stream,
        (Map<String, dynamic> result) => responses.add(result),
        daemonCommand: command,
        notifyingLogger: notifyingLogger
      );

      commands.add(<String, dynamic>{ 'id': 0, 'method': 'app.start' });
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
      expect(response['id'], 0);
      expect(response['error'], contains('deviceId is required'));
146 147
      responses.close();
      commands.close();
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
    });

    _testUsingContext('daemon.restart', () async {
      DaemonCommand command = new DaemonCommand();
      applyMocksToCommand(command);

      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
      daemon = new Daemon(
        commands.stream,
        (Map<String, dynamic> result) => responses.add(result),
        daemonCommand: command,
        notifyingLogger: notifyingLogger
      );

      commands.add(<String, dynamic>{ 'id': 0, 'method': 'app.restart' });
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
      expect(response['id'], 0);
      expect(response['error'], contains('appId is required'));
167 168
      responses.close();
      commands.close();
169 170
    });

171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
    _testUsingContext('daemon.callServiceExtension', () async {
      DaemonCommand command = new DaemonCommand();
      applyMocksToCommand(command);

      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
      daemon = new Daemon(
          commands.stream,
              (Map<String, dynamic> result) => responses.add(result),
          daemonCommand: command,
          notifyingLogger: notifyingLogger
      );

      commands.add(<String, dynamic>{
        'id': 0,
        'method': 'app.callServiceExtension',
        'params': <String, String> {
          'methodName': 'ext.flutter.debugPaint'
        }
      });
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
      expect(response['id'], 0);
      expect(response['error'], contains('appId is required'));
      responses.close();
      commands.close();
    });

198
    _testUsingContext('daemon.stop', () async {
Devon Carew's avatar
Devon Carew committed
199 200 201
      DaemonCommand command = new DaemonCommand();
      applyMocksToCommand(command);

Ian Hickson's avatar
Ian Hickson committed
202 203
      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
Devon Carew's avatar
Devon Carew committed
204 205
      daemon = new Daemon(
        commands.stream,
206
        (Map<String, dynamic> result) => responses.add(result),
207
        daemonCommand: command,
208
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
209 210
      );

211
      commands.add(<String, dynamic>{ 'id': 0, 'method': 'app.stop' });
Ian Hickson's avatar
Ian Hickson committed
212
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
Devon Carew's avatar
Devon Carew committed
213
      expect(response['id'], 0);
214
      expect(response['error'], contains('appId is required'));
215 216
      responses.close();
      commands.close();
Devon Carew's avatar
Devon Carew committed
217
    });
218

219
    _testUsingContext('device.getDevices', () async {
Ian Hickson's avatar
Ian Hickson committed
220 221
      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
222 223
      daemon = new Daemon(
        commands.stream,
224
        (Map<String, dynamic> result) => responses.add(result),
225
        notifyingLogger: notifyingLogger
226
      );
227
      commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'});
Ian Hickson's avatar
Ian Hickson committed
228
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
229 230
      expect(response['id'], 0);
      expect(response['result'], isList);
231 232
      responses.close();
      commands.close();
233
    });
Devon Carew's avatar
Devon Carew committed
234 235
  });
}
236 237

bool _notEvent(Map<String, dynamic> map) => map['event'] == null;