Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | |
|
Lasse Reichstein Nielsen
2015/01/08 11:59:22
2015
Søren Gjesse
2015/01/09 13:06:20
Done.
| |
| 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 import 'dart:async'; | |
| 6 import 'dart:io'; | |
| 7 | |
| 8 import "package:async_helper/async_helper.dart"; | |
| 9 import "package:expect/expect.dart"; | |
| 10 import "package:path/path.dart"; | |
| 11 | |
| 12 // Check that the file is locked or not. | |
|
Lasse Reichstein Nielsen
2015/01/08 11:59:22
that -> whether
Søren Gjesse
2015/01/09 13:06:21
Done.
| |
| 13 check(String path, int start, int end, FileLock mode, {bool locked}) { | |
| 14 // Client process returns either 'LOCK FAILED' or 'LOCK SUCCEEDED'. | |
| 15 var expected = locked ? 'LOCK FAILED' : 'LOCK SUCCEEDED'; | |
| 16 var arguments = [] | |
| 17 ..addAll(Platform.executableArguments) | |
| 18 ..add(Platform.script.resolve('file_lock_script.dart').toFilePath()) | |
| 19 ..add(path) | |
| 20 ..add('$start') | |
| 21 ..add('$end') | |
| 22 ..add(mode == FileLock.EXCLUSIVE ? 'EXCLUSIVE' : 'SHARED'); | |
| 23 return Process.run(Platform.executable, arguments) | |
| 24 .then((ProcessResult result) { | |
| 25 if (result.exitCode != 0 || !result.stdout.contains(expected)) { | |
| 26 print("Client failed, exit code ${result.exitCode}"); | |
| 27 print(" stdout:"); | |
| 28 print(result.stdout); | |
| 29 print(" stderr:"); | |
| 30 print(result.stderr); | |
| 31 print(" arguments:"); | |
| 32 print(arguments); | |
| 33 Expect.fail('Client subprocess exit code: ${result.exitCode}'); | |
| 34 } | |
| 35 }); | |
| 36 } | |
| 37 | |
| 38 checkLocked(String path, | |
| 39 [int start, int end, FileLock mode = FileLock.EXCLUSIVE]) => | |
| 40 check(path, start, end, mode, locked: true); | |
| 41 | |
| 42 checkNotLocked(String path, | |
| 43 [int start, int end, FileLock mode = FileLock.EXCLUSIVE]) => | |
| 44 check(path, start, end, mode, locked: false); | |
| 45 | |
| 46 void testLockWholeFile() { | |
| 47 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 48 File file = new File(join(directory.path, "file")); | |
| 49 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 50 var raf = file.openSync(mode: WRITE); | |
| 51 raf.lockSync(); | |
| 52 checkLocked(file.path).then((_) { | |
| 53 checkLocked(file.path, 0, 2).then((_) { | |
| 54 raf.unlockSync(); | |
| 55 checkNotLocked(file.path).then((_) { | |
| 56 raf.closeSync(); | |
| 57 directory.deleteSync(recursive: true); | |
|
kustermann
2015/01/08 12:54:28
Could you do the directory.deleteSync() in a whenC
Søren Gjesse
2015/01/09 13:06:21
Done.
| |
| 58 }); | |
| 59 }); | |
| 60 }); | |
| 61 } | |
| 62 | |
| 63 void testLockWholeFileAsync() { | |
| 64 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 65 File file = new File(join(directory.path, "file")); | |
| 66 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 67 var raf = file.openSync(mode: WRITE); | |
| 68 asyncStart(); | |
| 69 Future.forEach([ | |
| 70 () => raf.lock(), | |
| 71 () => checkLocked(file.path, 0, 2), | |
| 72 () => checkLocked(file.path), | |
| 73 () => raf.unlock(), | |
| 74 () => checkNotLocked(file.path), | |
| 75 ], | |
| 76 (f) => f()).then((_) { | |
| 77 raf.closeSync(); | |
| 78 directory.deleteSync(recursive: true); | |
| 79 asyncEnd(); | |
| 80 }); | |
| 81 } | |
| 82 | |
| 83 void testLockRange() { | |
| 84 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 85 File file = new File(join(directory.path, "file")); | |
| 86 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 87 var raf1 = file.openSync(mode: WRITE); | |
| 88 var raf2 = file.openSync(mode: WRITE); | |
| 89 asyncStart(); | |
| 90 var tests = [ | |
| 91 () => raf1.lockSync(2, 3), | |
| 92 () => raf2.lockSync(5, 7), | |
| 93 () => checkNotLocked(file.path, 0, 2), | |
| 94 () => checkLocked(file.path, 0, 3), | |
| 95 () => checkNotLocked(file.path, 4, 5), | |
| 96 () => checkLocked(file.path, 4, 6), | |
| 97 () => checkLocked(file.path, 6), | |
| 98 () => checkNotLocked(file.path, 7), | |
| 99 () => raf1.unlockSync(2, 3), | |
| 100 () => checkNotLocked(file.path, 0, 5), | |
| 101 () => checkLocked(file.path, 4, 6), | |
| 102 () => checkLocked(file.path, 6), | |
| 103 () => checkNotLocked(file.path, 7), | |
| 104 ]; | |
| 105 // On Windows regions unlocked must match regions locked. | |
| 106 if (!Platform.isWindows) { | |
| 107 tests.addAll([ | |
| 108 () => raf1.unlockSync(5, 6), | |
| 109 () => checkNotLocked(file.path, 0, 6), | |
| 110 () => checkLocked(file.path, 6), | |
| 111 () => checkNotLocked(file.path, 7), | |
| 112 () => raf2.unlockSync(6, 7), | |
| 113 () => checkNotLocked(file.path) | |
| 114 ]); | |
| 115 } else { | |
| 116 tests.addAll([ | |
| 117 () => raf2.unlockSync(5, 7), | |
| 118 () => checkNotLocked(file.path) | |
| 119 ]); | |
| 120 } | |
| 121 Future.forEach(tests, (f) => f()).then((_) { | |
| 122 raf1.closeSync(); | |
| 123 raf2.closeSync(); | |
| 124 directory.deleteSync(recursive: true); | |
| 125 asyncEnd(); | |
| 126 }); | |
| 127 } | |
| 128 | |
| 129 void testLockRangeAsync() { | |
| 130 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 131 File file = new File(join(directory.path, "file")); | |
| 132 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 133 var raf1 = file.openSync(mode: WRITE); | |
| 134 var raf2 = file.openSync(mode: WRITE); | |
| 135 asyncStart(); | |
| 136 var tests = [ | |
| 137 () => raf1.lock(2, 3), | |
| 138 () => raf2.lock(5, 7), | |
| 139 () => checkNotLocked(file.path, 0, 2), | |
| 140 () => checkLocked(file.path, 0, 3), | |
| 141 () => checkNotLocked(file.path, 4, 5), | |
| 142 () => checkLocked(file.path, 4, 6), | |
| 143 () => checkLocked(file.path, 6), | |
| 144 () => checkNotLocked(file.path, 7), | |
| 145 () => raf1.unlock(2, 3), | |
| 146 () => checkNotLocked(file.path, 0, 5), | |
| 147 () => checkLocked(file.path, 4, 6), | |
| 148 () => checkLocked(file.path, 6), | |
| 149 () => checkNotLocked(file.path, 7), | |
| 150 ]; | |
| 151 // On Windows regions unlocked must match regions locked. | |
| 152 if (!Platform.isWindows) { | |
| 153 tests.addAll([ | |
| 154 () => raf1.unlock(5, 6), | |
| 155 () => checkNotLocked(file.path, 0, 6), | |
| 156 () => checkLocked(file.path, 6), | |
| 157 () => checkNotLocked(file.path, 7), | |
| 158 () => raf2.unlock(6, 7), | |
| 159 () => checkNotLocked(file.path) | |
| 160 ]); | |
| 161 } else { | |
| 162 tests.addAll([ | |
| 163 () => raf2.unlock(5, 7), | |
| 164 () => checkNotLocked(file.path) | |
| 165 ]); | |
| 166 } | |
| 167 Future.forEach(tests, | |
| 168 (f) => f()).then((_) { | |
| 169 raf1.closeSync(); | |
| 170 raf2.closeSync(); | |
| 171 directory.deleteSync(recursive: true); | |
| 172 asyncEnd(); | |
| 173 }); | |
| 174 } | |
| 175 | |
| 176 void testLockEnd() { | |
| 177 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 178 File file = new File(join(directory.path, "file")); | |
| 179 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 180 var raf = file.openSync(mode: APPEND); | |
| 181 asyncStart(); | |
| 182 Future.forEach([ | |
| 183 () => raf.lockSync(2), | |
| 184 () => checkNotLocked(file.path, 0, 2), | |
| 185 () => checkLocked(file.path, 0, 3), | |
| 186 () => checkLocked(file.path, 9), | |
| 187 () => raf.writeFromSync(new List.filled(10, 0)), | |
| 188 () => checkLocked(file.path, 10), | |
| 189 () => checkLocked(file.path, 19), | |
| 190 () => raf.unlockSync(2), | |
| 191 () => checkNotLocked(file.path) | |
| 192 ], | |
| 193 (f) => f()).then((_) { | |
| 194 raf.closeSync(); | |
| 195 directory.deleteSync(recursive: true); | |
| 196 asyncEnd(); | |
| 197 }); | |
| 198 } | |
| 199 | |
| 200 void testLockEndAsync() { | |
| 201 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 202 File file = new File(join(directory.path, "file")); | |
| 203 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 204 var raf = file.openSync(mode: APPEND); | |
| 205 asyncStart(); | |
| 206 Future.forEach([ | |
| 207 () => raf.lock(2), | |
| 208 () => checkNotLocked(file.path, 0, 2), | |
| 209 () => checkLocked(file.path, 0, 3), | |
| 210 () => checkLocked(file.path, 9), | |
| 211 () => raf.writeFromSync(new List.filled(10, 0)), | |
| 212 () => checkLocked(file.path, 10), | |
| 213 () => checkLocked(file.path, 19), | |
| 214 () => raf.unlock(2), | |
| 215 () => checkNotLocked(file.path) | |
| 216 ], | |
| 217 (f) => f()).then((_) { | |
| 218 raf.closeSync(); | |
| 219 directory.deleteSync(recursive: true); | |
| 220 asyncEnd(); | |
| 221 }); | |
| 222 } | |
| 223 | |
| 224 void testLockShared() { | |
| 225 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 226 File file = new File(join(directory.path, "file")); | |
| 227 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 228 var raf = file.openSync(); | |
| 229 asyncStart(); | |
| 230 Future.forEach([ | |
| 231 () => raf.lock(null, null, FileLock.SHARED), | |
| 232 () => checkLocked(file.path), | |
| 233 () => checkLocked(file.path, 0, 2), | |
| 234 () => checkNotLocked(file.path, 0, 2, FileLock.SHARED) | |
| 235 ], | |
| 236 (f) => f()).then((_) { | |
| 237 raf.closeSync(); | |
| 238 directory.deleteSync(recursive: true); | |
| 239 asyncEnd(); | |
| 240 }); | |
| 241 } | |
| 242 | |
| 243 void testLockSharedAsync() { | |
| 244 Directory directory = Directory.systemTemp.createTempSync('dart_file_lock'); | |
| 245 File file = new File(join(directory.path, "file")); | |
| 246 file.writeAsBytesSync(new List.filled(10, 0)); | |
| 247 var raf = file.openSync(); | |
| 248 asyncStart(); | |
| 249 Future.forEach([ | |
| 250 () => raf.lock(null, null, FileLock.SHARED), | |
| 251 () => checkLocked(file.path), | |
| 252 () => checkLocked(file.path, 0, 2), | |
| 253 () => checkNotLocked(file.path, 0, 2, FileLock.SHARED) | |
| 254 ], | |
| 255 (f) => f()).then((_) { | |
| 256 raf.closeSync(); | |
| 257 directory.deleteSync(recursive: true); | |
| 258 asyncEnd(); | |
| 259 }); | |
| 260 } | |
| 261 | |
| 262 void main() { | |
| 263 testLockWholeFile(); | |
| 264 testLockWholeFileAsync(); | |
| 265 testLockRange(); | |
| 266 testLockRangeAsync(); | |
| 267 testLockEnd(); | |
| 268 testLockEndAsync(); | |
| 269 testLockShared(); | |
| 270 testLockSharedAsync(); | |
|
Lasse Reichstein Nielsen
2015/01/08 11:59:22
What happens if the lock range is larger than the
Søren Gjesse
2015/01/09 13:06:20
Done.
| |
| 271 } | |
| OLD | NEW |