| // Copyright (c) 2012, 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. |
| |
| // @dart = 2.9 |
| |
| // 'fuzz' test the directory APIs by providing unexpected type |
| // arguments. The test passes if the VM does not crash. |
| |
| import 'dart:async'; |
| import 'dart:io'; |
| |
| import "package:async_helper/async_helper.dart"; |
| import "package:expect/expect.dart"; |
| |
| import 'fuzz_support.dart'; |
| import 'file_write_only_test.dart' show withTempDir, withTempDirSync; |
| |
| fuzzSyncMethods() { |
| withTempDirSync('dart_directory_fuzz', (temp) { |
| typeMapping.forEach((k, v) { |
| doItSync(() { |
| Directory.systemTemp.createTempSync("${temp.path}/$v").deleteSync(); |
| }); |
| Directory d; |
| doItSync(() => d = new Directory("${temp.path}/$v")); |
| if (d == null) return; |
| doItSync(d.existsSync); |
| doItSync(d.createSync); |
| doItSync(d.deleteSync); |
| doItSync(d.listSync); |
| doItSync(() { |
| d.createTempSync('tempdir').deleteSync(); |
| }); |
| doItSync(() { |
| // Let's be a little careful. If the directory exists we don't |
| // want to delete it and all its contents. |
| if (!d.existsSync()) d.deleteSync(recursive: true); |
| }); |
| typeMapping.forEach((k2, v2) { |
| doItSync(() => d.renameSync(v2)); |
| doItSync(() => d.listSync(recursive: v2)); |
| }); |
| }); |
| }); |
| } |
| |
| fuzzAsyncMethods() async { |
| asyncStart(); |
| await withTempDir('dart_directory_fuzz', (temp) async { |
| final futures = <Future>[]; |
| typeMapping.forEach((k, v) { |
| futures.add(doItAsync(() { |
| Directory.systemTemp.createTempSync("${temp.path}/$v").deleteSync(); |
| })); |
| if (v is! String) { |
| Expect.throws(() => new Directory(v), |
| (e) => e is ArgumentError || e is TypeError); |
| return; |
| } |
| var d = new Directory("${temp.path}/$v"); |
| futures.add(doItAsync(d.exists)); |
| futures.add(doItAsync(d.create)); |
| futures.add(doItAsync(d.delete)); |
| futures.add(doItAsync(() { |
| return d.createTemp('tempdir').then((temp) { |
| return temp.delete(); |
| }); |
| })); |
| futures.add(doItAsync(() { |
| return d.exists().then((res) { |
| if (!res) return d.delete(recursive: true); |
| return new Future.value(true); |
| }); |
| })); |
| typeMapping.forEach((k2, v2) { |
| futures.add(doItAsync(() => d.rename(v2))); |
| futures.add(doItAsync(() { |
| d.list(recursive: v2).listen((_) {}, onError: (e) => null); |
| })); |
| }); |
| }); |
| await Future.wait(futures).then((_) => asyncEnd()); |
| }); |
| } |
| |
| main() { |
| fuzzSyncMethods(); |
| fuzzAsyncMethods(); |
| } |