golden_comparator_test.dart 7.49 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 'dart:async';
6 7 8
import 'dart:convert';
import 'dart:typed_data';

9 10 11
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
12
import 'package:flutter_tools/src/test/flutter_web_goldens.dart';
13
import 'package:flutter_tools/src/test/test_compiler.dart';
14
import 'package:flutter_tools/src/web/compile.dart';
15
import 'package:test/fake.dart';
16 17

import '../../src/common.dart';
18 19 20 21 22 23 24
import '../../src/context.dart';

final Uri goldenKey = Uri.parse('file://golden_key');
final Uri goldenKey2 = Uri.parse('file://second_golden_key');
final Uri testUri = Uri.parse('file://test_uri');
final Uri testUri2  = Uri.parse('file://second_test_uri');
final Uint8List imageBytes = Uint8List.fromList(<int>[1, 2, 3, 4, 5]);
25 26 27 28

void main() {

  group('Test that TestGoldenComparator', () {
29
    late FakeProcessManager processManager;
30 31

    setUp(() {
32
      processManager = FakeProcessManager.empty();
33 34
    });

35
    testWithoutContext('succeed when golden comparison succeed', () async {
36 37 38 39
      final Map<String, dynamic> expectedResponse = <String, dynamic>{
        'success': true,
        'message': 'some message',
      };
40 41 42
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
43
          '--disable-vm-service',
44 45
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
46
          'compiler_output',
47 48 49 50 51 52
        ],
        stdout: '${jsonEncode(expectedResponse)}\n',
        environment: const <String, String>{
          'FLUTTER_TEST_BROWSER': 'chrome',
          'FLUTTER_WEB_RENDERER': 'html',
        },
53
      ));
54 55 56

      final TestGoldenComparator comparator = TestGoldenComparator(
        'shell',
57 58 59 60
        () => FakeTestCompiler(),
        processManager: processManager,
        fileSystem: MemoryFileSystem.test(),
        logger: BufferLogger.test(),
61
        webRenderer: WebRendererMode.html,
62 63
      );

64
      final String? result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
65
      expect(result, null);
66
    });
67

68
    testWithoutContext('fail with error message when golden comparison failed', () async {
69 70 71 72 73
      final Map<String, dynamic> expectedResponse = <String, dynamic>{
        'success': false,
        'message': 'some message',
      };

74 75 76
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
77
          '--disable-vm-service',
78 79
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
80
          'compiler_output',
81
        ], stdout: '${jsonEncode(expectedResponse)}\n',
82
      ));
83 84 85

      final TestGoldenComparator comparator = TestGoldenComparator(
        'shell',
86 87 88 89
        () => FakeTestCompiler(),
        processManager: processManager,
        fileSystem: MemoryFileSystem.test(),
        logger: BufferLogger.test(),
90
        webRenderer: WebRendererMode.canvaskit,
91 92
      );

93
      final String? result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
94
      expect(result, 'some message');
95
    });
96

97
    testWithoutContext('reuse the process for the same test file', () async {
98 99 100 101 102 103 104 105 106
      final Map<String, dynamic> expectedResponse1 = <String, dynamic>{
        'success': false,
        'message': 'some message',
      };
      final Map<String, dynamic> expectedResponse2 = <String, dynamic>{
        'success': false,
        'message': 'some other message',
      };

107 108 109
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
110
          '--disable-vm-service',
111 112
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
113
          'compiler_output',
114
        ], stdout: '${jsonEncode(expectedResponse1)}\n${jsonEncode(expectedResponse2)}\n',
115
      ));
116 117 118

      final TestGoldenComparator comparator = TestGoldenComparator(
        'shell',
119 120 121 122
        () => FakeTestCompiler(),
        processManager: processManager,
        fileSystem: MemoryFileSystem.test(),
        logger: BufferLogger.test(),
123
        webRenderer: WebRendererMode.html,
124 125
      );

126
      final String? result1 = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
127
      expect(result1, 'some message');
128

129
      final String? result2 = await comparator.compareGoldens(testUri, imageBytes, goldenKey2, false);
130
      expect(result2, 'some other message');
131
    });
132

133
    testWithoutContext('does not reuse the process for different test file', () async {
134 135 136 137 138 139 140 141 142
      final Map<String, dynamic> expectedResponse1 = <String, dynamic>{
        'success': false,
        'message': 'some message',
      };
      final Map<String, dynamic> expectedResponse2 = <String, dynamic>{
        'success': false,
        'message': 'some other message',
      };

143 144 145
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
146
          '--disable-vm-service',
147 148
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
149
          'compiler_output',
150
        ], stdout: '${jsonEncode(expectedResponse1)}\n',
151 152 153 154
      ));
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
155
          '--disable-vm-service',
156 157
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
158
          'compiler_output',
159
        ], stdout: '${jsonEncode(expectedResponse2)}\n',
160
      ));
161 162 163

      final TestGoldenComparator comparator = TestGoldenComparator(
        'shell',
164 165 166 167
        () => FakeTestCompiler(),
        processManager: processManager,
        fileSystem: MemoryFileSystem.test(),
        logger: BufferLogger.test(),
168
        webRenderer: WebRendererMode.canvaskit,
169 170
      );

171
      final String? result1 = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
172
      expect(result1, 'some message');
173

174
      final String? result2 = await comparator.compareGoldens(testUri2, imageBytes, goldenKey2, false);
175 176
      expect(result2, 'some other message');
    });
177

178 179
    testWithoutContext('removes all temporary files when closed', () async {
      final FileSystem fileSystem = MemoryFileSystem.test();
180 181 182 183
      final Map<String, dynamic> expectedResponse = <String, dynamic>{
        'success': true,
        'message': 'some message',
      };
184 185 186 187 188
      final StreamController<List<int>> controller = StreamController<List<int>>();
      final IOSink stdin = IOSink(controller.sink);
      processManager.addCommand(FakeCommand(
        command: const <String>[
          'shell',
189
          '--disable-vm-service',
190 191
          '--non-interactive',
          '--packages=.dart_tool/package_config.json',
192
          'compiler_output',
193
        ], stdout: '${jsonEncode(expectedResponse)}\n',
194 195
        stdin: stdin,
      ));
196 197 198

      final TestGoldenComparator comparator = TestGoldenComparator(
        'shell',
199 200 201 202
        () => FakeTestCompiler(),
        processManager: processManager,
        fileSystem: fileSystem,
        logger: BufferLogger.test(),
203
        webRenderer: WebRendererMode.html,
204 205
      );

206
      final String? result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
207 208 209
      expect(result, null);

      await comparator.close();
210 211
      expect(fileSystem.systemTempDirectory.listSync(recursive: true), isEmpty);
    });
212 213 214
  });
}

215 216 217 218 219
class FakeTestCompiler extends Fake implements TestCompiler {
  @override
  Future<String> compile(Uri mainDart) {
    return Future<String>.value('compiler_output');
  }
220

221 222 223
  @override
  Future<void> dispose() async { }
}