OLD | NEW |
---|---|
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import "dart:async"; | 5 import "dart:async"; |
6 import "dart:io"; | 6 import "dart:io"; |
7 import "dart:convert" show JSON; | 7 import "dart:convert" show JSON; |
8 import "package:path/path.dart" as p; | 8 import "package:path/path.dart" as p; |
9 import "package:async_helper/async_helper.dart"; | 9 import "package:async_helper/async_helper.dart"; |
10 | 10 |
11 main() async { | 11 main() async { |
12 asyncStart(); | 12 asyncStart(); |
13 | 13 |
14 // The `test` function can generate file or http resources. | |
15 // It replaces "%file/" with URI of the root directory of generated files and | |
16 // "%http/" with the URI of the HTTP server's root in appropriate contexts | |
17 // (all file contents and parameters). | |
18 | |
19 // With no specified resolutiuon and no implicit .packages or packages/ | |
floitsch
2016/05/27 14:11:19
Resolution
| |
20 // available, nothing can be resolved and the package can't be imported. | |
14 await test("file: no resolution", | 21 await test("file: no resolution", |
15 "%file/main.dart", | 22 "%file/main.dart", |
16 file: {"main": testMain}, | 23 file: {"main": testMain}, |
17 expect: {"foo.x": null}); | 24 expect: {"foo.x": null}); |
18 | 25 |
19 // An HTTP script with no ".packages" file assumes a "packages" dir. | 26 // An HTTP script with no ".packages" file assumes a "packages" dir. |
27 // All packages are resolved relative to that dir, whether it exists or not. | |
20 await test("http: no resolution", "%http/main.dart", | 28 await test("http: no resolution", "%http/main.dart", |
21 http: {"main": testMain}, | 29 http: {"main": testMain}, |
22 expect: { | 30 expect: { |
23 "iroot": "%http/packages/", | 31 "iroot": "%http/packages/", |
24 // "foo": null, | 32 // "foo": null, |
25 "foo/": "%http/packages/foo/", | 33 "foo/": "%http/packages/foo/", |
26 "foo/bar": "%http/packages/foo/bar", | 34 "foo/bar": "%http/packages/foo/bar", |
27 "foo.x": null, | 35 "foo.x": null, |
28 }); | 36 }); |
29 | 37 |
38 // A number of tests which behave similarly whether run as local files or | |
39 // over HTTP. | |
30 for (var scheme in ["file", "http"]) { | 40 for (var scheme in ["file", "http"]) { |
31 | 41 |
42 /// Run a test in the current scheme. | |
43 /// | |
44 /// The files are served either through HTTP or in a local directory. | |
45 /// Use "%$scheme/" to refer to the root of the served files. | |
32 testScheme(name, main, {expect, files, args, root, config}) { | 46 testScheme(name, main, {expect, files, args, root, config}) { |
33 return test("$scheme: $name", main, expect: expect, | 47 return test("$scheme: $name", main, expect: expect, |
34 root: root, config: config, args: args, | 48 root: root, config: config, args: args, |
35 file: scheme == "file" ? files : null, | 49 file: scheme == "file" ? files : null, |
36 http: scheme == "http" ? files : null); | 50 http: scheme == "http" ? files : null); |
37 } | 51 } |
38 | 52 |
39 { | 53 { |
40 var files = {"main": testMain, "packages": fooPackage}; | 54 var files = {"main": testMain, "packages": fooPackage}; |
41 // Expect implicitly detected package dir. | 55 // Expect implicitly detected package dir. |
42 await testScheme("implicit packages dir","%$scheme/main.dart", | 56 await testScheme("implicit packages dir","%$scheme/main.dart", |
43 files: files, | 57 files: files, |
44 expect: { | 58 expect: { |
45 "iroot": "%$scheme/packages/", | 59 "iroot": "%$scheme/packages/", |
46 // "foo": null, | 60 // "foo": null, |
47 "foo/": "%$scheme/packages/foo/", | 61 "foo/": "%$scheme/packages/foo/", |
48 "foo/bar": "%$scheme/packages/foo/bar", | 62 "foo/bar": "%$scheme/packages/foo/bar", |
49 }); | 63 }); |
50 } | 64 } |
51 | 65 |
52 { | 66 { |
53 var files = {"sub": {"main": testMain, "packages": fooPackage}, | 67 var files = {"sub": {"main": testMain, "packages": fooPackage}, |
54 ".packages": ""}; | 68 ".packages": ""}; |
55 // Expect implicitly detected package dir. | 69 // Expect implicitly detected package dir. |
70 // Should not detect the .packages file in parent directory. | |
71 // That file is empty, so if it is used, the system cannot resolve "foo". | |
56 await testScheme("implicit packages dir 2", "%$scheme/sub/main.dart", | 72 await testScheme("implicit packages dir 2", "%$scheme/sub/main.dart", |
57 files: files, | 73 files: files, |
58 expect: { | 74 expect: { |
59 "iroot": "%$scheme/sub/packages/", | 75 "iroot": "%$scheme/sub/packages/", |
60 // "foo": null, | 76 // "foo": null, |
61 "foo/": "%$scheme/sub/packages/foo/", | 77 "foo/": "%$scheme/sub/packages/foo/", |
62 "foo/bar": "%$scheme/sub/packages/foo/bar", | 78 "foo/bar": "%$scheme/sub/packages/foo/bar", |
63 }); | 79 }); |
64 } | 80 } |
65 | 81 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
123 expect: { | 139 expect: { |
124 "pconf": "%$scheme/.pkgs", | 140 "pconf": "%$scheme/.pkgs", |
125 "iconf": "%$scheme/.pkgs", | 141 "iconf": "%$scheme/.pkgs", |
126 // "foo": null, | 142 // "foo": null, |
127 "foo/": "%$scheme/pkgs/foo/", | 143 "foo/": "%$scheme/pkgs/foo/", |
128 "foo/bar": "%$scheme/pkgs/foo/bar", | 144 "foo/bar": "%$scheme/pkgs/foo/bar", |
129 }); | 145 }); |
130 } | 146 } |
131 | 147 |
132 { | 148 { |
149 /// The package config can be specified as a data: URI. | |
150 /// (In that case, relative URI references in the config file won't work). | |
133 var files = {"main": testMain, | 151 var files = {"main": testMain, |
134 ".packages": "foo:packages/foo/", | 152 ".packages": "foo:packages/foo/", |
135 "packages": fooPackage, | 153 "packages": fooPackage, |
136 "pkgs": fooPackage}; | 154 "pkgs": fooPackage}; |
137 var dataUri = "data:,foo:%$scheme/pkgs/foo/\n"; | 155 var dataUri = "data:,foo:%$scheme/pkgs/foo/\n"; |
138 await testScheme("explicit data: config file", "%$scheme/main.dart", | 156 await testScheme("explicit data: config file", "%$scheme/main.dart", |
139 files: files, | 157 files: files, |
140 config: dataUri, | 158 config: dataUri, |
141 expect: { | 159 expect: { |
142 "pconf": dataUri, | 160 "pconf": dataUri, |
143 "iconf": dataUri, | 161 "iconf": dataUri, |
144 // "foo": null, | 162 // "foo": null, |
145 "foo/": "%$scheme/pkgs/foo/", | 163 "foo/": "%$scheme/pkgs/foo/", |
146 "foo/bar": "%$scheme/pkgs/foo/bar", | 164 "foo/bar": "%$scheme/pkgs/foo/bar", |
147 }); | 165 }); |
148 } | 166 } |
149 } | 167 } |
150 | 168 |
151 { | 169 { |
152 // With a file: URI, the lookup checks for a .packages file in superdirs. | 170 // With a file: URI, the lookup checks for a .packages file in superdirs |
171 // when it fails to find a ,packages file or packages/ directory next to | |
172 // the entry point. | |
153 var files = {"sub": { "main": testMain }, | 173 var files = {"sub": { "main": testMain }, |
154 ".packages": "foo:pkgs/foo/", | 174 ".packages": "foo:pkgs/foo/", |
155 "pkgs": fooPackage}; | 175 "pkgs": fooPackage}; |
156 await test("file: implicit .packages file in ..", "%file/sub/main.dart", | 176 await test("file: implicit .packages file in ..", "%file/sub/main.dart", |
157 file: files, | 177 file: files, |
158 expect: { | 178 expect: { |
159 "iconf": "%file/.packages", | 179 "iconf": "%file/.packages", |
160 // "foo": null, | 180 // "foo": null, |
161 "foo/": "%file/pkgs/foo/", | 181 "foo/": "%file/pkgs/foo/", |
162 "foo/bar": "%file/pkgs/foo/bar", | 182 "foo/bar": "%file/pkgs/foo/bar", |
163 }); | 183 }); |
164 } | 184 } |
165 | 185 |
166 { | 186 { |
167 // With a non-file: URI, the lookup assumes a packges/ dir. | 187 // With a non-file: URI, the lookup assumes a packges/ dir. |
188 // The absence of a .packages file next to the entry point means | |
189 // that the resolution assumes a packages directory, whether it exists or | |
190 // not. It should not find the .packages file in the parent directory. | |
168 var files = {"sub": { "main": testMain }, | 191 var files = {"sub": { "main": testMain }, |
169 ".packages": "foo:pkgs/foo/", | 192 ".packages": "foo:pkgs/foo/", |
170 "pkgs": fooPackage}; | 193 "pkgs": fooPackage}; |
171 // Expect implicitly detected .package file. | |
172 await test("http: implicit packages dir", "%http/sub/main.dart", | 194 await test("http: implicit packages dir", "%http/sub/main.dart", |
173 http: files, | 195 http: files, |
174 expect: { | 196 expect: { |
175 "iroot": "%http/sub/packages/", | 197 "iroot": "%http/sub/packages/", |
176 // "foo": null, | 198 // "foo": null, |
177 "foo/": "%http/sub/packages/foo/", | 199 "foo/": "%http/sub/packages/foo/", |
178 "foo/bar": "%http/sub/packages/foo/bar", | 200 "foo/bar": "%http/sub/packages/foo/bar", |
179 "foo.x": null, | 201 "foo.x": null, |
180 }); | 202 }); |
181 } | 203 } |
(...skipping 11 matching lines...) Expand all Loading... | |
193 | 215 |
194 var failingTests = new Set(); | 216 var failingTests = new Set(); |
195 | 217 |
196 var fileHttpRegexp = new RegExp(r"%(?:file|http)/"); | 218 var fileHttpRegexp = new RegExp(r"%(?:file|http)/"); |
197 | 219 |
198 Future test(String name, String main, | 220 Future test(String name, String main, |
199 {String root, String config, List<String> args, | 221 {String root, String config, List<String> args, |
200 Map file, Map http, Map expect}) async { | 222 Map file, Map http, Map expect}) async { |
201 // Default values that are easily recognized in output. | 223 // Default values that are easily recognized in output. |
202 String fileRoot = "<no files configured>"; | 224 String fileRoot = "<no files configured>"; |
203 String httpRoot = "<not http server configured>"; | 225 String httpRoot = "<no http server configured>"; |
204 | 226 |
205 /// Replaces markers `%file/` and `%http/` with the actual locations. | 227 /// Replaces markers `%file/` and `%http/` with the actual locations. |
206 /// | 228 /// |
207 /// Accepts a `null` [source] and returns `null` again. | 229 /// Accepts a `null` [source] and returns `null` again. |
208 String fixPaths(String source) { | 230 String fixPaths(String source) { |
209 if (source == null) return null; | 231 if (source == null) return null; |
210 var result = source.replaceAllMapped(fileHttpRegexp, (match) { | 232 var result = source.replaceAllMapped(fileHttpRegexp, (match) { |
211 if (source.startsWith("file", match.start + 1)) return fileRoot; | 233 if (source.startsWith("file", match.start + 1)) return fileRoot; |
212 return httpRoot; | 234 return httpRoot; |
213 }); | 235 }); |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
467 } | 489 } |
468 | 490 |
469 // Counter used to avoid reusing temporary directory names. | 491 // Counter used to avoid reusing temporary directory names. |
470 // Some platforms are timer based, and creating two temp-dirs withing a short | 492 // Some platforms are timer based, and creating two temp-dirs withing a short |
471 // duration may cause a collision. | 493 // duration may cause a collision. |
472 int tmpDirCounter = 0; | 494 int tmpDirCounter = 0; |
473 | 495 |
474 Directory createTempDir() { | 496 Directory createTempDir() { |
475 return Directory.systemTemp.createTempSync("pftest-${tmpDirCounter++}-"); | 497 return Directory.systemTemp.createTempSync("pftest-${tmpDirCounter++}-"); |
476 } | 498 } |
OLD | NEW |