toolkit/components/osfile/tests/xpcshell/test_shutdown.js

changeset 0
6474c204b198
     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 +}

mercurial