daemon_test.dart 8.97 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, const LocalPlatform());
36 37
      appContext.setVariable(Logger, notifyingLogger);
      appContext.setVariable(Doctor, new Doctor());
38
      if (platform.isMacOS)
39
        appContext.setVariable(Xcode, new Xcode());
40
      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 {
50 51
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final 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
        responses.add,
55
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
56
      );
Ian Hickson's avatar
Ian Hickson committed
57
      commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.version'});
58
      final 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 {
68 69
        final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
        final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
70 71
        daemon = new Daemon(
          commands.stream,
72
          responses.add,
73
          notifyingLogger: notifyingLogger
74 75
        );
        printError('daemon.logMessage test');
76
        final Map<String, dynamic> response = await responses.stream.where((Map<String, dynamic> map) {
77 78 79 80
          return map['event'] == 'daemon.logMessage' && map['params']['level'] == 'error';
        }).first;
        expect(response['id'], isNull);
        expect(response['event'], 'daemon.logMessage');
81
        final Map<String, String> logMessage = response['params'];
82 83
        expect(logMessage['level'], 'error');
        expect(logMessage['message'], 'daemon.logMessage test');
84 85
        responses.close();
        commands.close();
86
      });
87 88
    });

89
    _testUsingContext('daemon.logMessage logToStdout', () async {
90
      final StringBuffer buffer = new StringBuffer();
91 92 93

      await runZoned(() async {
        return appContext.runInZone(() async {
94 95
          final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
          final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
96 97
          daemon = new Daemon(
            commands.stream,
98
            responses.add,
99 100 101 102 103 104 105 106 107 108 109 110 111 112
            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 {
114 115
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final 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
        responses.add,
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
    _testUsingContext('daemon.start', () async {
130
      final DaemonCommand command = new DaemonCommand();
131 132
      applyMocksToCommand(command);

133 134
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
135 136
      daemon = new Daemon(
        commands.stream,
137
        responses.add,
138 139 140 141 142
        daemonCommand: command,
        notifyingLogger: notifyingLogger
      );

      commands.add(<String, dynamic>{ 'id': 0, 'method': 'app.start' });
143
      final Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
144 145
      expect(response['id'], 0);
      expect(response['error'], contains('deviceId is required'));
146 147
      responses.close();
      commands.close();
148 149 150
    });

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

154 155
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
156 157
      daemon = new Daemon(
        commands.stream,
158
        responses.add,
159 160 161 162 163
        daemonCommand: command,
        notifyingLogger: notifyingLogger
      );

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

171
    _testUsingContext('daemon.callServiceExtension', () async {
172
      final DaemonCommand command = new DaemonCommand();
173 174
      applyMocksToCommand(command);

175 176
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
177 178
      daemon = new Daemon(
          commands.stream,
179
          responses.add,
180 181 182 183 184 185 186 187 188 189 190
          daemonCommand: command,
          notifyingLogger: notifyingLogger
      );

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

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

202 203
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final 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
        responses.add,
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' });
212
      final 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 {
220 221
      final StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      final StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
222 223
      daemon = new Daemon(
        commands.stream,
224
        responses.add,
225
        notifyingLogger: notifyingLogger
226
      );
227
      commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'});
228
      final 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;