3. test patch 1 - Bug 386760 - directory removal with software update. r=mossop
authorRobert Strong <robert.bugzilla@gmail.com>
Mon, 11 Apr 2011 21:23:36 -0700
changeset 67957 8d0f07c4f8b7142df7def815bf21ac06c663ba6b
parent 67956 860d857e899db6f7512a7a873c47391bdfafa16b
child 67958 47ceb2f1aac92dd2894fea5894ac616a07b513ae
push id1
push userroot
push dateTue, 26 Apr 2011 22:38:44 +0000
treeherdermozilla-beta@bfdb6e623a36 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmossop
bugs3, 386760
milestone2.2a1pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
3. test patch 1 - Bug 386760 - directory removal with software update. r=mossop
toolkit/mozapps/update/test/TestAUSHelper.cpp
toolkit/mozapps/update/test/unit/data/complete.mar
toolkit/mozapps/update/test/unit/data/partial.mar
toolkit/mozapps/update/test/unit/data/partial_in_use_win.mar
toolkit/mozapps/update/test/unit/data/partial_in_use_win_after.exe
toolkit/mozapps/update/test/unit/data/partial_in_use_win_before.exe
toolkit/mozapps/update/test/unit/head_update.js.in
toolkit/mozapps/update/test/unit/test_0110_general.js
toolkit/mozapps/update/test/unit/test_0111_general.js
toolkit/mozapps/update/test/unit/test_0112_general.js
toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_unix_complete.js
toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_win_complete.js
toolkit/mozapps/update/test/unit/test_0170_fileLocked_xp_win_complete.js
toolkit/mozapps/update/test/unit/test_0171_fileLocked_xp_win_partial.js
toolkit/mozapps/update/test/unit/test_0180_fileInUse_xp_win_complete.js
toolkit/mozapps/update/test/unit/test_0181_fileInUse_xp_win_partial.js
toolkit/mozapps/update/test/unit/test_0182_rmrfdirFileInUse_xp_win_complete.js
toolkit/mozapps/update/test/unit/test_0183_rmrfdirFileInUse_xp_win_partial.js
--- a/toolkit/mozapps/update/test/TestAUSHelper.cpp
+++ b/toolkit/mozapps/update/test/TestAUSHelper.cpp
@@ -3,121 +3,236 @@
  */
 
 #ifdef XP_WIN
 # include <windows.h>
 # include <direct.h>
 # include <io.h>
   typedef WCHAR NS_tchar;
 # define NS_main wmain
+# define F_OK 00
+# define W_OK 02
+# define R_OK 04
+# define stat _stat
 # define NS_T(str) L ## str
 # define NS_tsnprintf(dest, count, fmt, ...) \
+  { \
     int _count = count - 1; \
     _snwprintf(dest, _count, fmt, ##__VA_ARGS__); \
-    dest[_count] = L'\0';
+    dest[_count] = L'\0'; \
+  }
+# define NS_taccess _waccess
+# define NS_tchdir _wchdir
 # define NS_tfopen _wfopen
 # define NS_tstrcmp wcscmp
 # define NS_ttoi _wtoi
+# define NS_tstat _wstat
 # define LOG_S "%S"
 #else
 # include <unistd.h>
 # define NS_main main
   typedef char NS_tchar;
 # define NS_T(str) str
 # define NS_tsnprintf snprintf
+# define NS_taccess access
+# define NS_tchdir chdir
 # define NS_tfopen fopen
 # define NS_tstrcmp strcmp
 # define NS_ttoi atoi
+# define NS_tstat stat
 # define LOG_S "%s"
 #endif
 
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
 
 #ifndef MAXPATHLEN
 # ifdef PATH_MAX
 #  define MAXPATHLEN PATH_MAX
 # elif defined(MAX_PATH)
 #  define MAXPATHLEN MAX_PATH
 # elif defined(_MAX_PATH)
 #  define MAXPATHLEN _MAX_PATH
 # elif defined(CCHMAXPATH)
 #  define MAXPATHLEN CCHMAXPATH
 # else
 #  define MAXPATHLEN 1024
 # endif
 #endif
 
+static void
+WriteMsg(const NS_tchar *path, const char *status)
+{
+  FILE* outFP = NS_tfopen(path, NS_T("wb"));
+  if (!outFP)
+    return;
+
+  fprintf(outFP, "%s\n", status);
+  fclose(outFP);
+  outFP = NULL;
+}
+
+static bool
+CheckMsg(const NS_tchar *path, const char *expected)
+{
+  if (NS_taccess(path, F_OK)) {
+    return false;
+  }
+
+  FILE *inFP = NS_tfopen(path, NS_T("rb"));
+  if (!inFP) {
+    return false;
+  }
+
+  struct stat ms;
+  if (fstat(fileno(inFP), &ms)) {
+    return false;
+  }
+
+  char *mbuf = (char *) malloc(ms.st_size + 1);
+  if (!mbuf) {
+    return false;
+  }
+
+  size_t r = ms.st_size;
+  char *rb = mbuf;
+  size_t c = fread(rb, sizeof(char), 50, inFP);
+  r -= c;
+  rb += c;
+  if (c == 0 && r) {
+    return false;
+  }
+  mbuf[ms.st_size] = '\0';
+  rb = mbuf;
+
+  fclose(inFP);
+  inFP = NULL;
+  return strcmp(rb, expected) == 0;
+}
+
 int NS_main(int argc, NS_tchar **argv)
 {
 
-  if (argc < 2) {
+  if (argc < 3) {
     fprintf(stderr, \
             "\n" \
             "Application Update Service Test Helper\n" \
             "\n" \
-            "Usage: -s SECONDS [LOCKTYPE FILETOLOCK]\n"  \
-            "   or: LOGFILE [ARG2 ARG3...]\n" \
+            "Usage: WORKINGDIR INFILE OUTFILE -s SECONDS [FILETOLOCK]\n"  \
+            "   or: WORKINGDIR LOGFILE [ARG2 ARG3...]\n" \
             "\n" \
+            "  WORKINGDIR  \tThe relative path to the working directory to use.\n" \
+            "  INFILE      \tThe relative path from the working directory for the file to\n" \
+            "              \tread actions to perform such as finish.\n" \
+            "  OUTFILE     \tThe relative path from the working directory for the file to\n" \
+            "              \twrite status information.\n" \
             "  SECONDS     \tThe number of seconds to sleep.\n" \
-            "  FILETOLOCK  \tThe relative path to an existing file to open exlusively.\n" \
-            "              \tOnly available on Windows platforms and silently ignored on" \
+            "  FILETOLOCK  \tThe relative path from the working directory to an existing\n" \
+            "              \tfile to open exlusively.\n" \
+            "              \tOnly available on Windows platforms and silently ignored on\n" \
             "              \tother platforms.\n" \
-            "  LOGFILE     \tThe file path relative to the working directory to log the\n" \
-            "              \targuments passed to.\n" \
-            "  ARG2 ARG3...\tArguments to write to the log file.\n" \
+            "  LOGFILE     \tThe relative path from the working directory to log the\n" \
+            "              \tcommand line arguments.\n" \
+            "  ARG2 ARG3...\tArguments to write to the LOGFILE after the preceding command\n" \
+            "              \tline arguments.\n" \
             "\n" \
-            "All paths should be relative since paths in a build environment can have a\n" \
-            "path length that is larger than the maximum path length on Windows.\n" \
+            "Note: All paths must be relative.\n" \
             "\n");
     return 1;
   }
 
+  int i = 0;
+
+#ifdef WINCE
+  NS_tchar cwd[MAXPATHLEN];
+  if (argv[1][wcslen(argv[1]) - 1] != NS_T('/') &&
+      argv[1][wcslen(argv[1]) - 1] != NS_T('\\')) {
+    NS_tsnprintf(cwd, sizeof(cwd)/sizeof(cwd[0]),
+                 NS_T("%s"), argv[1]);
+  } else {
+    NS_tsnprintf(cwd, sizeof(cwd)/sizeof(cwd[0]),
+                 NS_T("%s/"), argv[1]);
+  }
+#else
+  if (NS_tchdir(argv[1]) != 0) {
+    return 1;
+  }
+#endif
+
   // File in use test helper section
-  if (NS_tstrcmp(argv[1], NS_T("-s")) == 0) {
+  if (!NS_tstrcmp(argv[4], NS_T("-s"))) {
+#ifdef WINCE
+    NS_tchar inFilePath[MAXPATHLEN];
+    NS_tsnprintf(inFilePath, sizeof(inFilePath)/sizeof(inFilePath[0]),
+                 NS_T("%s%s"), cwd, argv[2]);
+    NS_tchar outFilePath[MAXPATHLEN];
+    NS_tsnprintf(outFilePath, sizeof(outFilePath)/sizeof(outFilePath[0]),
+                 NS_T("%s%s"), cwd, argv[3]);
+#else
+    NS_tchar inFilePath[MAXPATHLEN];
+    NS_tsnprintf(inFilePath, sizeof(inFilePath)/sizeof(inFilePath[0]),
+                 NS_T("%s"), argv[2]);
+    NS_tchar outFilePath[MAXPATHLEN];
+    NS_tsnprintf(outFilePath, sizeof(outFilePath)/sizeof(outFilePath[0]),
+                 NS_T("%s"), argv[3]);
+#endif
+
+    int seconds = NS_ttoi(argv[5]);
 #ifdef XP_WIN
-    int milliseconds = NS_ttoi(argv[2]) * 1000;
     HANDLE hFile = INVALID_HANDLE_VALUE;
-    if (argc == 4) {
-      hFile = CreateFileW(argv[3],
+    if (argc == 7) {
 #ifdef WINCE
+      NS_tchar lockfile[MAXPATHLEN];
+      NS_tsnprintf(lockfile, sizeof(lockfile)/sizeof(lockfile[0]),
+                   NS_T("%s%s"), cwd, argv[6]);
+      hFile = CreateFileW(lockfile,
                           GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
 #else
+      hFile = CreateFileW(argv[6],
                           DELETE | GENERIC_WRITE, 0,
 #endif
                           NULL, OPEN_EXISTING, 0, NULL);
       if (hFile == INVALID_HANDLE_VALUE) {
+        WriteMsg(outFilePath, "error_locking");
         return 1;
       }
     }
 
-    Sleep(milliseconds);
+    WriteMsg(outFilePath, "sleeping");
+    while (!CheckMsg(inFilePath, "finish\n") && i++ <= seconds)  {
+      Sleep(1000);
+    }
 
-    if (argc == 5) {
+    if (argc == 7) {
       CloseHandle(hFile);
     }
 #else
-    int seconds = NS_ttoi(argv[2]);
-    sleep(seconds);
+    WriteMsg(outFilePath, "sleeping");
+    while (!CheckMsg(inFilePath, "finish\n") && i++ <= seconds)  {
+      sleep(1);
+    }
 #endif
+    WriteMsg(outFilePath, "finished");
     return 0;
   }
 
   // Command line argument test helper section
   NS_tchar logFilePath[MAXPATHLEN];
-
+#ifdef WINCE
   NS_tsnprintf(logFilePath, sizeof(logFilePath)/sizeof(logFilePath[0]),
-               NS_T("%s"), argv[1]);
+               NS_T("%s%s"), cwd, argv[2]);
+#else
+  NS_tsnprintf(logFilePath, sizeof(logFilePath)/sizeof(logFilePath[0]),
+               NS_T("%s"), argv[2]);
+#endif
 
-  FILE* logFP = NS_tfopen(logFilePath, NS_T("w"));
-
-  fprintf(logFP, "executed\n");
-
-  int i;
+  FILE* logFP = NS_tfopen(logFilePath, NS_T("wb"));
   for (i = 1; i < argc; ++i) {
     fprintf(logFP, LOG_S "\n", argv[i]);
   }
 
   fclose(logFP);
   logFP = NULL;
 
   return 0;
index 2cd8c3068d262580dd9c05bbf6491a9def7174a5..941cc988f1401c648de9d29e7579357aff6505bf
GIT binary patch
literal 4263
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
index 44b0766fdae6cdbfeff66bf7b80fd799ea5bea13..e3957f5c8245139448b4f1ecb09a24c1266b019d
GIT binary patch
literal 3751
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
index e4d1e27d2e8e2eb9551f097e9cde8ae520d34dce..9427ea35dfb7606cb72cf93ac91450fae7c95a36
GIT binary patch
literal 2173
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
bqtGVG3=*sVh(+4~{vQF&hDL?vrip(8uOU&*
index b8a25fab661316b90ddfc0060fd74050479b7c08..3949fd2a0ec1df1e891997991876781b0ad23d3e
GIT binary patch
literal 79872
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
index fe74dddc81b397f5de54ae2727d7b0591d50eba9..13443160e22128aed7cd030502c750721f6e3357
GIT binary patch
literal 79872
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
--- a/toolkit/mozapps/update/test/unit/head_update.js.in
+++ b/toolkit/mozapps/update/test/unit/head_update.js.in
@@ -79,41 +79,199 @@ const IS_UNIX = false;
 const IS_ANDROID = true;
 #else
 const IS_ANDROID = false;
 #endif
 
 const URL_HOST = "http://localhost:4444/";
 const URL_PATH = "data";
 
-const AFTER_APPLY_DIR = "afterApplyDir";
-const APPLY_TO_DIR_SUFFIX = "_applyToDir";
+const APPLY_TO_DIR_SUFFIX = "_applyToDir/";
 const HELPER_BIN_FILE = "TestAUSHelper" + BIN_SUFFIX;
 const MAR_COMPLETE_FILE = "data/complete.mar";
 const MAR_PARTIAL_FILE = "data/partial.mar";
 const UPDATER_BIN_FILE = "updater" + BIN_SUFFIX;
 const UPDATES_DIR_SUFFIX = "_mar";
+const APPLY_DIR_RELPATH = "a/b/";
 
 const CALLBACK_BIN_FILE = "callback_app" + BIN_SUFFIX;
-const CALLBACK_ARGS = [AFTER_APPLY_DIR + "/output.log", "Test Arg 2", "Test Arg 3"];
+const CALLBACK_ARGS = ["./", "callback.log", "Test Arg 2", "Test Arg 3"];
+
+// Time to wait for the test helper process before continuing the test
+const TEST_HELPER_TIMEOUT = 100;
 
 var gTestserver;
 
 var gXHR;
 var gXHRCallback;
 
 var gCheckFunc;
 var gResponseBody;
 var gResponseStatusCode = 200;
 var gRequestURL;
 var gUpdateCount;
 var gUpdates;
 var gStatusCode;
 var gStatusText;
 
+/**
+ * The mar files used for the updater tests contain the following remove
+ * operations.
+ *
+ * partial and complete test mar remove operations
+ * -----------------------------------------------
+ * remove "text1"
+ * remove "text0"
+ * rmrfdir "9/99/"
+ * rmdir "9/99/"
+ * rmrfdir "9/98/"
+ * rmrfdir "9/97/"
+ * rmrfdir "9/96/"
+ * rmrfdir "9/95/"
+ * rmrfdir "9/95/"
+ * rmrfdir "9/94/"
+ * rmdir "9/94/"
+ * rmdir "9/93/"
+ * rmdir "9/92/"
+ * rmdir "9/91/"
+ * rmdir "9/90/"
+ * rmdir "9/90/"
+ * rmrfdir "8/89/"
+ * rmdir "8/89/"
+ * rmrfdir "8/88/"
+ * rmrfdir "8/87/"
+ * rmrfdir "8/86/"
+ * rmrfdir "8/85/"
+ * rmrfdir "8/85/"
+ * rmrfdir "8/84/"
+ * rmdir "8/84/"
+ * rmdir "8/83/"
+ * rmdir "8/82/"
+ * rmdir "8/81/"
+ * rmdir "8/80/"
+ * rmdir "8/80/"
+ * rmrfdir "7/"
+ * rmdir "6/"
+ * remove "5/text1"
+ * remove "5/text0"
+ * rmrfdir "5/"
+ * remove "4/text1"
+ * remove "4/text0"
+ * remove "4/exe0.exe"
+ * rmdir "4/"
+ * remove "3/text1"
+ * remove "3/text0"
+ *
+ * partial test mar additional remove operations
+ * ---------------------------------------------
+ * remove "0/00/00text1"
+ * remove "1/10/10text0"
+ * rmdir "1/10/"
+ * rmdir "1/"
+ */
+var TEST_DIRS = [
+{
+  relPathDir   : "3/",
+  dirRemoved   : false,
+  files        : ["text0", "text1"],
+  filesRemoved : true
+}, {
+  relPathDir   : "4/",
+  dirRemoved   : true,
+  files        : ["text0", "text1"],
+  filesRemoved : true
+}, {
+  relPathDir   : "5/",
+  dirRemoved   : true,
+  files        : ["test.exe", "text0", "text1"],
+  filesRemoved : true
+}, {
+  relPathDir   : "6/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "7/",
+  dirRemoved   : true,
+  files        : ["text0", "text1"],
+  subDirs      : ["70/", "71/"],
+  subDirFiles  : ["test.exe", "text0", "text1"]
+}, {
+  relPathDir   : "8/",
+  dirRemoved   : false
+}, {
+  relPathDir   : "8/80/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "8/81/",
+  dirRemoved   : false,
+  files        : ["text0", "text1"]
+}, {
+  relPathDir   : "8/82/",
+  dirRemoved   : false,
+  subDirs      : ["820/", "821/"]
+}, {
+  relPathDir   : "8/83/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "8/84/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "8/85/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "8/86/",
+  dirRemoved   : true,
+  files        : ["text0", "text1"]
+}, {
+  relPathDir   : "8/87/",
+  dirRemoved   : true,
+  subDirs      : ["870/", "871/"],
+  subDirFiles  : ["text0", "text1"]
+}, {
+  relPathDir   : "8/88/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "8/89/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/90/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/91/",
+  dirRemoved   : false,
+  files        : ["text0", "text1"]
+}, {
+  relPathDir   : "9/92/",
+  dirRemoved   : false,
+  subDirs      : ["920/", "921/"]
+}, {
+  relPathDir   : "9/93/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/94/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/95/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/96/",
+  dirRemoved   : true,
+  files        : ["text0", "text1"]
+}, {
+  relPathDir   : "9/97/",
+  dirRemoved   : true,
+  subDirs      : ["970/", "971/"],
+  subDirFiles  : ["text0", "text1"]
+}, {
+  relPathDir   : "9/98/",
+  dirRemoved   : true
+}, {
+  relPathDir   : "9/99/",
+  dirRemoved   : true
+}];
+
 // Set to true to log additional information for debugging. To log additional
 // information for an individual test set DEBUG_AUS_TEST to true in the test's
 // run_test function.
 var DEBUG_AUS_TEST = true;
 
 #include ../shared.js
 
 /**
@@ -176,63 +334,81 @@ function standardInit() {
 /* Custom path handler for the http server */
 function pathHandler(metadata, response) {
   response.setHeader("Content-Type", "text/xml", false);
   response.setStatusLine(metadata.httpVersion, gResponseStatusCode, "OK");
   response.bodyOutputStream.write(gResponseBody, gResponseBody.length);
 }
 
 /**
+ * Helper function for getting the relative path to the directory where the
+ * update will be applied.
+ *
+ * @return  The relative path to the directory where the update will be applied.
+ */
+function getApplyDirPath() {
+  return TEST_ID + APPLY_TO_DIR_SUFFIX + APPLY_DIR_RELPATH;
+}
+
+/**
+ * Helper function for getting the nsIFile for the directory where the update
+ * will be applied.
+ *
+ * @return  The nsIFile for the directory where the update will be applied.
+ */
+function getApplyDirFile(aRelPath, allowNonexistent) {
+  let relpath = getApplyDirPath() + (aRelPath ? aRelPath : "");
+  return do_get_file(relpath, allowNonexistent);
+}
+
+/**
  * Helper function for updater tests for launching the updater binary to apply
  * a mar file.
  *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
  * @return  The exit value returned from the updater binary.
  */
-function runUpdate(aTestID) {
+function runUpdate() {
   // Copy the updater binary to the updates directory.
   let binDir = getGREDir();
   let updater = binDir.clone();
   updater.append("updater.app");
   if (!updater.exists()) {
     updater = binDir.clone();
     updater.append(UPDATER_BIN_FILE);
     if (!updater.exists()) {
       do_throw("Unable to find updater binary!");
     }
   }
 
-  let updatesDir = do_get_file(aTestID + UPDATES_DIR_SUFFIX, true);
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX, true);
   updater.copyTo(updatesDir, updater.leafName);
   let updateBin = updatesDir.clone();
   updateBin.append(updater.leafName);
   if (updateBin.leafName == "updater.app") {
     updateBin.append("Contents");
     updateBin.append("MacOS");
     updateBin.append("updater");
     if (!updateBin.exists())
       do_throw("Unable to find the updater executable!");
   }
 
   let updatesDirPath = updatesDir.path;
   if (/ /.test(updatesDirPath))
     updatesDirPath = '"' + updatesDirPath + '"';
 
-  let applyToDir = do_get_file(aTestID + APPLY_TO_DIR_SUFFIX, true);
+  let applyToDir = do_get_file(getApplyDirPath(), true);
   let applyToDirPath = applyToDir.path;
   if (/ /.test(applyToDirPath))
     applyToDirPath = '"' + applyToDirPath + '"';
 
   let callbackApp = applyToDir.clone();
-  callbackApp.append(AFTER_APPLY_DIR);
   callbackApp.append(CALLBACK_BIN_FILE);
   callbackApp.permissions = PERMS_DIRECTORY;
 
-  let cwdPath = callbackApp.parent.parent.path;
+  let cwdPath = callbackApp.parent.path;
   if (/ /.test(cwdPath))
     cwdPath = '"' + cwdPath + '"';
 
   let callbackAppPath = callbackApp.path;
   if (/ /.test(callbackAppPath))
     callbackAppPath = '"' + callbackAppPath + '"';
 
   let args = [updatesDirPath, applyToDirPath, 0, cwdPath, callbackAppPath].
@@ -265,314 +441,425 @@ function getLaunchBin() {
   }
 
   if (!launchBin.exists())
     do_throw(launchBin.path + " must exist to run this test!");
 
   return launchBin;
 }
 
+function waitForHelperSleep() {
+  // Give the lock file process time to lock the file before updating otherwise
+  // this test can fail intermittently on Windows debug builds.
+  let output = getApplyDirFile("output", true);
+  if (readFile(output) != "sleeping\n") {
+    do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
+    return;
+  }
+  output.remove(false);
+  do_timeout(TEST_HELPER_TIMEOUT, doUpdate);
+}
+
+function waitForHelperFinished() {
+  // Give the lock file process time to lock the file before updating otherwise
+  // this test can fail intermittently on Windows debug builds.
+  let output = getApplyDirFile("output", true);
+  if (readFile(output) != "finished\n") {
+    do_timeout(TEST_HELPER_TIMEOUT, waitForHelperFinished);
+    return;
+  }
+  output.remove(false);
+  let input = getApplyDirFile("input", true);
+  if (input.exists()) {
+    input.remove(false);
+  }
+  do_timeout(TEST_HELPER_TIMEOUT, checkUpdate);
+}
+
+function setupHelperFinish() {
+  let input = getApplyDirFile("input", true);
+  writeFile(input, "finish\n");
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperFinished);
+}
+
 /**
- * Helper function for updater tests for setting up the files and directories
- * used by the updater tests.
+ * Helper function for updater binary tests for setting up the files and
+ * directories used by the test.
  *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
  * @param   aMarFile
- *          The mar file to copy the update mar to.
- * @param   aTestFiles
- *          An array of JavaScript objects representing the test files to create
- *          for the test.
+ *          The mar file for the update test.
  */
-function setupUpdaterTest(aTestID, aMarFile, aTestFiles) {
+function setupUpdaterTest(aMarFile) {
   // Remove the directory where the updater, mar file, etc. will be copied to
-  let updatesDir = do_get_file(aTestID + UPDATES_DIR_SUFFIX, true);
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX, true);
   try {
     removeDirRecursive(updatesDir);
   }
   catch (e) {
     dump("Unable to remove directory\n" +
          "path: " + updatesDir.path + "\n" +
          "Exception: " + e + "\n");
   }
   if (!updatesDir.exists()) {
     updatesDir.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
   }
 
   // Remove the directory where the update will be applied if it exists.
-  let applyToDir = do_get_file(aTestID + APPLY_TO_DIR_SUFFIX, true);
+  let applyToDir = getApplyDirFile(null, true);
   try {
     removeDirRecursive(applyToDir);
   }
   catch (e) {
     dump("Unable to remove directory\n" +
          "path: " + applyToDir.path + "\n" +
          "Exception: " + e + "\n");
   }
   logTestInfo("testing successful removal of the directory used to apply the " +
               "mar file");
   do_check_false(applyToDir.exists());
 
   // Add the test files that will be updated for a successful update or left in
   // the initial state for a failed update.
-  for (let i = 0; i < aTestFiles.length; i++) {
-    let f = aTestFiles[i];
-    if (f.originalFile || f.originalContents) {
-      let testDir = do_get_file(f.destinationDir, true);
+  TEST_FILES.forEach(function SUT_TF_FE(aTestFile) {
+    if (aTestFile.originalFile || aTestFile.originalContents) {
+      let testDir = getApplyDirFile(aTestFile.relPathDir, true);
       if (!testDir.exists())
         testDir.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
 
       let testFile;
-      if (f.originalFile) {
-        testFile = do_get_file(f.originalFile);
-        testFile.copyTo(testDir, f.fileName);
-        testFile = do_get_file(f.destinationDir + f.fileName);
+      if (aTestFile.originalFile) {
+        testFile = do_get_file(aTestFile.originalFile);
+        testFile.copyTo(testDir, aTestFile.fileName);
+        testFile = getApplyDirFile(aTestFile.relPathDir + aTestFile.fileName);
       }
       else {
-        testFile = do_get_file(f.destinationDir + f.fileName, true);
-        writeFile(testFile, f.originalContents);
+        testFile = getApplyDirFile(aTestFile.relPathDir + aTestFile.fileName, true);
+        writeFile(testFile, aTestFile.originalContents);
       }
 
       // Skip these tests on Windows (includes WinCE) and OS/2 since their
       // implementaions of chmod doesn't really set permissions.
-      if (!IS_WIN && !IS_OS2 && f.originalPerms) {
-        testFile.permissions = f.originalPerms;
+      if (!IS_WIN && !IS_OS2 && aTestFile.originalPerms) {
+        testFile.permissions = aTestFile.originalPerms;
         // Store the actual permissions on the file for reference later after
         // setting the permissions.
-        if (!f.comparePerms)
-          f.comparePerms = testFile.permissions;
+        if (!aTestFile.comparePerms)
+          aTestFile.comparePerms = testFile.permissions;
       }
     }
-  }
-
-  let afterApplyBinDir = applyToDir.clone();
-  afterApplyBinDir.append(AFTER_APPLY_DIR);
+  });
 
   let helperBin = do_get_file(HELPER_BIN_FILE);
+  let afterApplyBinDir = applyToDir.clone();
   helperBin.copyTo(afterApplyBinDir, CALLBACK_BIN_FILE);
 
   let updaterIniContents = "[Strings]\n" +
                            "Title=Update XPCShell Test\n" +
-                           "Info=Application Update Test - " + aTestID + "\n";
+                           "Info=Application Update Test - " + TEST_ID + "\n";
   let updaterIni = updatesDir.clone();
   updaterIni.append(FILE_UPDATER_INI);
   writeFile(updaterIni, updaterIniContents);
   updaterIni.copyTo(afterApplyBinDir, FILE_UPDATER_INI);
 
   // Copy the mar that will be applied
   let mar = do_get_file(aMarFile);
   mar.copyTo(updatesDir, FILE_UPDATE_ARCHIVE);
+
+  // Add the test directory that will be updated for a successful update or left in
+  // the initial state for a failed update.
+  TEST_DIRS.forEach(function SUT_TD_FE(aTestDir) {
+    let testDir = getApplyDirFile(aTestDir.relPathDir, true);
+    if (!testDir.exists()) {
+      testDir.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
+    }
+
+    if (aTestDir.files) {
+      aTestDir.files.forEach(function SUT_TD_F_FE(aTestFile) {
+        let testFile = getApplyDirFile(aTestDir.relPathDir + aTestFile, true);
+        if (!testFile.exists()) {
+          testFile.create(AUS_Ci.nsIFile.FILE_TYPE, PERMS_FILE);
+        }
+      });
+    }
+
+    if (aTestDir.subDirs) {
+      aTestDir.subDirs.forEach(function SUT_TD_SD_FE(aSubDir) {
+        let testSubDir = getApplyDirFile(aTestDir.relPathDir + aSubDir, true);
+        if (!testSubDir.exists()) {
+          testSubDir.create(AUS_Ci.nsIFile.DIRECTORY_TYPE, PERMS_DIRECTORY);
+        }
+
+        if (aTestDir.subDirFiles) {
+          aTestDir.subDirFiles.forEach(function SUT_TD_SDF_FE(aTestFile) {
+            let testFile = getApplyDirFile(aTestDir.relPathDir + aSubDir + aTestFile, true);
+            if (!testFile.exists()) {
+              testFile.create(AUS_Ci.nsIFile.FILE_TYPE, PERMS_FILE);
+            }
+          });
+        }
+      });
+    }
+  });
 }
 
 /**
- * Helper function for updater tests for cleaning up the state after an updater
- * test has finished.
- *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
+ * Helper function for updater binary tests to clean up the state after the test
+ * has finished.
  */
-function cleanupUpdaterTest(aTestID) {
-  let updatesDir = do_get_file(aTestID + UPDATES_DIR_SUFFIX, true);
+function cleanupUpdaterTest() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX, true);
   try {
     removeDirRecursive(updatesDir);
   }
   catch (e) {
     dump("Unable to remove directory\n" +
          "path: " + updatesDir.path + "\n" +
          "Exception: " + e + "\n");
   }
 
   // Try to remove the updates and the apply to directories.
-  let applyToDir = do_get_file(aTestID + APPLY_TO_DIR_SUFFIX, true);
+  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX, true);
   try {
     removeDirRecursive(applyToDir);
   }
   catch (e) {
     dump("Unable to remove directory\n" +
          "path: " + applyToDir.path + "\n" +
          "Exception: " + e + "\n");
   }
 
   cleanUp();
 }
 
 /**
- * Helper function for updater tests for verifying the state of files and
+ * Helper function for updater binary tests for verifying the state of files and
  * directories after a successful update.
- *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
- * @param   aTestFiles
- *          An array of JavaScript objects representing the test files to create
- *          for the test.
  */
-function checkFilesAfterUpdateSuccess(aTestID, aTestFiles) {
+function checkFilesAfterUpdateSuccess() {
   logTestInfo("testing contents of files after a successful update");
-  for (let i = 0; i < aTestFiles.length; i++) {
-    let f = aTestFiles[i];
-    let testFile = do_get_file(f.destinationDir + f.fileName, true);
+  TEST_FILES.forEach(function CFAUS_TF_FE(aTestFile) {
+    let testFile = getApplyDirFile(aTestFile.relPathDir + aTestFile.fileName, true);
     logTestInfo("testing file: " + testFile.path);
-    if (f.compareFile || f.compareContents) {
+    if (aTestFile.compareFile || aTestFile.compareContents) {
       do_check_true(testFile.exists());
 
       // Skip these tests on Windows (includes WinCE) and OS/2 since their
       // implementaions of chmod doesn't really set permissions.
-      if (!IS_WIN && !IS_OS2 && f.comparePerms) {
+      if (!IS_WIN && !IS_OS2 && aTestFile.comparePerms) {
         // Check if the permssions as set in the complete mar file are correct.
         let logPerms = "testing file permissions - ";
-        if (f.originalPerms) {
-          logPerms += "original permissions: " + f.originalPerms.toString(8) + ", ";
+        if (aTestFile.originalPerms) {
+          logPerms += "original permissions: " + aTestFile.originalPerms.toString(8) + ", ";
         }
-        logPerms += "compare permissions : " + f.comparePerms.toString(8) + ", ";
+        logPerms += "compare permissions : " + aTestFile.comparePerms.toString(8) + ", ";
         logPerms += "updated permissions : " + testFile.permissions.toString(8);
         logTestInfo(logPerms);
-        do_check_eq(testFile.permissions & 0xfff, f.comparePerms & 0xfff);
+        do_check_eq(testFile.permissions & 0xfff, aTestFile.comparePerms & 0xfff);
       }
 
-      if (f.compareFile) {
+      if (aTestFile.compareFile) {
         do_check_eq(readFileBytes(testFile),
-                    readFileBytes(do_get_file(f.compareFile)));
-        if (f.originalFile) {
+                    readFileBytes(do_get_file(aTestFile.compareFile)));
+        if (aTestFile.originalFile) {
           // Verify that readFileBytes returned the entire contents by checking
           // the contents against the original file.
           do_check_neq(readFileBytes(testFile),
-                       readFileBytes(do_get_file(f.originalFile)));
+                       readFileBytes(do_get_file(aTestFile.originalFile)));
         }
       }
       else {
-        do_check_eq(readFileBytes(testFile), f.compareContents);
+        do_check_eq(readFileBytes(testFile), aTestFile.compareContents);
       }
     }
     else {
       do_check_false(testFile.exists());
     }
-  }
+  });
+
+  logTestInfo("testing operations specified in removed-files were performed " +
+              "after a successful update");
+  TEST_DIRS.forEach(function CFAUS_TD_FE(aTestDir) {
+    let testDir = getApplyDirFile(aTestDir.relPathDir, true);
+    logTestInfo("testing directory: " + testDir.path);
+    if (aTestDir.dirRemoved) {
+      do_check_false(testDir.exists());
+    }
+    else {
+      do_check_true(testDir.exists());
 
-  checkFilesAfterUpdateCommon(aTestID);
+      if (aTestDir.files) {
+        aTestDir.files.forEach(function CFAUS_TD_F_FE(aTestFile) {
+          let testFile = getApplyDirFile(aTestDir.relPathDir + aTestFile, true);
+          logTestInfo("testing directory file: " + testFile.path);
+          if (aTestDir.filesRemoved) {
+            do_check_false(testFile.exists());
+          }
+          else {
+            do_check_true(testFile.exists());
+          }
+        });
+      }
+
+      if (aTestDir.subDirs) {
+        aTestDir.subDirs.forEach(function CFAUS_TD_SD_FE(aSubDir) {
+          let testSubDir = getApplyDirFile(aTestDir.relPathDir + aSubDir, true);
+          logTestInfo("testing sub-directory: " + testSubDir.path);
+          do_check_true(testSubDir.exists());
+          if (aTestDir.subDirFiles) {
+            aTestDir.subDirFiles.forEach(function CFAUS_TD_SDF_FE(aTestFile) {
+              let testFile = getApplyDirFile(aTestDir.relPathDir + aSubDir + aTestFile, true);
+              logTestInfo("testing sub-directory file: " + testFile.path);
+              do_check_true(testFile.exists());
+            });
+          }
+        });
+      }
+    }
+  });
+
+  checkFilesAfterUpdateCommon();
 }
 
 /**
- * Helper function for updater tests for verifying the state of files and
+ * Helper function for updater binary tests for verifying the state of files and
  * directories after a failed update.
- *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
- * @param   aTestFiles
- *          An array of JavaScript objects representing the test files to create
- *          for the test.
  */
-function checkFilesAfterUpdateFailure(aTestID, aTestFiles) {
+function checkFilesAfterUpdateFailure() {
   logTestInfo("testing contents of files after a failed update");
-  for (let i = 0; i < aTestFiles.length; i++) {
-    let f = aTestFiles[i];
-    let testFile = do_get_file(f.destinationDir + f.fileName, true);
+  TEST_FILES.forEach(function CFAUF_TF_FE(aTestFile) {
+    let testFile = getApplyDirFile(aTestFile.relPathDir + aTestFile.fileName, true);
     logTestInfo("testing file: " + testFile.path);
-    if (f.compareFile || f.compareContents) {
+    if (aTestFile.compareFile || aTestFile.compareContents) {
       do_check_true(testFile.exists());
 
       // Skip these tests on Windows (includes WinCE) and OS/2 since their
       // implementaions of chmod doesn't really set permissions.
-      if (!IS_WIN && !IS_OS2 && f.comparePerms) {
+      if (!IS_WIN && !IS_OS2 && aTestFile.comparePerms) {
         // Check the original permssions are retained on the file.
         let logPerms = "testing file permissions - ";
-        if (f.originalPerms) {
-          logPerms += "original permissions: " + f.originalPerms.toString(8) + ", ";
+        if (aTestFile.originalPerms) {
+          logPerms += "original permissions: " + aTestFile.originalPerms.toString(8) + ", ";
         }
-        logPerms += "compare permissions : " + f.comparePerms.toString(8) + ", ";
+        logPerms += "compare permissions : " + aTestFile.comparePerms.toString(8) + ", ";
         logPerms += "updated permissions : " + testFile.permissions.toString(8);
         logTestInfo(logPerms);
-        do_check_eq(testFile.permissions & 0xfff, f.comparePerms & 0xfff);
+        do_check_eq(testFile.permissions & 0xfff, aTestFile.comparePerms & 0xfff);
       }
 
-      if (f.compareFile) {
+      if (aTestFile.compareFile) {
         do_check_eq(readFileBytes(testFile),
-                    readFileBytes(do_get_file(f.compareFile)));
+                    readFileBytes(do_get_file(aTestFile.compareFile)));
       }
       else {
-        do_check_eq(readFileBytes(testFile), f.compareContents);
+        do_check_eq(readFileBytes(testFile), aTestFile.compareContents);
       }
     }
     else {
       do_check_false(testFile.exists());
     }
-  }
+  });
+
+  logTestInfo("testing operations specified in removed-files were not " +
+              "performed after a failed update");
+  TEST_DIRS.forEach(function CFAUF_TD_FE(aTestDir) {
+    let testDir = getApplyDirFile(aTestDir.relPathDir, true);
+    logTestInfo("testing directory file: " + testDir.path);
+    do_check_true(testDir.exists());
+
+    if (aTestDir.files) {
+      aTestDir.files.forEach(function CFAUS_TD_F_FE(aTestFile) {
+        let testFile = getApplyDirFile(aTestDir.relPathDir + aTestFile, true);
+        logTestInfo("testing directory file: " + testFile.path);
+        do_check_true(testFile.exists());
+      });
+    }
 
-  checkFilesAfterUpdateCommon(aTestID);
+    if (aTestDir.subDirs) {
+      aTestDir.subDirs.forEach(function CFAUS_TD_SD_FE(aSubDir) {
+        let testSubDir = getApplyDirFile(aTestDir.relPathDir + aSubDir, true);
+        logTestInfo("testing sub-directory: " + testSubDir.path);
+        do_check_true(testSubDir.exists());
+        if (aTestDir.subDirFiles) {
+          aTestDir.subDirFiles.forEach(function CFAUS_TD_SDF_FE(aTestFile) {
+            let testFile = getApplyDirFile(aTestDir.relPathDir + aSubDir + aTestFile, true);
+            logTestInfo("testing sub-directory file: " + testFile.path);
+            do_check_true(testFile.exists());
+          });
+        }
+      });
+    }
+  });
+
+  checkFilesAfterUpdateCommon();
 }
 
 /**
- * Helper function for updater tests for verifying patch files and moz-backup
- * files aren't left behind after a successful or failed update.
- *
- * @param   aTestID
- *          A string used to identify the name of directories for a test.
+ * Helper function for updater binary tests for verifying patch files and
+ * moz-backup files aren't left behind after a successful or failed update.
  */
-function checkFilesAfterUpdateCommon(aTestID) {
+function checkFilesAfterUpdateCommon() {
   logTestInfo("testing patch files should not be left behind");
-  let updatesDir = do_get_file(aTestID + UPDATES_DIR_SUFFIX, true);
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX, true);
   let entries = updatesDir.QueryInterface(AUS_Ci.nsIFile).directoryEntries;
   while (entries.hasMoreElements()) {
     let entry = entries.getNext().QueryInterface(AUS_Ci.nsIFile);
     do_check_neq(getFileExtension(entry), "patch");
   }
 
   logTestInfo("testing backup files should not be left behind");
-  let applyToDir = do_get_file(aTestID + APPLY_TO_DIR_SUFFIX, true);
+  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX, true);
   checkFilesInDirRecursive(applyToDir, checkForBackupFiles);
 }
 
 /**
- * Helper function for updater tests for verifying the contents of the updater
- * callback application log which should contain the string executed and the
- * arguments passed to the callback application.
+ * Helper function for updater binary tests for verifying the contents of the
+ * updater callback application log which should contain the arguments passed to
+ * the callback application.
  */
-function checkCallbackAppLog(aTestID) {
-  let appLaunchLog = do_get_file(aTestID + APPLY_TO_DIR_SUFFIX + "/" +
-                                 CALLBACK_ARGS[0], true);
+function checkCallbackAppLog() {
+  let appLaunchLog = getApplyDirFile(CALLBACK_ARGS[1], true);
   if (!appLaunchLog.exists()) {
-    do_execute_soon(function() {
-      checkCallbackAppLog(aTestID);
-    });
+    do_timeout(TEST_HELPER_TIMEOUT, checkCallbackAppLog);
     return;
   }
 
-  let expectedLogContents = "executed\n" + CALLBACK_ARGS.join("\n") + "\n";
-  let logContents = readFile(appLaunchLog).replace(/\r\n/g, "\n");
+  let expectedLogContents = CALLBACK_ARGS.join("\n") + "\n";
+  let logContents = readFile(appLaunchLog);
   // It is possible for the log file contents check to occur before the log file
   // contents are completely written so wait until the contents are the expected
   // value. If the contents are never the expected value then the test will
   // fail by timing out.
   if (logContents != expectedLogContents) {
-    do_execute_soon(function() {
-      checkCallbackAppLog(aTestID);
-    });
+    do_timeout(TEST_HELPER_TIMEOUT, checkCallbackAppLog);
     return;
   }
 
   logTestInfo("testing that the callback application successfully launched " +
               "and the expected command line arguments passed to it");
   do_check_eq(logContents, expectedLogContents);
 
-  do_test_finished();
+  // Use a timeout to give any files that were in use additional time to close.
+  do_timeout(TEST_HELPER_TIMEOUT, do_test_finished);
 }
 
 /**
- * Helper function for updater tests for verifying there are no update backup
- * files left behind after an update.
+ * Helper function for updater binary tests for verifying there are no update
+ * backup files left behind after an update.
  *
  * @param   aFile
  *          An nsIFile to check if it has moz-backup for its extension.
  */
 function checkForBackupFiles(aFile) {
   do_check_neq(getFileExtension(aFile), "moz-backup");
 }
 
 /**
- * Helper function for updater tests for recursively enumerating a directory and
- * calls a callback function with the file as a parameter for each file found.
+ * Helper function for updater binary tests for recursively enumerating a
+ * directory and calling a callback function with the file as a parameter for
+ * each file found.
  *
  * @param   aDir
  *          A nsIFile for the directory to be deleted
  * @param   aCallback
  *          A callback function that will be called with the file as a
  *          parameter for each file found.
  */
 function checkFilesInDirRecursive(aDir, aCallback) {
--- a/toolkit/mozapps/update/test/unit/test_0110_general.js
+++ b/toolkit/mozapps/update/test/unit/test_0110_general.js
@@ -42,97 +42,96 @@ const TEST_ID = "0110";
 // All we care about is that the last modified time has changed so that Mac OS
 // X Launch Services invalidates its cache so the test allows up to one minute
 // difference in the last modified time.
 const MAX_TIME_DIFFERENCE = 60000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : null,
   compareFile      : "data/complete.png",
   originalPerms    : 0776,
   comparePerms     : 0644
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeModified\n",
   compareContents  : "ToBeModified\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0775,
   comparePerms     : 0644
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0677,
   comparePerms     : 0644
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/complete.png",
   originalPerms    : 0777,
   comparePerms     : 0755
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0767,
   comparePerms     : 0644
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial.png",
+  compareFile      : "data/complete.png",
+  originalPerms    : 0777,
+  comparePerms     : 0755
 }];
 
 function run_test() {
   if (IS_ANDROID) {
     logTestInfo("this test is not applicable to Android... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
-
-  setupUpdaterTest(TEST_ID, MAR_COMPLETE_FILE, TEST_FILES);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  // The testUpdate function is used for consistency with the tests that require
-  // a timeout before continuing the test.
-  testUpdate();
-}
+  setupUpdaterTest(MAR_COMPLETE_FILE);
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
   let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   // For Mac OS X set the last modified time for the root directory to a date in
   // the past to test that the last modified time is updated on a successful
   // update (bug 600098).
   if (IS_MACOSX) {
     let now = Date.now();
     let yesterday = now - (1000 * 60 * 60 * 24);
     applyToDir.lastModifiedTime = yesterday;
   }
 
   // apply the complete mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a complete mar");
   do_check_eq(exitValue, 0);
 
   logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
   do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
 
   // For Mac OS X check that the last modified time for a directory has been
@@ -140,17 +139,17 @@ function testUpdate() {
   if (IS_MACOSX) {
     logTestInfo("testing last modified time on the apply to directory has " +
                 "changed after a successful update (bug 600098)");
     let now = Date.now();
     let timeDiff = Math.abs(applyToDir.lastModifiedTime - now);
     do_check_true(timeDiff < MAX_TIME_DIFFERENCE);
   }
 
-  checkFilesAfterUpdateSuccess(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateSuccess();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0111_general.js
+++ b/toolkit/mozapps/update/test/unit/test_0111_general.js
@@ -42,115 +42,114 @@ const TEST_ID = "0111";
 // All we care about is that the last modified time has changed so that Mac OS
 // X Launch Services invalidates its cache so the test allows up to one minute
 // difference in the last modified time.
 const MAX_TIME_DIFFERENCE = 60000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/complete.png",
   compareFile      : "data/partial.png",
   originalPerms    : 0644,
   comparePerms     : null
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeModified\n",
   compareContents  : "Modified\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0644,
   comparePerms     : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ToBeDeleted\n",
   compareContents  : null,
   originalFile     : null,
   compareFile      : null,
   originalPerms    : null,
   comparePerms     : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/complete.png",
   compareFile      : "data/partial.png",
   originalPerms    : 0755,
   comparePerms     : null
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ToBeDeleted\n",
   compareContents  : null,
   originalFile     : null,
   compareFile      : null,
   originalPerms    : null,
   comparePerms     : null
 }, {
-  fileName         : "1_1_text3",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text2",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : "Added\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : null,
   comparePerms     : 0644
 }, {
-  fileName         : "3_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/3/3_1/",
+  fileName         : "20text0",
+  relPathDir       : "2/20/",
   originalContents : null,
   compareContents  : "Added\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : null,
   comparePerms     : 0644
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/complete.png",
+  compareFile      : "data/partial.png",
+  originalPerms    : 0755,
+  comparePerms     : null
 }];
 
 function run_test() {
   if (IS_ANDROID) {
     logTestInfo("this test is not applicable to Android... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
-
-  setupUpdaterTest(TEST_ID, MAR_PARTIAL_FILE, TEST_FILES);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  // The testUpdate function is used for consistency with the tests that require
-  // a timeout before continuing the test.
-  testUpdate();
-}
+  setupUpdaterTest(MAR_PARTIAL_FILE);
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
   let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   // For Mac OS X set the last modified time for the root directory to a date in
   // the past to test that the last modified time is updated on a successful
   // update (bug 600098).
   if (IS_MACOSX) {
     let now = Date.now();
     let yesterday = now - (1000 * 60 * 60 * 24);
     applyToDir.lastModifiedTime = yesterday;
   }
 
   // apply the partial mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a partial mar");
   do_check_eq(exitValue, 0);
 
   logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
   do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
 
   // For Mac OS X check that the last modified time for a directory has been
@@ -158,23 +157,17 @@ function testUpdate() {
   if (IS_MACOSX) {
     logTestInfo("testing last modified time on the apply to directory has " +
                 "changed after a successful update (bug 600098)");
     let now = Date.now();
     let timeDiff = Math.abs(applyToDir.lastModifiedTime - now);
     do_check_true(timeDiff < MAX_TIME_DIFFERENCE);
   }
 
-  checkFilesAfterUpdateSuccess(TEST_ID, TEST_FILES);
-
-  logTestInfo("testing directory still exists after removal of the last file " +
-              "in the directory (bug 386760)");
-  let testDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
-                            true);
-  do_check_true(testDir.exists());
+  checkFilesAfterUpdateSuccess();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0112_general.js
+++ b/toolkit/mozapps/update/test/unit/test_0112_general.js
@@ -38,85 +38,84 @@
 
 /* General Partial MAR File Patch Apply Failure Test */
 
 const TEST_ID = "0112";
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/complete.png",
   compareFile      : "data/complete.png",
   originalPerms    : 0644,
   comparePerms     : null
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeDeleted\n",
   compareContents  : "ShouldNotBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0644,
   comparePerms     : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeDeleted\n",
   compareContents  : "ShouldNotBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0644,
   comparePerms     : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/partial.png",
   originalPerms    : 0755,
   comparePerms     : null
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ShouldNotBeDeleted\n",
   compareContents  : "ShouldNotBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0644,
   comparePerms     : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial.png",
+  compareFile      : "data/partial.png",
+  originalPerms    : 0755,
+  comparePerms     : null
 }];
 
 function run_test() {
   if (IS_ANDROID) {
     logTestInfo("this test is not applicable to Android... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
-
-  setupUpdaterTest(TEST_ID, MAR_PARTIAL_FILE, TEST_FILES);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  // The testUpdate function is used for consistency with the tests that require
-  // a timeout before continuing the test.
-  testUpdate();
-}
+  setupUpdaterTest(MAR_PARTIAL_FILE);
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
   let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   // For Mac OS X set the last modified time for a directory to a date in the
   // past to test that the last modified time on the directories in not updated
   // when an update fails (bug 600098).
   let lastModTime;
   if (IS_MACOSX) {
     // All we care about is that the last modified time has not changed when an
     // update has failed.
@@ -124,17 +123,17 @@ function testUpdate() {
     lastModTime = now - (1000 * 60 * 60 * 24);
     applyToDir.lastModifiedTime = lastModTime;
     // Set lastModTime to the value the OS returns in case it is different than
     // the value stored by the OS.
     lastModTime = applyToDir.lastModifiedTime;
   }
 
   // apply the partial mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a partial mar");
   do_check_eq(exitValue, 0);
 
   logTestInfo("testing update.status should be " + STATE_FAILED);
   // The update status format for a failure is failed: # where # is the error
   // code for the failure.
   do_check_eq(readStatusFile(updatesDir).split(": ")[0], STATE_FAILED);
@@ -142,17 +141,17 @@ function testUpdate() {
   // For Mac OS X check that the last modified time for a directory has not been
   // updated after a failed update (bug 600098).
   if (IS_MACOSX) {
     logTestInfo("testing last modified time on the apply to directory has " +
                 "not changed after a failed update (bug 600098)");
     do_check_eq(applyToDir.lastModifiedTime, lastModTime);
   }
 
-  checkFilesAfterUpdateFailure(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateFailure();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_unix_complete.js
+++ b/toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_unix_complete.js
@@ -4,132 +4,134 @@
 
 /* Application in use complete MAR file patch apply success test */
 
 const TEST_ID = "0160";
 // All we care about is that the last modified time has changed so that Mac OS
 // X Launch Services invalidates its cache so the test allows up to one minute
 // difference in the last modified time.
 const MAX_TIME_DIFFERENCE = 60000;
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : null,
   compareFile      : "data/complete.png",
   originalPerms    : 0776,
   comparePerms     : 0644
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeModified\n",
   compareContents  : "ToBeModified\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0775,
   comparePerms     : 0644
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0677,
   comparePerms     : 0644
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/complete.png",
   originalPerms    : 0777,
   comparePerms     : 0755
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null,
   originalPerms    : 0767,
   comparePerms     : 0644
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial.png",
+  compareFile      : "data/complete.png",
+  originalPerms    : 0777,
+  comparePerms     : 0755
 }];
 
-let gCallbackAppProcess;
-
 function run_test() {
   if (!IS_UNIX || IS_ANDROID) {
     logTestInfo("this test is only applicable to XP_UNIX platforms except " +
                 "for Android... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_COMPLETE_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_COMPLETE_FILE);
 
   // Launch the callback helper application so it is in use during the update
-  let callbackApp = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-  callbackApp.append(AFTER_APPLY_DIR);
-  callbackApp.append(CALLBACK_BIN_FILE);
+  let callbackApp = getApplyDirFile(CALLBACK_BIN_FILE);
   callbackApp.permissions = PERMS_DIRECTORY;
-  let args = ["-s", "20"];
-  gCallbackAppProcess = AUS_Cc["@mozilla.org/process/util;1"].
-                        createInstance(AUS_Ci.nsIProcess);
-  gCallbackAppProcess.init(callbackApp);
-  gCallbackAppProcess.run(false, args, args.length);
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let callbackAppProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                           createInstance(AUS_Ci.nsIProcess);
+  callbackAppProcess.init(callbackApp);
+  callbackAppProcess.run(false, args, args.length);
 
-  // Give the lock file process time to lock the file before updating otherwise
-  // this test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
+function doUpdate() {
+  let applyToDir = getApplyDirFile();
 
   // For Mac OS X set the last modified time for the root directory to a date in
   // the past to test that the last modified time is updated on a successful
   // update (bug 600098).
   if (IS_MACOSX) {
     let now = Date.now();
     let yesterday = now - (1000 * 60 * 60 * 24);
     applyToDir.lastModifiedTime = yesterday;
   }
 
   // apply the complete mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a complete mar");
   do_check_eq(exitValue, 0);
 
-  gCallbackAppProcess.kill();
+  setupHelperFinish();
+}
+
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
   do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
 
   // For Mac OS X check that the last modified time for a directory has been
   // updated after a successful update (bug 600098).
   if (IS_MACOSX) {
     logTestInfo("testing last modified time on the apply to directory has " +
                 "changed after a successful update (bug 600098)");
     let now = Date.now();
     let timeDiff = Math.abs(applyToDir.lastModifiedTime - now);
     do_check_true(timeDiff < MAX_TIME_DIFFERENCE);
   }
 
-  checkFilesAfterUpdateSuccess(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateSuccess();
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_win_complete.js
+++ b/toolkit/mozapps/update/test/unit/test_0160_appInUse_xp_win_complete.js
@@ -1,107 +1,104 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 /* Application in use complete MAR file patch apply failure test */
 
 const TEST_ID = "0160";
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/partial.png"
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/partial.png"
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial.png",
+  compareFile      : "data/partial.png"
 }];
 
-let gCallbackAppProcess;
-
 function run_test() {
   if (!IS_WIN || IS_WINCE) {
     logTestInfo("this test is only applicable to Windows... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_COMPLETE_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_COMPLETE_FILE);
 
   // Launch the callback helper application so it is in use during the update
-  let callbackApp = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-  callbackApp.append(AFTER_APPLY_DIR);
-  callbackApp.append(CALLBACK_BIN_FILE);
-  let args = ["-s", "20"];
-  gCallbackAppProcess = AUS_Cc["@mozilla.org/process/util;1"].
-                        createInstance(AUS_Ci.nsIProcess);
-  gCallbackAppProcess.init(callbackApp);
-  gCallbackAppProcess.run(false, args, args.length);
+  let callbackApp = getApplyDirFile(CALLBACK_BIN_FILE);
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let callbackAppProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                           createInstance(AUS_Ci.nsIProcess);
+  callbackAppProcess.init(callbackApp);
+  callbackAppProcess.run(false, args, args.length);
 
-  // Give the lock file process time to lock the file before updating otherwise
-  // this test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-
+function doUpdate() {
   // apply the complete mar
-  let exitValue = runUpdate(TEST_ID);
-  logTestInfo("testing updater binary process exitValue for success when " +
+  let exitValue = runUpdate();
+  logTestInfo("testing updater binary process exitValue for failure when " +
               "applying a complete mar");
   do_check_eq(exitValue, 1);
 
-  gCallbackAppProcess.kill();
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   logTestInfo("testing update.status should be " + STATE_FAILED);
   // The update status format for a failure is failed: # where # is the error
   // code for the failure.
   do_check_eq(readStatusFile(updatesDir).split(": ")[0], STATE_FAILED);
 
-  checkFilesAfterUpdateFailure(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateFailure();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0170_fileLocked_xp_win_complete.js
+++ b/toolkit/mozapps/update/test/unit/test_0170_fileLocked_xp_win_complete.js
@@ -1,106 +1,108 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 /* File locked complete MAR file patch apply failure test */
 
 const TEST_ID = "0170";
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/partial.png"
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial.png",
   compareFile      : "data/partial.png"
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ShouldNotBeReplaced\n",
   compareContents  : "ShouldNotBeReplaced\n",
   originalFile     : null,
   compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial.png",
+  compareFile      : "data/partial.png"
 }];
 
-let gLockFileProcess;
-
 function run_test() {
   if (!IS_WIN || IS_WINCE) {
     logTestInfo("this test is only applicable to Windows... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_COMPLETE_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_COMPLETE_FILE);
 
   // Exclusively lock an existing file so it is in use during the update
   let helperBin = do_get_file(HELPER_BIN_FILE);
-  let lockFileRelPath = TEST_FILES[3].destinationDir + TEST_FILES[3].fileName;
-  let args = ["-s", "20", lockFileRelPath];
-  gLockFileProcess = AUS_Cc["@mozilla.org/process/util;1"].
+  let applyToDir = getApplyDirFile();
+  helperBin.copyTo(applyToDir, HELPER_BIN_FILE);
+  helperBin = getApplyDirFile(HELPER_BIN_FILE);
+  let lockFileRelPath = TEST_FILES[3].relPathDir + TEST_FILES[3].fileName;
+  let args = [getApplyDirPath(), "input", "output", "-s", "20", lockFileRelPath];
+  let lockFileProcess = AUS_Cc["@mozilla.org/process/util;1"].
                      createInstance(AUS_Ci.nsIProcess);
-  gLockFileProcess.init(helperBin);
-  gLockFileProcess.run(false, args, args.length);
+  lockFileProcess.init(helperBin);
+  lockFileProcess.run(false, args, args.length);
 
-  // Give the lock file process time to lock the file before updating otherwise
-  // this test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-
+function doUpdate() {
   // apply the complete mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a complete mar");
   do_check_eq(exitValue, 0);
 
-  gLockFileProcess.kill();
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   logTestInfo("testing update.status should be " + STATE_FAILED);
   // The update status format for a failure is failed: # where # is the error
   // code for the failure.
   do_check_eq(readStatusFile(updatesDir).split(": ")[0], STATE_FAILED);
 
-  checkFilesAfterUpdateFailure(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateFailure();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0171_fileLocked_xp_win_partial.js
+++ b/toolkit/mozapps/update/test/unit/test_0171_fileLocked_xp_win_partial.js
@@ -1,106 +1,110 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 /* File locked partial MAR file patch apply failure test */
 
 const TEST_ID = "0171";
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
-  originalFile     : "data/partial.png",
-  compareFile      : "data/partial.png"
+  originalFile     : "data/complete.png",
+  compareFile      : "data/complete.png"
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeModified\n",
   compareContents  : "ShouldNotBeModified\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ShouldNotBeDeleted\n",
   compareContents  : "ShouldNotBeDeleted\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/complete.png",
   compareFile      : "data/complete.png"
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ShouldNotBeDeleted\n",
   compareContents  : "ShouldNotBeDeleted\n",
   originalFile     : null,
   compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/complete.png",
+  compareFile      : "data/complete.png"
 }];
 
-let gLockFileProcess;
-
+// XXX LoadSourceFile: destination file size 759 does not match expected size 854
+// Needs helper since it is a partial
 function run_test() {
   if (!IS_WIN || IS_WINCE) {
     logTestInfo("this test is only applicable to Windows... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_PARTIAL_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_PARTIAL_FILE);
 
   // Exclusively lock an existing file so it is in use during the update
   let helperBin = do_get_file(HELPER_BIN_FILE);
-  let lockFileRelPath = TEST_FILES[3].destinationDir + TEST_FILES[3].fileName;
-  let args = ["-s", "20", lockFileRelPath];
-  gLockFileProcess = AUS_Cc["@mozilla.org/process/util;1"].
+  let applyToDir = getApplyDirFile();
+  helperBin.copyTo(applyToDir, HELPER_BIN_FILE);
+  helperBin = getApplyDirFile(HELPER_BIN_FILE);
+  let lockFileRelPath = TEST_FILES[3].relPathDir + TEST_FILES[3].fileName;
+  let args = [getApplyDirPath(), "input", "output", "-s", "20", lockFileRelPath];
+  let lockFileProcess = AUS_Cc["@mozilla.org/process/util;1"].
                      createInstance(AUS_Ci.nsIProcess);
-  gLockFileProcess.init(helperBin);
-  gLockFileProcess.run(false, args, args.length);
+  lockFileProcess.init(helperBin);
+  lockFileProcess.run(false, args, args.length);
 
-  // Give the lock file process time to lock the file before updating otherwise
-  // this test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-
-  // apply the partial mar
-  let exitValue = runUpdate(TEST_ID);
+function doUpdate() {
+  // apply the complete mar
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a partial mar");
   do_check_eq(exitValue, 0);
 
-  gLockFileProcess.kill();
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   logTestInfo("testing update.status should be " + STATE_FAILED);
   // The update status format for a failure is failed: # where # is the error
   // code for the failure.
   do_check_eq(readStatusFile(updatesDir).split(": ")[0], STATE_FAILED);
 
-  checkFilesAfterUpdateFailure(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateFailure();
 
   logTestInfo("testing tobedeleted directory doesn't exist");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_false(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0180_fileInUse_xp_win_complete.js
+++ b/toolkit/mozapps/update/test/unit/test_0180_fileInUse_xp_win_complete.js
@@ -1,104 +1,103 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 /* File in use complete MAR file patch apply success test */
 
 const TEST_ID = "0180";
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 const TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : null,
   compareFile      : "data/complete.png"
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeModified\n",
   compareContents  : "ToBeModified\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : HELPER_BIN_FILE,
   compareFile      : "data/complete.png"
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ToBeReplacedWithToBeDeleted\n",
   compareContents  : "ToBeDeleted\n",
   originalFile     : null,
   compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : HELPER_BIN_FILE,
+  compareFile      : "data/complete.png"
 }];
 
-let gFileInUseProcess;
-
 function run_test() {
   if (!IS_WIN || IS_WINCE) {
     logTestInfo("this test is only applicable to Windows... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_COMPLETE_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_COMPLETE_FILE);
 
   // Launch an existing file so it is in use during the update
-  let fileInUseBin = do_get_file(TEST_FILES[3].destinationDir +
-                                 TEST_FILES[3].fileName);
-  let args = ["-s", "20"];
-  gFileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
-                      createInstance(AUS_Ci.nsIProcess);
-  gFileInUseProcess.init(fileInUseBin);
-  gFileInUseProcess.run(false, args, args.length);
+  let fileInUseBin = getApplyDirFile(TEST_FILES[3].relPathDir +
+                                    TEST_FILES[3].fileName);
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let fileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                         createInstance(AUS_Ci.nsIProcess);
+  fileInUseProcess.init(fileInUseBin);
+  fileInUseProcess.run(false, args, args.length);
 
-  // Give the file in use process time to launch before updating otherwise this
-  // test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-
+function doUpdate() {
   // apply the complete mar
-  let exitValue = runUpdate(TEST_ID);
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a complete mar");
   do_check_eq(exitValue, 0);
 
-  gFileInUseProcess.kill();
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
 
   logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
   do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
 
-  checkFilesAfterUpdateSuccess(TEST_ID, TEST_FILES);
+  checkFilesAfterUpdateSuccess();
 
   logTestInfo("testing tobedeleted directory exists");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_true(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
--- a/toolkit/mozapps/update/test/unit/test_0181_fileInUse_xp_win_partial.js
+++ b/toolkit/mozapps/update/test/unit/test_0181_fileInUse_xp_win_partial.js
@@ -1,121 +1,118 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/
  */
 
 /* File in use partial MAR file patch apply success test */
 
 const TEST_ID = "0181";
 const MAR_IN_USE_WIN_FILE = "data/partial_in_use_win.mar";
-// Time to wait for the test helper process to start before continuing the test
-const TEST_HELPER_TIMEOUT = 1000;
 
 // The files are in the same order as they are applied from the mar
 var TEST_FILES = [
 {
-  fileName         : "1_1_image1.png",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/complete.png",
   compareFile      : "data/partial.png"
 }, {
-  fileName         : "1_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
   originalContents : "ToBeModified\n",
   compareContents  : "Modified\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text2",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
   originalContents : "ToBeDeleted\n",
   compareContents  : null,
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_exe1.exe",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/",
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
   originalContents : null,
   compareContents  : null,
   originalFile     : "data/partial_in_use_win_before.exe",
   compareFile      : "data/partial_in_use_win_after.exe"
 }, {
-  fileName         : "2_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/",
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
   originalContents : "ToBeDeleted\n",
   compareContents  : null,
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "1_1_text3",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/1/1_1/",
+  fileName         : "00text2",
+  relPathDir       : "0/00/",
   originalContents : null,
   compareContents  : "Added\n",
   originalFile     : null,
   compareFile      : null
 }, {
-  fileName         : "3_1_text1",
-  destinationDir   : TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/3/3_1/",
+  fileName         : "20text0",
+  relPathDir       : "2/20/",
   originalContents : null,
   compareContents  : "Added\n",
   originalFile     : null,
   compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/partial_in_use_win_before.exe",
+  compareFile      : "data/partial_in_use_win_after.exe"
 }];
 
-let gFileInUseProcess;
-
 function run_test() {
   if (!IS_WIN || IS_WINCE) {
     logTestInfo("this test is only applicable to Windows... returning early");
     return;
   }
 
   do_test_pending();
-  do_register_cleanup(end_test);
+  do_register_cleanup(cleanupUpdaterTest);
 
-  setupUpdaterTest(TEST_ID, MAR_IN_USE_WIN_FILE, TEST_FILES);
+  setupUpdaterTest(MAR_IN_USE_WIN_FILE);
 
   // Launch an existing file so it is in use during the update
-  let fileInUseBin = do_get_file(TEST_FILES[3].destinationDir +
-                                 TEST_FILES[3].fileName);
-  let args = ["-s", "20"];
-  gFileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
-                      createInstance(AUS_Ci.nsIProcess);
-  gFileInUseProcess.init(fileInUseBin);
-  gFileInUseProcess.run(false, args, args.length);
+  let fileInUseBin = getApplyDirFile(TEST_FILES[3].relPathDir +
+                                    TEST_FILES[3].fileName);
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let fileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                         createInstance(AUS_Ci.nsIProcess);
+  fileInUseProcess.init(fileInUseBin);
+  fileInUseProcess.run(false, args, args.length);
 
-  // Give the file in use process time to launch before updating otherwise this
-  // test can fail intermittently on Windows debug builds.
-  do_timeout(TEST_HELPER_TIMEOUT, testUpdate);
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
 }
 
-function end_test() {
-  cleanupUpdaterTest(TEST_ID);
-}
-
-function testUpdate() {
-  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
-  let applyToDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX);
-
-  // apply the partial mar
-  let exitValue = runUpdate(TEST_ID);
+function doUpdate() {
+  // apply the complete mar
+  let exitValue = runUpdate();
   logTestInfo("testing updater binary process exitValue for success when " +
               "applying a partial mar");
   do_check_eq(exitValue, 0);
 
-  gFileInUseProcess.kill();
-
-  checkFilesAfterUpdateSuccess(TEST_ID, TEST_FILES);
+  setupHelperFinish();
+}
 
-  logTestInfo("testing directory still exists after removal of the last file " +
-              "in the directory (bug 386760)");
-  let testDir = do_get_file(TEST_ID + APPLY_TO_DIR_SUFFIX + "/mar_test/2/2_1/", true);
-  do_check_true(testDir.exists());
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
+
+  logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
+  do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
+
+  checkFilesAfterUpdateSuccess();
 
   logTestInfo("testing tobedeleted directory exists");
   let toBeDeletedDir = applyToDir.clone();
   toBeDeletedDir.append("tobedeleted");
   do_check_true(toBeDeletedDir.exists());
 
-  checkCallbackAppLog(TEST_ID);
+  checkCallbackAppLog();
 }
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/test/unit/test_0182_rmrfdirFileInUse_xp_win_complete.js
@@ -0,0 +1,113 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/* File in use complete MAR file patch apply success test */
+
+const TEST_ID = "0182";
+
+// The files are in the same order as they are applied from the mar
+const TEST_FILES = [
+{
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : null,
+  compareFile      : "data/complete.png"
+}, {
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
+  originalContents : "ToBeReplacedWithToBeModified\n",
+  compareContents  : "ToBeModified\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
+  originalContents : "ToBeReplacedWithToBeDeleted\n",
+  compareContents  : "ToBeDeleted\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : HELPER_BIN_FILE,
+  compareFile      : "data/complete.png"
+}, {
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
+  originalContents : "ToBeReplacedWithToBeDeleted\n",
+  compareContents  : "ToBeDeleted\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : HELPER_BIN_FILE,
+  compareFile      : "data/complete.png"
+}];
+
+function run_test() {
+  if (!IS_WIN || IS_WINCE) {
+    logTestInfo("this test is only applicable to Windows... returning early");
+    return;
+  }
+
+  do_test_pending();
+  do_register_cleanup(cleanupUpdaterTest);
+
+  setupUpdaterTest(MAR_COMPLETE_FILE);
+
+  let fileInUseBin = getApplyDirFile(TEST_DIRS[4].relPathDir +
+                                     TEST_DIRS[4].subDirs[0] +
+                                     TEST_DIRS[4].subDirFiles[0]);
+  // Remove the empty file created for the test so the helper application can
+  // replace it.
+  fileInUseBin.remove(false);
+
+  let helperBin = do_get_file(HELPER_BIN_FILE);
+  let fileInUseDir = getApplyDirFile(TEST_DIRS[4].relPathDir +
+                                    TEST_DIRS[4].subDirs[0]);
+  helperBin.copyTo(fileInUseDir, TEST_DIRS[4].subDirFiles[0]);
+
+  // Launch an existing file so it is in use during the update
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let fileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                         createInstance(AUS_Ci.nsIProcess);
+  fileInUseProcess.init(fileInUseBin);
+  fileInUseProcess.run(false, args, args.length);
+
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
+}
+
+function doUpdate() {
+  // apply the complete mar
+  let exitValue = runUpdate();
+  logTestInfo("testing updater binary process exitValue for success when " +
+              "applying a complete mar");
+  do_check_eq(exitValue, 0);
+
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
+
+  logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
+  do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
+
+  checkFilesAfterUpdateSuccess();
+
+  logTestInfo("testing tobedeleted directory exists");
+  let toBeDeletedDir = applyToDir.clone();
+  toBeDeletedDir.append("tobedeleted");
+  do_check_true(toBeDeletedDir.exists());
+
+  checkCallbackAppLog();
+}
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/test/unit/test_0183_rmrfdirFileInUse_xp_win_partial.js
@@ -0,0 +1,126 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/* File in use partial MAR file patch apply success test */
+
+const TEST_ID = "0183";
+const MAR_IN_USE_WIN_FILE = "data/partial.mar";
+
+// The files are in the same order as they are applied from the mar
+var TEST_FILES = [
+{
+  fileName         : "00png0.png",
+  relPathDir       : "0/00/",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/complete.png",
+  compareFile      : "data/partial.png"
+}, {
+  fileName         : "00text0",
+  relPathDir       : "0/00/",
+  originalContents : "ToBeModified\n",
+  compareContents  : "Modified\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "00text1",
+  relPathDir       : "0/00/",
+  originalContents : "ToBeDeleted\n",
+  compareContents  : null,
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "0exe0.exe",
+  relPathDir       : "0/",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/complete.png",
+  compareFile      : "data/partial.png"
+}, {
+  fileName         : "10text0",
+  relPathDir       : "1/10/",
+  originalContents : "ToBeDeleted\n",
+  compareContents  : null,
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "00text2",
+  relPathDir       : "0/00/",
+  originalContents : null,
+  compareContents  : "Added\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "20text0",
+  relPathDir       : "2/20/",
+  originalContents : null,
+  compareContents  : "Added\n",
+  originalFile     : null,
+  compareFile      : null
+}, {
+  fileName         : "exe0.exe",
+  relPathDir       : "",
+  originalContents : null,
+  compareContents  : null,
+  originalFile     : "data/complete.png",
+  compareFile      : "data/partial.png"
+}];
+
+function run_test() {
+  if (!IS_WIN || IS_WINCE) {
+    logTestInfo("this test is only applicable to Windows... returning early");
+    return;
+  }
+
+  do_test_pending();
+  do_register_cleanup(cleanupUpdaterTest);
+
+  setupUpdaterTest(MAR_IN_USE_WIN_FILE);
+
+  let fileInUseBin = getApplyDirFile(TEST_DIRS[2].relPathDir +
+                                     TEST_DIRS[2].files[0]);
+  // Remove the empty file created for the test so the helper application can
+  // replace it.
+  fileInUseBin.remove(false);
+
+  let helperBin = do_get_file(HELPER_BIN_FILE);
+  let fileInUseDir = getApplyDirFile(TEST_DIRS[2].relPathDir);
+  helperBin.copyTo(fileInUseDir, TEST_DIRS[2].files[0]);
+
+  // Launch an existing file so it is in use during the update
+  let args = [getApplyDirPath(), "input", "output", "-s", "20"];
+  let fileInUseProcess = AUS_Cc["@mozilla.org/process/util;1"].
+                         createInstance(AUS_Ci.nsIProcess);
+  fileInUseProcess.init(fileInUseBin);
+  fileInUseProcess.run(false, args, args.length);
+
+  do_timeout(TEST_HELPER_TIMEOUT, waitForHelperSleep);
+}
+
+function doUpdate() {
+  // apply the complete mar
+  let exitValue = runUpdate();
+  logTestInfo("testing updater binary process exitValue for success when " +
+              "applying a partial mar");
+  do_check_eq(exitValue, 0);
+
+  setupHelperFinish();
+}
+
+function checkUpdate() {
+  let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
+  let applyToDir = getApplyDirFile();
+
+  logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
+  do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
+
+  checkFilesAfterUpdateSuccess();
+
+  logTestInfo("testing tobedeleted directory exists");
+  let toBeDeletedDir = applyToDir.clone();
+  toBeDeletedDir.append("tobedeleted");
+  do_check_true(toBeDeletedDir.exists());
+
+  checkCallbackAppLog();
+}