events_test.dart 5.15 KB
Newer Older
1 2 3 4
// 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.

5
import 'package:flutter_tools/src/build_info.dart';
6
import 'package:flutter_tools/src/doctor_validator.dart';
7
import 'package:flutter_tools/src/reporting/reporting.dart';
8
import 'package:package_config/package_config.dart';
9 10 11 12 13

import '../../src/common.dart';

void main() {
  testWithoutContext('DoctorResultEvent sends usage event for each sub validator', () async {
14
    final TestUsage usage = TestUsage();
15 16 17 18 19 20 21 22 23 24 25 26 27
    final GroupedValidator groupedValidator = FakeGroupedValidator(<DoctorValidator>[
      FakeDoctorValidator('a'),
      FakeDoctorValidator('b'),
      FakeDoctorValidator('c'),
    ]);
    final ValidationResult result = await groupedValidator.validate();

    final DoctorResultEvent doctorResultEvent = DoctorResultEvent(
      validator: groupedValidator,
      result: result,
      flutterUsage: usage,
    );

28
    expect(doctorResultEvent.send, returnsNormally);
29 30 31 32
    expect(usage.events.length, 3);
    expect(usage.events, contains(
      const TestUsageEvent('doctor-result', 'FakeDoctorValidator', label: 'crash'),
    ));
33 34 35 36 37
  });

  testWithoutContext('DoctorResultEvent does not crash if a synthetic crash result was used instead'
    ' of validation. This happens when a grouped validator throws an exception, causing subResults to never '
    ' be instantiated.', () async {
38
    final TestUsage usage = TestUsage();
39 40 41 42 43 44 45 46 47 48 49 50 51
    final GroupedValidator groupedValidator = FakeGroupedValidator(<DoctorValidator>[
      FakeDoctorValidator('a'),
      FakeDoctorValidator('b'),
      FakeDoctorValidator('c'),
    ]);
    final ValidationResult result = ValidationResult.crash(Object());

    final DoctorResultEvent doctorResultEvent = DoctorResultEvent(
      validator: groupedValidator,
      result: result,
      flutterUsage: usage,
    );

52
    expect(doctorResultEvent.send, returnsNormally);
53

54 55 56 57
    expect(usage.events.length, 1);
    expect(usage.events, contains(
      const TestUsageEvent('doctor-result', 'FakeGroupedValidator', label: 'crash'),
    ));
58
  });
59 60

  testWithoutContext('Reports null safe analytics events', () {
61
    final TestUsage usage = TestUsage();
62 63 64 65 66 67 68 69 70 71 72 73 74
    final PackageConfig packageConfig = PackageConfig(<Package>[
      Package('foo', Uri.parse('file:///foo/'), languageVersion: LanguageVersion(2, 12)),
      Package('bar', Uri.parse('file:///fizz/'), languageVersion: LanguageVersion(2, 1)),
      Package('baz', Uri.parse('file:///bar/'), languageVersion: LanguageVersion(2, 2)),
    ]);

    NullSafetyAnalysisEvent(
      packageConfig,
      NullSafetyMode.sound,
      'foo',
      usage,
    ).send();

75 76
    expect(usage.events, unorderedEquals(<TestUsageEvent>[
      const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
77
      TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
78
      'cd49': '1', 'cd50': '3',
79
      })),
80 81
      const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'language-version', label: '2.12'),
    ]));
82 83 84
  });

  testWithoutContext('Does not crash if main package is missing', () {
85
    final TestUsage usage = TestUsage();
86 87 88 89 90 91 92 93 94 95 96 97 98
    final PackageConfig packageConfig = PackageConfig(<Package>[
      Package('foo', Uri.parse('file:///foo/lib/'), languageVersion: LanguageVersion(2, 12)),
      Package('bar', Uri.parse('file:///fizz/lib/'), languageVersion: LanguageVersion(2, 1)),
      Package('baz', Uri.parse('file:///bar/lib/'), languageVersion: LanguageVersion(2, 2)),
    ]);

    NullSafetyAnalysisEvent(
      packageConfig,
      NullSafetyMode.sound,
      'something-unrelated',
      usage,
    ).send();

99 100
    expect(usage.events, unorderedEquals(<TestUsageEvent>[
      const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
101
      TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
102
        'cd49': '1', 'cd50': '3',
103
      })),
104
    ]));
105
  });
106 107

  testWithoutContext('a null language version is treated as unmigrated', () {
108
    final TestUsage usage = TestUsage();
109
    final PackageConfig packageConfig = PackageConfig(<Package>[
110
      Package('foo', Uri.parse('file:///foo/lib/')),
111 112 113 114 115 116 117 118 119
    ]);

    NullSafetyAnalysisEvent(
      packageConfig,
      NullSafetyMode.sound,
      'something-unrelated',
      usage,
    ).send();

120 121
    expect(usage.events, unorderedEquals(<TestUsageEvent>[
      const TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'runtime-mode', label: 'NullSafetyMode.sound'),
122
      TestUsageEvent(NullSafetyAnalysisEvent.kNullSafetyCategory, 'stats', parameters: CustomDimensions.fromMap(<String, String>{
123
        'cd49': '0', 'cd50': '1',
124
      })),
125
    ]));
126
  });
127 128 129 130 131 132 133 134 135 136 137 138 139 140
}

class FakeGroupedValidator extends GroupedValidator {
  FakeGroupedValidator(List<DoctorValidator> subValidators) : super(subValidators);
}

class FakeDoctorValidator extends DoctorValidator {
  FakeDoctorValidator(String title) : super(title);

  @override
  Future<ValidationResult> validate() async {
    return ValidationResult.crash(Object());
  }
}