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

8
import 'package:flutter_tools/src/base/context.dart';
9
import 'package:flutter_tools/src/base/logger.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 35
      appContext = new AppContext();
      notifyingLogger = new NotifyingLogger();
      appContext[Logger] = notifyingLogger;
36 37 38
      appContext[Doctor] = new Doctor();
      if (Platform.isMacOS)
        appContext[XCode] = new XCode();
39
      appContext[DeviceManager] = new MockDeviceManager();
40
    });
Devon Carew's avatar
Devon Carew committed
41 42 43 44

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

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

65
    _testUsingContext('daemon.logMessage', () {
66
      return appContext.runInZone(() async {
Ian Hickson's avatar
Ian Hickson committed
67 68
        StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
        StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
69 70 71
        daemon = new Daemon(
          commands.stream,
          (Map<String, dynamic> result) => responses.add(result),
72
          notifyingLogger: notifyingLogger
73 74 75 76 77 78 79 80 81 82
        );
        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');
83 84
        responses.close();
        commands.close();
85
      });
86 87
    });

88
    _testUsingContext('daemon.shutdown', () async {
Ian Hickson's avatar
Ian Hickson committed
89 90
      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
91 92
      daemon = new Daemon(
        commands.stream,
93
        (Map<String, dynamic> result) => responses.add(result),
94
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
95
      );
96
      commands.add(<String, dynamic>{'id': 0, 'method': 'daemon.shutdown'});
Devon Carew's avatar
Devon Carew committed
97
      return daemon.onExit.then((int code) {
98 99
        responses.close();
        commands.close();
Devon Carew's avatar
Devon Carew committed
100 101 102 103
        expect(code, 0);
      });
    });

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
    _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'));
121 122
      responses.close();
      commands.close();
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
    });

    _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'));
142 143
      responses.close();
      commands.close();
144 145
    });

146
    _testUsingContext('daemon.stop', () async {
Devon Carew's avatar
Devon Carew committed
147 148 149
      DaemonCommand command = new DaemonCommand();
      applyMocksToCommand(command);

Ian Hickson's avatar
Ian Hickson committed
150 151
      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
152 153
      daemon = new Daemon(
        commands.stream,
154
        (Map<String, dynamic> result) => responses.add(result),
155
        daemonCommand: command,
156
        notifyingLogger: notifyingLogger
Devon Carew's avatar
Devon Carew committed
157 158
      );

159
      commands.add(<String, dynamic>{ 'id': 0, 'method': 'app.stop' });
Ian Hickson's avatar
Ian Hickson committed
160
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
Devon Carew's avatar
Devon Carew committed
161
      expect(response['id'], 0);
162
      expect(response['error'], contains('appId is required'));
163 164
      responses.close();
      commands.close();
Devon Carew's avatar
Devon Carew committed
165
    });
166

167
    _testUsingContext('device.getDevices', () async {
Ian Hickson's avatar
Ian Hickson committed
168 169
      StreamController<Map<String, dynamic>> commands = new StreamController<Map<String, dynamic>>();
      StreamController<Map<String, dynamic>> responses = new StreamController<Map<String, dynamic>>();
170 171
      daemon = new Daemon(
        commands.stream,
172
        (Map<String, dynamic> result) => responses.add(result),
173
        notifyingLogger: notifyingLogger
174
      );
175
      commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'});
Ian Hickson's avatar
Ian Hickson committed
176
      Map<String, dynamic> response = await responses.stream.where(_notEvent).first;
177 178
      expect(response['id'], 0);
      expect(response['result'], isList);
179 180
      responses.close();
      commands.close();
181
    });
Devon Carew's avatar
Devon Carew committed
182 183
  });
}
184 185

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