Loading tests/component/updater_test.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ #include "updater/install.h" #include "updater/updater.h" using namespace std::string_literals; using PackageEntries = std::unordered_map<std::string, std::string>; static constexpr size_t kTransferListHeaderLines = 4; Loading Loading @@ -366,6 +368,27 @@ TEST_F(UpdaterTest, package_extract_file) { CloseArchive(handle); } TEST_F(UpdaterTest, read_file) { // read_file() expects one argument. expect(nullptr, "read_file()", kArgsParsingFailure); expect(nullptr, "read_file(\"arg1\", \"arg2\")", kArgsParsingFailure); // Write some value to file and read back. TemporaryFile temp_file; std::string script("write_value(\"foo\", \""s + temp_file.path + "\");"); expect("t", script, kNoCause); script = "read_file(\""s + temp_file.path + "\") == \"foo\""; expect("t", script, kNoCause); script = "read_file(\""s + temp_file.path + "\") == \"bar\""; expect("", script, kNoCause); // It should fail gracefully when read fails. script = "read_file(\"/doesntexist\")"; expect("", script, kNoCause); } TEST_F(UpdaterTest, write_value) { // write_value() expects two arguments. expect(nullptr, "write_value()", kArgsParsingFailure); Loading updater/install.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -742,7 +742,7 @@ Value* RunProgramFn(const char* name, State* state, const std::vector<std::uniqu } // read_file(filename) // Reads a local file 'filename' and returns its contents as a Value string. // Reads a local file 'filename' and returns its contents as a string Value. Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) { if (argv.size() != 1) { return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size()); Loading @@ -754,13 +754,13 @@ Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ } const std::string& filename = args[0]; FileContents fc; if (LoadFileContents(filename.c_str(), &fc) == 0) { return new Value(Value::Type::BLOB, std::string(fc.data.cbegin(), fc.data.cend())); std::string contents; if (android::base::ReadFileToString(filename, &contents)) { return new Value(Value::Type::STRING, std::move(contents)); } // Leave it to caller to handle the failure. LOG(ERROR) << name << ": Failed to read " << filename; PLOG(ERROR) << name << ": Failed to read " << filename; return StringValue(""); } Loading Loading
tests/component/updater_test.cpp +23 −0 Original line number Diff line number Diff line Loading @@ -51,6 +51,8 @@ #include "updater/install.h" #include "updater/updater.h" using namespace std::string_literals; using PackageEntries = std::unordered_map<std::string, std::string>; static constexpr size_t kTransferListHeaderLines = 4; Loading Loading @@ -366,6 +368,27 @@ TEST_F(UpdaterTest, package_extract_file) { CloseArchive(handle); } TEST_F(UpdaterTest, read_file) { // read_file() expects one argument. expect(nullptr, "read_file()", kArgsParsingFailure); expect(nullptr, "read_file(\"arg1\", \"arg2\")", kArgsParsingFailure); // Write some value to file and read back. TemporaryFile temp_file; std::string script("write_value(\"foo\", \""s + temp_file.path + "\");"); expect("t", script, kNoCause); script = "read_file(\""s + temp_file.path + "\") == \"foo\""; expect("t", script, kNoCause); script = "read_file(\""s + temp_file.path + "\") == \"bar\""; expect("", script, kNoCause); // It should fail gracefully when read fails. script = "read_file(\"/doesntexist\")"; expect("", script, kNoCause); } TEST_F(UpdaterTest, write_value) { // write_value() expects two arguments. expect(nullptr, "write_value()", kArgsParsingFailure); Loading
updater/install.cpp +5 −5 Original line number Diff line number Diff line Loading @@ -742,7 +742,7 @@ Value* RunProgramFn(const char* name, State* state, const std::vector<std::uniqu } // read_file(filename) // Reads a local file 'filename' and returns its contents as a Value string. // Reads a local file 'filename' and returns its contents as a string Value. Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ptr<Expr>>& argv) { if (argv.size() != 1) { return ErrorAbort(state, kArgsParsingFailure, "%s() expects 1 arg, got %zu", name, argv.size()); Loading @@ -754,13 +754,13 @@ Value* ReadFileFn(const char* name, State* state, const std::vector<std::unique_ } const std::string& filename = args[0]; FileContents fc; if (LoadFileContents(filename.c_str(), &fc) == 0) { return new Value(Value::Type::BLOB, std::string(fc.data.cbegin(), fc.data.cend())); std::string contents; if (android::base::ReadFileToString(filename, &contents)) { return new Value(Value::Type::STRING, std::move(contents)); } // Leave it to caller to handle the failure. LOG(ERROR) << name << ": Failed to read " << filename; PLOG(ERROR) << name << ": Failed to read " << filename; return StringValue(""); } Loading