Bug 445021 - Add more functions in DM's utils.js for chrome tests.
authorAnoop Saldanha (Poona) <poonaatsoc@gmail.com>
Sun, 27 Jul 2008 14:40:15 -0400
changeset 16251 bd0013e0d3af993f88b84fc219b50ec66ed6fa61
parent 16250 382caf466c8deca1cbbc42544c6de989ec95d3ab
child 16252 81021975270cbda145b87f0c37a7601ea258be82
push idunknown
push userunknown
push dateunknown
bugs445021
milestone1.9.1a2pre
Bug 445021 - Add more functions in DM's utils.js for chrome tests. This adds a number of common functions to the utils.js file used by the download manager chrome tests. r=sdwilsh
toolkit/mozapps/downloads/tests/chrome/utils.js
--- a/toolkit/mozapps/downloads/tests/chrome/utils.js
+++ b/toolkit/mozapps/downloads/tests/chrome/utils.js
@@ -15,16 +15,17 @@
  *
  * The Initial Developer of the Original Code is
  * Mozilla Corporation.
  * Portions created by the Initial Developer are Copyright (C) 2008
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Shawn Wilsher <me@shawnwilsher.com> (Original Author)
+ *   Anoop Saldanha <poonaatsoc@gmail.com>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -45,16 +46,128 @@ const Cr = Components.results;
 
 /**
  * Executes a function shortly after the call, but lets the caller continue
  * working (or finish).
  */
 function executeSoon(aFunc)
 {
   let tm = Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager);
-  
+
   tm.mainThread.dispatch({
     run: function()
     {
       aFunc();
     }
   }, Ci.nsIThread.DISPATCH_NORMAL);
 }
+
+/**
+ * Adds a live download to the download manager.
+ *
+ * @param [optional] aName
+ *        The name that will be assigned to the downloaded file.
+ * @returns an instance of nsIDownload.
+ */
+function addDownload(aName) {
+    function createURI(aObj) {
+      let ios = Cc["@mozilla.org/network/io-service;1"].
+                getService(Ci.nsIIOService);
+      return (aObj instanceof Ci.nsIFile) ? ios.newFileURI(aObj) :
+                                            ios.newURI(aObj, null, null);
+    }
+
+    function randomString() {
+      let chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
+      let string_length = 8;
+      let randomstring = "";
+      for (let i=0; i<string_length; i++) {
+        let rnum = Math.floor(Math.random() * chars.length);
+        randomstring += chars.substring(rnum, rnum+1);
+      }
+      return randomstring;
+    }
+
+    let dm = Cc["@mozilla.org/download-manager;1"].
+             getService(Ci.nsIDownloadManager);
+    const nsIWBP = Ci.nsIWebBrowserPersist;
+    let persist = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"]
+                  .createInstance(Ci.nsIWebBrowserPersist);
+    persist.persistFlags = nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
+                           nsIWBP.PERSIST_FLAGS_BYPASS_CACHE |
+                           nsIWBP.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
+    let dirSvc = Cc["@mozilla.org/file/directory_service;1"].
+                 getService(Ci.nsIProperties);
+    let dmFile = dirSvc.get("TmpD", Ci.nsIFile);
+    dmFile.append(aName || ("dm-test-file-" + randomString()));
+    if (dmFile.exists())
+      throw "Download file already exists";
+
+    let dl = dm.addDownload(Ci.nsIDownloadManager.DOWNLOAD_TYPE_DOWNLOAD,
+                            createURI("http://example.com/httpd.js"),
+                            createURI(dmFile), null, null,
+                            Math.round(Date.now() * 1000), null, persist);
+
+    persist.progressListener = dl.QueryInterface(Ci.nsIWebProgressListener);
+    persist.saveURI(dl.source, null, null, null, null, dl.targetFile);
+
+    return dl;
+  }
+
+/**
+ * Used to populate the dm with dummy download data.
+ *
+ * @param aDownloadData
+ *        An array that contains the dummy download data to be added to the DM.
+ *        Expected fields are:
+ *          name, source, target, startTime, endTime, state, currBytes,
+ *          maxBytes, preferredAction, and autoResume
+ */
+function populateDM(DownloadData)
+{
+  let dm = Cc["@mozilla.org/download-manager;1"].
+           getService(Ci.nsIDownloadManager);
+  let db = dm.DBConnection;
+
+  let rawStmt = db.createStatement(
+    "INSERT INTO moz_downloads (name, source, target, startTime, endTime, " +
+      "state, currBytes, maxBytes, preferredAction, autoResume) " +
+    "VALUES (:name, :source, :target, :startTime, :endTime, :state, " +
+      ":currBytes, :maxBytes, :preferredAction, :autoResume)");
+  let stmt = Cc["@mozilla.org/storage/statement-wrapper;1"].
+             createInstance(Ci.mozIStorageStatementWrapper)
+  stmt.initialize(rawStmt);
+  for each (let dl in DownloadData) {
+    for (let prop in dl)
+      stmt.params[prop] = dl[prop];
+
+    stmt.execute();
+  }
+  stmt.statement.finalize();
+}
+
+/**
+ * Returns an instance to the download manager window
+ *
+ * @return an instance of nsIDOMWindowInternal
+ */
+function getDMWindow()
+{
+  return Cc["@mozilla.org/appshell/window-mediator;1"].
+         getService(Ci.nsIWindowMediator).
+         getMostRecentWindow("Download:Manager");
+}
+
+/**
+ * Establishes a clean state to run a test in by removing everything from the
+ * database and ensuring that the download manager's window is not open.
+ */
+function setCleanState()
+{
+  let dm = Cc["@mozilla.org/download-manager;1"].
+           getService(Ci.nsIDownloadManager);
+
+  // Clean the dm
+  dm.DBConnection.executeSimpleSQL("DELETE FROM moz_downloads");
+
+  let win = getDMWindow();
+  if (win) win.close();
+}