OLD | NEW |
| (Empty) |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
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. | |
4 | |
5 library barback.test.asset_test; | |
6 | |
7 import 'dart:async'; | |
8 import 'dart:convert'; | |
9 import 'dart:io'; | |
10 import 'dart:isolate'; | |
11 | |
12 import 'package:barback/barback.dart'; | |
13 import 'package:barback/src/asset/internal_asset.dart'; | |
14 import 'package:path/path.dart' as pathos; | |
15 import 'package:unittest/unittest.dart'; | |
16 | |
17 import 'utils.dart'; | |
18 | |
19 /// The contents of the test binary file. | |
20 final binaryContents = [0, 1, 2, 3, 4]; | |
21 | |
22 main() { | |
23 initConfig(); | |
24 | |
25 Directory tempDir; | |
26 String binaryFilePath; | |
27 String textFilePath; | |
28 String latin1FilePath; | |
29 | |
30 setUp(() { | |
31 // Create a temp file we can use for assets. | |
32 tempDir = Directory.systemTemp.createTempSync('barback_asset_test_'); | |
33 binaryFilePath = pathos.join(tempDir.path, "file.bin"); | |
34 new File(binaryFilePath).writeAsBytesSync(binaryContents); | |
35 | |
36 textFilePath = pathos.join(tempDir.path, "file.txt"); | |
37 new File(textFilePath).writeAsStringSync("çøñ†éℵ™"); | |
38 | |
39 latin1FilePath = pathos.join(tempDir.path, "file.latin1"); | |
40 new File(latin1FilePath).writeAsBytesSync(LATIN1.encode("blåbærgrød")); | |
41 }); | |
42 | |
43 tearDown(() { | |
44 if (tempDir != null) tempDir.deleteSync(recursive: true); | |
45 }); | |
46 | |
47 var id = new AssetId.parse("package|path/to/asset.txt"); | |
48 | |
49 group("Asset.fromBytes", () { | |
50 test("returns an asset with the given ID", () { | |
51 var asset = new Asset.fromBytes(id, [1]); | |
52 expect(asset.id, equals(id)); | |
53 }); | |
54 }); | |
55 | |
56 group("Asset.fromFile", () { | |
57 test("returns an asset with the given ID", () { | |
58 var asset = new Asset.fromFile(id, new File("asset.txt")); | |
59 expect(asset.id, equals(id)); | |
60 }); | |
61 }); | |
62 | |
63 group("Asset.fromPath", () { | |
64 test("returns an asset with the given ID", () { | |
65 var asset = new Asset.fromPath(id, "asset.txt"); | |
66 expect(asset.id, equals(id)); | |
67 }); | |
68 }); | |
69 | |
70 group("Asset.fromString", () { | |
71 test("returns an asset with the given ID", () { | |
72 var asset = new Asset.fromString(id, "content"); | |
73 expect(asset.id, equals(id)); | |
74 }); | |
75 }); | |
76 | |
77 group("Asset.fromStream", () { | |
78 test("returns an asset with the given ID", () { | |
79 var asset = new Asset.fromStream(id, | |
80 new Stream.fromFuture(new Future.value([104, 101, 108, 108, 111]))); | |
81 expect(asset.id, equals(id)); | |
82 }); | |
83 }); | |
84 | |
85 group("read()", () { | |
86 test("gets the UTF-8-encoded string for a string asset", () { | |
87 var asset = new Asset.fromString(id, "çøñ†éℵ™"); | |
88 expect(asset.read().toList(), | |
89 completion(equals([UTF8.encode("çøñ†éℵ™")]))); | |
90 }); | |
91 | |
92 test("gets the raw bytes for a byte asset", () { | |
93 var asset = new Asset.fromBytes(id, binaryContents); | |
94 expect(asset.read().toList(), | |
95 completion(equals([binaryContents]))); | |
96 }); | |
97 | |
98 test("gets the raw bytes for a binary file", () { | |
99 var asset = new Asset.fromPath(id, binaryFilePath); | |
100 expect(asset.read().toList(), | |
101 completion(equals([binaryContents]))); | |
102 }); | |
103 | |
104 test("gets the raw bytes for a text file", () { | |
105 var asset = new Asset.fromPath(id, textFilePath); | |
106 expect(asset.read().toList(), | |
107 completion(equals([UTF8.encode("çøñ†éℵ™")]))); | |
108 }); | |
109 | |
110 test("gets the raw bytes for a stream", () { | |
111 var asset = new Asset.fromStream(id, | |
112 new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™")))); | |
113 expect(asset.read().toList(), | |
114 completion(equals([UTF8.encode("çøñ†éℵ™")]))); | |
115 }); | |
116 }); | |
117 | |
118 group("readAsString()", () { | |
119 group("byte asset", () { | |
120 test("defaults to UTF-8 if encoding is omitted", () { | |
121 var asset = new Asset.fromBytes(id, UTF8.encode("çøñ†éℵ™")); | |
122 expect(asset.readAsString(), | |
123 completion(equals("çøñ†éℵ™"))); | |
124 }); | |
125 | |
126 test("supports UTF-8", () { | |
127 var asset = new Asset.fromBytes(id, UTF8.encode("çøñ†éℵ™")); | |
128 expect(asset.readAsString(encoding: UTF8), | |
129 completion(equals("çøñ†éℵ™"))); | |
130 }); | |
131 | |
132 // TODO(rnystrom): Test other encodings once #6284 is fixed. | |
133 }); | |
134 | |
135 group("string asset", () { | |
136 test("gets the string", () { | |
137 var asset = new Asset.fromString(id, "contents"); | |
138 expect(asset.readAsString(), | |
139 completion(equals("contents"))); | |
140 }); | |
141 | |
142 test("ignores the encoding", () { | |
143 var asset = new Asset.fromString(id, "contents"); | |
144 expect(asset.readAsString(encoding: LATIN1), | |
145 completion(equals("contents"))); | |
146 }); | |
147 }); | |
148 | |
149 group("file asset", () { | |
150 test("defaults to UTF-8 if encoding is omitted", () { | |
151 var asset = new Asset.fromPath(id, textFilePath); | |
152 expect(asset.readAsString(), | |
153 completion(equals("çøñ†éℵ™"))); | |
154 }); | |
155 }); | |
156 | |
157 group("stream asset", () { | |
158 test("defaults to UTF-8 if encoding is omitted", () { | |
159 var asset = new Asset.fromStream(id, | |
160 new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™")))); | |
161 expect(asset.readAsString(), | |
162 completion(equals("çøñ†éℵ™"))); | |
163 }); | |
164 | |
165 test("supports UTF-8", () { | |
166 var asset = new Asset.fromStream(id, | |
167 new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™")))); | |
168 expect(asset.readAsString(encoding: UTF8), | |
169 completion(equals("çøñ†éℵ™"))); | |
170 }); | |
171 | |
172 test("supports ISO-8859-1", () { | |
173 var future = new Future.value(LATIN1.encode("blåbærgrød")); | |
174 var asset = new Asset.fromStream(id, new Stream.fromFuture(future)); | |
175 expect(asset.readAsString(encoding: LATIN1), | |
176 completion(equals("blåbærgrød"))); | |
177 }); | |
178 }); | |
179 }); | |
180 | |
181 group("toString()", () { | |
182 group("byte asset", () { | |
183 test("shows the list of bytes in hex", () { | |
184 var asset = new Asset.fromBytes(id, | |
185 [0, 1, 2, 4, 8, 16, 32, 64, 128, 255]); | |
186 expect(asset.toString(), equals( | |
187 "Bytes [00 01 02 04 08 10 20 40 80 ff]")); | |
188 }); | |
189 | |
190 test("truncates the middle of there are more than ten bytes", () { | |
191 var asset = new Asset.fromBytes(id, | |
192 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]); | |
193 expect(asset.toString(), equals( | |
194 "Bytes [01 02 03 04 05 ... 0a 0b 0c 0d 0e]")); | |
195 }); | |
196 }); | |
197 | |
198 group("string asset", () { | |
199 test("shows the contents", () { | |
200 var asset = new Asset.fromString(id, "contents"); | |
201 expect(asset.toString(), equals( | |
202 'String "contents"')); | |
203 }); | |
204 | |
205 test("truncates the middle of there are more than 40 characters", () { | |
206 var asset = new Asset.fromString(id, | |
207 "this is a fairly long string asset content that gets shortened"); | |
208 expect(asset.toString(), equals( | |
209 'String "this is a fairly lon ... that gets shortened"')); | |
210 }); | |
211 }); | |
212 | |
213 group("file asset", () { | |
214 test("shows the file path", () { | |
215 var asset = new Asset.fromPath(id, "path.txt"); | |
216 expect(asset.toString(), equals('File "path.txt"')); | |
217 }); | |
218 }); | |
219 }); | |
220 | |
221 group("across isolates", () { | |
222 getBytesFromIsolate(Asset asset) { | |
223 var port = new ReceivePort(); | |
224 return Isolate.spawn(_getAssetBytes, { | |
225 'asset': serializeAsset(asset), | |
226 'replyTo': port.sendPort | |
227 }).then((_) => port.first); | |
228 } | |
229 | |
230 test("gets the UTF-8-encoded string for a string asset", () { | |
231 var asset = new Asset.fromString(id, "çøñ†éℵ™"); | |
232 expect(getBytesFromIsolate(asset), | |
233 completion(equals(UTF8.encode("çøñ†éℵ™")))); | |
234 }); | |
235 | |
236 test("gets the raw bytes for a byte asset", () { | |
237 var asset = new Asset.fromBytes(id, binaryContents); | |
238 expect(getBytesFromIsolate(asset), | |
239 completion(equals(binaryContents))); | |
240 }); | |
241 | |
242 test("gets the raw bytes for a binary file", () { | |
243 var asset = new Asset.fromPath(id, binaryFilePath); | |
244 expect(getBytesFromIsolate(asset), | |
245 completion(equals(binaryContents))); | |
246 }); | |
247 | |
248 test("gets the raw bytes for a text file", () { | |
249 var asset = new Asset.fromPath(id, textFilePath); | |
250 expect(getBytesFromIsolate(asset), | |
251 completion(equals(UTF8.encode("çøñ†éℵ™")))); | |
252 }); | |
253 | |
254 test("gets the raw bytes for a stream", () { | |
255 var asset = new Asset.fromStream(id, | |
256 new Stream.fromFuture(new Future.value(UTF8.encode("çøñ†éℵ™")))); | |
257 expect(getBytesFromIsolate(asset), | |
258 completion(equals(UTF8.encode("çøñ†éℵ™")))); | |
259 }); | |
260 }); | |
261 } | |
262 | |
263 void _getAssetBytes(message) { | |
264 var asset = deserializeAsset(message['asset']); | |
265 var builder = asset.read().fold(new BytesBuilder(), | |
266 (builder, chunk) => builder..add(chunk)); | |
267 builder.then((builder) => message['replyTo'].send(builder.takeBytes())); | |
268 } | |
OLD | NEW |