1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/osfile/tests/xpcshell/test_shutdown.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,98 @@ 1.4 +Components.utils.import("resource://gre/modules/Services.jsm", this); 1.5 +Components.utils.import("resource://gre/modules/Promise.jsm", this); 1.6 +Components.utils.import("resource://gre/modules/Task.jsm", this); 1.7 +Components.utils.import("resource://gre/modules/osfile.jsm", this); 1.8 + 1.9 +add_task(function init() { 1.10 + do_get_profile(); 1.11 +}); 1.12 + 1.13 +/** 1.14 + * Test logging of file descriptors leaks. 1.15 + */ 1.16 +add_task(function system_shutdown() { 1.17 + 1.18 + // Test that unclosed files cause warnings 1.19 + // Test that unclosed directories cause warnings 1.20 + // Test that closed files do not cause warnings 1.21 + // Test that closed directories do not cause warnings 1.22 + function testLeaksOf(resource, topic) { 1.23 + return Task.spawn(function() { 1.24 + let deferred = Promise.defer(); 1.25 + 1.26 + // Register observer 1.27 + Services.prefs.setBoolPref("toolkit.asyncshutdown.testing", true); 1.28 + Services.prefs.setBoolPref("toolkit.osfile.log", true); 1.29 + Services.prefs.setBoolPref("toolkit.osfile.log.redirect", true); 1.30 + Services.prefs.setCharPref("toolkit.osfile.test.shutdown.observer", topic); 1.31 + 1.32 + let observer = function(aMessage) { 1.33 + try { 1.34 + do_print("Got message: " + aMessage); 1.35 + if (!(aMessage instanceof Components.interfaces.nsIConsoleMessage)) { 1.36 + return; 1.37 + } 1.38 + let message = aMessage.message; 1.39 + do_print("Got message: " + message); 1.40 + if (message.indexOf("TEST OS Controller WARNING") < 0) { 1.41 + return; 1.42 + } 1.43 + do_print("Got message: " + message + ", looking for resource " + resource); 1.44 + if (message.indexOf(resource) < 0) { 1.45 + return; 1.46 + } 1.47 + do_print("Resource: " + resource + " found"); 1.48 + do_execute_soon(deferred.resolve); 1.49 + } catch (ex) { 1.50 + do_execute_soon(function() { 1.51 + deferred.reject(ex); 1.52 + }); 1.53 + } 1.54 + }; 1.55 + Services.console.registerListener(observer); 1.56 + Services.obs.notifyObservers(null, topic, null); 1.57 + do_timeout(1000, function() { 1.58 + do_print("Timeout while waiting for resource: " + resource); 1.59 + deferred.reject("timeout"); 1.60 + }); 1.61 + 1.62 + let resolved = false; 1.63 + try { 1.64 + yield deferred.promise; 1.65 + resolved = true; 1.66 + } catch (ex if ex == "timeout") { 1.67 + resolved = false; 1.68 + } 1.69 + Services.console.unregisterListener(observer); 1.70 + Services.prefs.clearUserPref("toolkit.osfile.log"); 1.71 + Services.prefs.clearUserPref("toolkit.osfile.log.redirect"); 1.72 + Services.prefs.clearUserPref("toolkit.osfile.test.shutdown.observer"); 1.73 + Services.prefs.clearUserPref("toolkit.async_shutdown.testing", true); 1.74 + 1.75 + throw new Task.Result(resolved); 1.76 + }); 1.77 + } 1.78 + 1.79 + let TEST_DIR = OS.Path.join((yield OS.File.getCurrentDirectory()), ".."); 1.80 + do_print("Testing for leaks of directory iterator " + TEST_DIR); 1.81 + let iterator = new OS.File.DirectoryIterator(TEST_DIR); 1.82 + do_print("At this stage, we leak the directory"); 1.83 + do_check_true((yield testLeaksOf(TEST_DIR, "test.shutdown.dir.leak"))); 1.84 + yield iterator.close(); 1.85 + do_print("At this stage, we don't leak the directory anymore"); 1.86 + do_check_false((yield testLeaksOf(TEST_DIR, "test.shutdown.dir.noleak"))); 1.87 + 1.88 + let TEST_FILE = OS.Path.join(OS.Constants.Path.profileDir, "test"); 1.89 + do_print("Testing for leaks of file descriptor: " + TEST_FILE); 1.90 + let openedFile = yield OS.File.open(TEST_FILE, { create: true} ); 1.91 + do_print("At this stage, we leak the file"); 1.92 + do_check_true((yield testLeaksOf(TEST_FILE, "test.shutdown.file.leak"))); 1.93 + yield openedFile.close(); 1.94 + do_print("At this stage, we don't leak the file anymore"); 1.95 + do_check_false((yield testLeaksOf(TEST_FILE, "test.shutdown.file.leak.2"))); 1.96 +}); 1.97 + 1.98 + 1.99 +function run_test() { 1.100 + run_next_test(); 1.101 +}