Merge "updater: Add a testcase for RenameFn()."
am: d0daf7f7df

Change-Id: I606b95f3d164063a271cd8faac8c5bfe42e2ef60
diff --git a/tests/component/updater_test.cpp b/tests/component/updater_test.cpp
index 337769e..f922933 100644
--- a/tests/component/updater_test.cpp
+++ b/tests/component/updater_test.cpp
@@ -180,3 +180,32 @@
                         "\", \"/doesntexist2\")");
     expect("1", script3.c_str(), kNoCause);
 }
+
+TEST_F(UpdaterTest, rename) {
+    // rename() expects two arguments.
+    expect(nullptr, "rename()", kArgsParsingFailure);
+    expect(nullptr, "rename(\"arg1\")", kArgsParsingFailure);
+    expect(nullptr, "rename(\"arg1\", \"arg2\", \"arg3\")", kArgsParsingFailure);
+
+    // src_name or dst_name cannot be empty.
+    expect(nullptr, "rename(\"\", \"arg2\")", kArgsParsingFailure);
+    expect(nullptr, "rename(\"arg1\", \"\")", kArgsParsingFailure);
+
+    // File doesn't exist (both of src and dst).
+    expect(nullptr, "rename(\"/doesntexist\", \"/doesntexisteither\")" , kFileRenameFailure);
+
+    // Can't create parent directory.
+    TemporaryFile temp_file1;
+    ASSERT_TRUE(android::base::WriteStringToFile("abc", temp_file1.path));
+    std::string script1("rename(\"" + std::string(temp_file1.path) + "\", \"/proc/0/file1\")");
+    expect(nullptr, script1.c_str(), kFileRenameFailure);
+
+    // Rename.
+    TemporaryFile temp_file2;
+    std::string script2("rename(\"" + std::string(temp_file1.path) + "\", \"" +
+                        std::string(temp_file2.path) + "\")");
+    expect(temp_file2.path, script2.c_str(), kNoCause);
+
+    // Already renamed.
+    expect(temp_file2.path, script2.c_str(), kNoCause);
+}
diff --git a/updater/install.cpp b/updater/install.cpp
index 25f6a91..ed55ea5 100644
--- a/updater/install.cpp
+++ b/updater/install.cpp
@@ -293,7 +293,7 @@
     }
 
     int64_t size;
-    if (!android::base::ParseInt(fs_size.c_str(), &size)) {
+    if (!android::base::ParseInt(fs_size, &size)) {
         return ErrorAbort(state, kArgsParsingFailure,
                           "%s: failed to parse int in %s\n", name, fs_size.c_str());
     }
@@ -329,6 +329,9 @@
     return nullptr;
 }
 
+// rename(src_name, dst_name)
+//   Renames src_name to dst_name. It automatically creates the necessary directories for dst_name.
+//   Example: rename("system/app/Hangouts/Hangouts.apk", "system/priv-app/Hangouts/Hangouts.apk")
 Value* RenameFn(const char* name, State* state, int argc, Expr* argv[]) {
     if (argc != 2) {
         return ErrorAbort(state, kArgsParsingFailure, "%s() expects 2 args, got %d", name, argc);