text: /* Any copyright is dedicated to the Public Domain.
   * http://creativecommons.org/publicdomain/zero/1.0/
   */
  
  /* Replace app binary complete MAR file patch apply success test */
  
  const TEST_ID = "0150_svc";
  const MAR_COMPLETE_WIN_FILE = "data/complete_win.mar";
  
  // The files are listed in the same order as they are applied from the mar's
  // update.manifest. Complete updates have remove file and rmdir directory
  // operations located in the precomplete file performed first.
  const TEST_FILES = [
  {
    description      : "Should never change",
    fileName         : "channel-prefs.js",
    relPathDir       : "a/b/defaults/pref/",
    originalContents : "ShouldNotBeReplaced\n",
    compareContents  : "ShouldNotBeReplaced\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "precomplete",
    relPathDir       : "",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial_precomplete",
    compareFile      : "data/complete_precomplete"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "searchpluginstext0",
    relPathDir       : "a/b/searchplugins/",
    originalContents : "ToBeReplacedWithFromComplete\n",
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "searchpluginspng1.png",
    relPathDir       : "a/b/searchplugins/",
    originalContents : null,
    compareContents  : null,
    originalFile     : null,
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "searchpluginspng0.png",
    relPathDir       : "a/b/searchplugins/",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial.png",
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "removed-files",
    relPathDir       : "a/b/",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial_removed-files",
    compareFile      : "data/complete_removed-files"
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions1text0",
    relPathDir       : "a/b/extensions/extensions1/",
    originalContents : null,
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions1png1.png",
    relPathDir       : "a/b/extensions/extensions1/",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial.png",
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions1png0.png",
    relPathDir       : "a/b/extensions/extensions1/",
    originalContents : null,
    compareContents  : null,
    originalFile     : null,
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions0text0",
    relPathDir       : "a/b/extensions/extensions0/",
    originalContents : "ToBeReplacedWithFromComplete\n",
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions0png1.png",
    relPathDir       : "a/b/extensions/extensions0/",
    originalContents : null,
    compareContents  : null,
    originalFile     : null,
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest if the parent directory " +
                       "exists (add-if)",
    fileName         : "extensions0png0.png",
    relPathDir       : "a/b/extensions/extensions0/",
    originalContents : null,
    compareContents  : null,
    originalFile     : null,
    compareFile      : "data/complete.png"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "exe0.exe",
    relPathDir       : "a/b/",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial_in_use_win_after.exe",
    compareFile      : "data/partial_in_use_win_before.exe"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "10text0",
    relPathDir       : "a/b/1/10/",
    originalContents : "ToBeReplacedWithFromComplete\n",
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest (add) file in use",
    fileName         : "0exe0.exe",
    relPathDir       : "a/b/0/",
    originalContents : null,
    compareContents  : null,
    originalFile     : "data/partial_in_use_win_after.exe",
    compareFile      : "data/partial_in_use_win_before.exe"
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "00text1",
    relPathDir       : "a/b/0/00/",
    originalContents : "ToBeReplacedWithFromComplete\n",
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "00text0",
    relPathDir       : "a/b/0/00/",
    originalContents : "ToBeReplacedWithFromComplete\n",
    compareContents  : "FromComplete\n",
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Added by update.manifest (add)",
    fileName         : "00png0.png",
    relPathDir       : "a/b/0/00/",
    originalContents : null,
    compareContents  : null,
    originalFile     : null,
    compareFile      : "data/complete.png"
  }, {
    description      : "Removed by precomplete (remove)",
    fileName         : "20text0",
    relPathDir       : "a/b/2/20/",
    originalContents : "ToBeDeleted\n",
    compareContents  : null,
    originalFile     : null,
    compareFile      : null
  }, {
    description      : "Removed by precomplete (remove)",
    fileName         : "20png0.png",
    relPathDir       : "a/b/2/20/",
    originalContents : "ToBeDeleted\n",
    compareContents  : null,
    originalFile     : null,
    compareFile      : null
  }];
  
  ADDITIONAL_TEST_DIRS = [
  {
    description  : "Removed by precomplete (rmdir)",
    relPathDir   : "a/b/2/20/",
    dirRemoved   : true
  }, {
    description  : "Removed by precomplete (rmdir)",
    relPathDir   : "a/b/2/",
    dirRemoved   : true
  }];
  
  function run_test() {
    if (!shouldRunServiceTest()) {
      return;
    }
  
    do_test_pending();
    do_register_cleanup(cleanupUpdaterTest);
  
    setupUpdaterTest(MAR_COMPLETE_WIN_FILE);
  
    gCallbackBinFile = "exe0.exe";
  
    // apply the complete mar
    runUpdateUsingService(STATE_PENDING_SVC, STATE_SUCCEEDED, checkUpdateApplied);
  }
  
  function checkUpdateApplied() {
    logTestInfo("testing update.status should be " + STATE_SUCCEEDED);
    let updatesDir = do_get_file(TEST_ID + UPDATES_DIR_SUFFIX);
    do_check_eq(readStatusFile(updatesDir), STATE_SUCCEEDED);
  
    checkFilesAfterUpdateSuccess();
  
    logTestInfo("testing tobedeleted directory doesn't exist");
    let toBeDeletedDir = getApplyDirFile("tobedeleted", true);
    do_check_false(toBeDeletedDir.exists());
  
    checkCallbackServiceLog();
  }
  