Chromium Code Reviews| Index: pkg/barback/test/too_many_open_files_test.dart |
| diff --git a/pkg/barback/test/too_many_open_files_test.dart b/pkg/barback/test/too_many_open_files_test.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..08e901d518481c093d12ade007674ba4c58b95e8 |
| --- /dev/null |
| +++ b/pkg/barback/test/too_many_open_files_test.dart |
| @@ -0,0 +1,68 @@ |
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +library barback.test.too_many_open_files_test; |
| + |
| +import 'dart:async'; |
| +import 'dart:io'; |
| + |
| +import 'package:barback/barback.dart'; |
| +import 'package:path/path.dart' as pathos; |
| +import 'package:unittest/unittest.dart'; |
| + |
| +import 'utils.dart'; |
| + |
| +main() { |
| + initConfig(); |
| + |
| + runOnManyFiles(Future assetHandler(Asset asset)) { |
|
nweiz
2013/10/16 00:16:01
It feels like this should be defined at the top le
Bob Nystrom
2013/10/16 00:51:46
Done.
|
| + // Make a text file in a temp directory. |
| + var tempDir = Directory.systemTemp.createTempSync("barback").path; |
| + var filePath = pathos.join(tempDir, "out.txt"); |
| + |
| + // Make sure it's large enough to not be read in a single chunk. |
| + var contents = new StringBuffer(); |
| + for (var i = 0; i < 1024; i++) { |
| + contents.write( |
| + "this is a sixty four character long string that describes itself"); |
| + } |
| + |
| + new File(filePath).writeAsStringSync(contents.toString()); |
| + |
| + var id = new AssetId("myapp", "out.txt"); |
| + |
| + // Create a large number of assets, larger than the file descriptor limit |
| + // of most machines and start reading from all of them. |
| + var futures = []; |
| + for (var i = 0; i < 1000; i++) { |
| + var asset = new Asset.fromPath(id, filePath); |
| + futures.add(assetHandler(asset)); |
| + } |
| + |
| + expect(Future.wait(futures).whenComplete(() { |
| + new Directory(tempDir).delete(recursive: true); |
| + }), completes); |
| + } |
| + |
| + test("handles many simultaneous asset read() calls", () { |
| + runOnManyFiles((asset) { |
| + var completer = new Completer(); |
| + var stream = asset.read(); |
| + |
| + stream.listen((data) { |
| + // Do nothing. |
| + }, onError: (error) { |
| + completer.completeError(error); |
| + }, onDone: () { |
| + if (!completer.isCompleted) completer.complete(); |
| + }); |
|
nweiz
2013/10/16 00:16:01
It would be cleaner just to return asset.read().to
Bob Nystrom
2013/10/16 00:51:46
Indeed! Done.
|
| + |
| + return completer.future; |
| + }); |
| + }); |
| + |
| + test("handles many simultaneous asset readToString() calls", () { |
| + runOnManyFiles((asset) => asset.readAsString()); |
| + }); |
| +} |