Add support for bsdiff of file system metadata blocks

BUG=chromium-os:10188
TEST=Unit test, build delta update, apply to Mario and make sure it
boots with new version

Change-Id: I37b3fcc3c0e65e063cd95b0b3c9a5cd2261c98c9

Review URL: http://codereview.chromium.org/5684002
diff --git a/test_utils.cc b/test_utils.cc
index c1bdb48..9d1b5d0 100644
--- a/test_utils.cc
+++ b/test_utils.cc
@@ -178,6 +178,16 @@
   }
 }
 
+void CreateEmptyExtImageAtPath(const string& path,
+                               size_t size,
+                               int block_size) {
+  EXPECT_EQ(0, System(StringPrintf("dd if=/dev/zero of=%s"
+                                   " seek=%zu bs=1 count=1",
+                                   path.c_str(), size)));
+  EXPECT_EQ(0, System(StringPrintf("mkfs.ext3 -b %d -F %s",
+                                   block_size, path.c_str())));
+}
+
 void CreateExtImageAtPath(const string& path, vector<string>* out_paths) {
   // create 10MiB sparse file
   EXPECT_EQ(0, System(StringPrintf("dd if=/dev/zero of=%s"
@@ -199,7 +209,7 @@
   EXPECT_EQ(0, System(StringPrintf("ln %s/some_dir/test %s/testlink",
                                    kMountPath, kMountPath)));
   EXPECT_EQ(0, System(StringPrintf("umount -d %s", kMountPath)));
-  
+
   if (out_paths) {
     out_paths->clear();
     out_paths->push_back("");
@@ -263,4 +273,19 @@
   }
 }
 
+ScopedLoopMounter::ScopedLoopMounter(const std::string& file_path,
+                                     std::string* mnt_path,
+                                     unsigned long flags) {
+  EXPECT_TRUE(utils::MakeTempDirectory("/tmp/mnt.XXXXXX", mnt_path));
+  dir_remover_.reset(new ScopedDirRemover(*mnt_path));
+
+  std::string loop_dev = GetUnusedLoopDevice();
+  EXPECT_EQ(0, system(StringPrintf("losetup %s %s", loop_dev.c_str(),
+                                   file_path.c_str()).c_str()));
+  loop_releaser_.reset(new ScopedLoopbackDeviceReleaser(loop_dev));
+
+  EXPECT_TRUE(utils::MountFilesystem(loop_dev, *mnt_path, flags));
+  unmounter_.reset(new ScopedFilesystemUnmounter(*mnt_path));
+}
+
 }  // namespace chromeos_update_engine