depfile_test.dart 6.32 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
// @dart = 2.8

7 8
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart';
9
import 'package:flutter_tools/src/base/logger.dart';
10 11 12 13 14
import 'package:flutter_tools/src/build_system/depfile.dart';

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

void main() {
15 16
  FileSystem fileSystem;
  DepfileService depfileService;
17 18

  setUp(() {
19 20
    fileSystem = MemoryFileSystem.test();
    depfileService = DepfileService(
21
      logger: BufferLogger.test(),
22 23
      fileSystem: fileSystem,
    );
24
  });
25 26
  testWithoutContext('Can parse depfile from file', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync('''
27 28
a.txt: b.txt
''');
29
    final Depfile depfile = depfileService.parse(depfileSource);
30 31 32

    expect(depfile.inputs.single.path, 'b.txt');
    expect(depfile.outputs.single.path, 'a.txt');
33
  });
34

35 36
  testWithoutContext('Can parse depfile with multiple inputs', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync('''
37 38
a.txt: b.txt c.txt d.txt
''');
39
    final Depfile depfile = depfileService.parse(depfileSource);
40 41 42 43 44 45 46

    expect(depfile.inputs.map((File file) => file.path), <String>[
      'b.txt',
      'c.txt',
      'd.txt',
    ]);
    expect(depfile.outputs.single.path, 'a.txt');
47
  });
48

49 50
  testWithoutContext('Can parse depfile with multiple outputs', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync('''
51 52
a.txt c.txt d.txt: b.txt
''');
53
    final Depfile depfile = depfileService.parse(depfileSource);
54 55 56 57 58 59 60

    expect(depfile.inputs.single.path, 'b.txt');
    expect(depfile.outputs.map((File file) => file.path), <String>[
      'a.txt',
      'c.txt',
      'd.txt',
    ]);
61
  });
62

63 64 65
  testWithoutContext('Can parse depfile with windows file paths', () {
    fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
    depfileService = DepfileService(
66
      logger: BufferLogger.test(),
67 68 69
      fileSystem: fileSystem,
    );
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync(r'''
70 71
C:\\a.txt: C:\\b.txt
''');
72
    final Depfile depfile = depfileService.parse(depfileSource);
73 74 75

    expect(depfile.inputs.single.path, r'C:\b.txt');
    expect(depfile.outputs.single.path, r'C:\a.txt');
76
  });
77

78 79 80
  testWithoutContext('Can escape depfile with windows file paths and spaces in directory names', () {
    fileSystem = MemoryFileSystem.test(style: FileSystemStyle.windows);
    depfileService = DepfileService(
81
      logger: BufferLogger.test(),
82 83 84
      fileSystem: fileSystem,
    );
    final File inputFile = fileSystem.directory(r'Hello Flutter').childFile('a.txt').absolute
85
      ..createSync(recursive: true);
86
    final File outputFile = fileSystem.directory(r'Hello Flutter').childFile('b.txt').absolute
87 88
      ..createSync();
    final Depfile depfile = Depfile(<File>[inputFile], <File>[outputFile]);
89 90
    final File outputDepfile = fileSystem.file('depfile');
    depfileService.writeToFile(depfile, outputDepfile);
91 92 93

    expect(outputDepfile.readAsStringSync(), contains(r'C:\\Hello\ Flutter\\a.txt'));
    expect(outputDepfile.readAsStringSync(), contains(r'C:\\Hello\ Flutter\\b.txt'));
94
  });
95

96 97
  testWithoutContext('Can escape depfile with spaces in directory names', () {
    final File inputFile = fileSystem.directory(r'Hello Flutter').childFile('a.txt').absolute
98
      ..createSync(recursive: true);
99
    final File outputFile = fileSystem.directory(r'Hello Flutter').childFile('b.txt').absolute
100 101
      ..createSync();
    final Depfile depfile = Depfile(<File>[inputFile], <File>[outputFile]);
102 103
    final File outputDepfile = fileSystem.file('depfile');
    depfileService.writeToFile(depfile, outputDepfile);
104 105 106

    expect(outputDepfile.readAsStringSync(), contains(r'/Hello\ Flutter/a.txt'));
    expect(outputDepfile.readAsStringSync(), contains(r'/Hello\ Flutter/b.txt'));
107
  });
108 109


110 111
  testWithoutContext('Resillient to weird whitespace', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync(r'''
112 113 114 115 116
a.txt
  : b.txt    c.txt


''');
117
    final Depfile depfile = depfileService.parse(depfileSource);
118 119 120

    expect(depfile.inputs, hasLength(2));
    expect(depfile.outputs.single.path, 'a.txt');
121
  });
122

123 124
  testWithoutContext('Resillient to duplicate files', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync(r'''
125 126
a.txt: b.txt b.txt
''');
127
    final Depfile depfile = depfileService.parse(depfileSource);
128 129 130

    expect(depfile.inputs.single.path, 'b.txt');
    expect(depfile.outputs.single.path, 'a.txt');
131
  });
132

133 134
  testWithoutContext('Resillient to malformed file, missing :', () {
    final File depfileSource = fileSystem.file('example.d')..writeAsStringSync(r'''
135 136
a.text b.txt
''');
137
    final Depfile depfile = depfileService.parse(depfileSource);
138 139 140

    expect(depfile.inputs, isEmpty);
    expect(depfile.outputs, isEmpty);
141
  });
142

143 144
  testWithoutContext('Can parse dart2js output format', () {
    final File dart2jsDependencyFile = fileSystem.file('main.dart.js.deps')..writeAsStringSync(r'''
145 146 147 148 149
file:///Users/foo/collection.dart
file:///Users/foo/algorithms.dart
file:///Users/foo/canonicalized_map.dart
''');

150
    final Depfile depfile = depfileService.parseDart2js(dart2jsDependencyFile, fileSystem.file('foo.dart.js'));
151 152

    expect(depfile.inputs.map((File file) => file.path), <String>[
153 154 155
      fileSystem.path.absolute(fileSystem.path.join('Users', 'foo', 'collection.dart')),
      fileSystem.path.absolute(fileSystem.path.join('Users', 'foo', 'algorithms.dart')),
      fileSystem.path.absolute(fileSystem.path.join('Users', 'foo', 'canonicalized_map.dart')),
156 157
    ]);
    expect(depfile.outputs.single.path, 'foo.dart.js');
158
  });
159

160 161
  testWithoutContext('Can parse handle invalid uri', () {
    final File dart2jsDependencyFile = fileSystem.file('main.dart.js.deps')..writeAsStringSync('''
162 163 164 165 166
file:///Users/foo/collection.dart
abcdevf
file:///Users/foo/canonicalized_map.dart
''');

167
    final Depfile depfile = depfileService.parseDart2js(dart2jsDependencyFile, fileSystem.file('foo.dart.js'));
168 169

    expect(depfile.inputs.map((File file) => file.path), <String>[
170 171
      fileSystem.path.absolute(fileSystem.path.join('Users', 'foo', 'collection.dart')),
      fileSystem.path.absolute(fileSystem.path.join('Users', 'foo', 'canonicalized_map.dart')),
172 173
    ]);
    expect(depfile.outputs.single.path, 'foo.dart.js');
174
  });
175
}