AU: Add a utility routine to get the filesystem size from a device.

BUG=7678
TEST=unit tests

Change-Id: I177e95014e09c64844fa7ecc6efb91c0997cb9bd

Review URL: http://codereview.chromium.org/3706006
diff --git a/utils_unittest.cc b/utils_unittest.cc
index a5550d3..4f17305 100644
--- a/utils_unittest.cc
+++ b/utils_unittest.cc
@@ -10,7 +10,10 @@
 #include <string>
 #include <vector>
 
-#include "gtest/gtest.h"
+#include <base/string_util.h>
+#include <gtest/gtest.h>
+
+#include "update_engine/test_utils.h"
 #include "update_engine/utils.h"
 
 using std::map;
@@ -205,4 +208,21 @@
   }
 }
 
+TEST(UtilsTest, RunAsRootGetFilesystemSizeTest) {
+  string img;
+  EXPECT_TRUE(utils::MakeTempFile("/tmp/img.XXXXXX", &img, NULL));
+  ScopedPathUnlinker img_unlinker(img);
+  CreateExtImageAtPath(img, NULL);
+  // Extend the "partition" holding the file system from 10MiB to 20MiB.
+  EXPECT_EQ(0, System(base::StringPrintf(
+      "dd if=/dev/zero of=%s seek=20971519 bs=1 count=1",
+      img.c_str())));
+  EXPECT_EQ(20 * 1024 * 1024, utils::FileSize(img));
+  int block_count = 0;
+  int block_size = 0;
+  EXPECT_TRUE(utils::GetFilesystemSize(img, &block_count, &block_size));
+  EXPECT_EQ(4096, block_size);
+  EXPECT_EQ(10 * 1024 * 1024 / 4096, block_count);
+}
+
 }  // namespace chromeos_update_engine