gecko/toolkit/components/filewatcher/tests/xpcshell/test_watch_many_changes.js

74 lines
2.4 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
function run_test() {
// Set up profile. We will use profile path create some test files
do_get_profile();
// Start executing the tests
run_next_test();
}
/**
* Test that we correctly handle watching directories when hundreds of files
* change simultaneously.
*/
add_task(function* test_fill_notification_buffer() {
// Create and watch a sub-directory of the profile directory so we don't
// catch notifications we're not interested in (i.e. "startupCache").
let watchedDir = OS.Path.join(OS.Constants.Path.profileDir, "filewatcher_playground");
yield OS.File.makeDir(watchedDir);
// The number of files to create.
let numberOfFiles = 100;
let fileNameBase = "testFile";
// This will be used to keep track of the number of changes within the watched
// directory.
let detectedChanges = 0;
// We expect at least the following notifications for each file:
// - File creation
// - File deletion
let expectedChanges = numberOfFiles * 2;
// Instantiate the native watcher.
let watcher = makeWatcher();
let deferred = Promise.defer();
// Initialise the change callback.
let changeCallback = function(changed) {
do_print(changed + " has changed.");
detectedChanges += 1;
// Resolve the promise if we get all the expected changes.
if (detectedChanges >= expectedChanges) {
deferred.resolve();
}
};
// Add the profile directory to the watch list and wait for the file watcher
// to start watching it.
yield promiseAddPath(watcher, watchedDir, changeCallback, deferred.reject);
// Create and then remove the files within the watched directory.
for (let i = 0; i < numberOfFiles; i++) {
let tmpFilePath = OS.Path.join(watchedDir, fileNameBase + i);
yield OS.File.writeAtomic(tmpFilePath, "test content");
yield OS.File.remove(tmpFilePath);
}
// Wait until the watcher informs us that all the files were
// created, modified and removed.
yield deferred.promise;
// Remove the watch and free the associated memory (we need to
// reuse 'changeCallback' and 'errorCallback' to unregister).
yield promiseRemovePath(watcher, watchedDir, changeCallback, deferred.reject);
});