summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com>2024-04-09 06:41:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-04-09 06:41:58 +0000
commit793679f47a23c2f8c8e7354d2bb728a9a673b590 (patch)
tree6fa7d5e3de0d1b4a1293e21600865bf5a715f537
parentf5e9af16b66fe003b6481790f33932747f606571 (diff)
parent2f8efe00af7ae33fede46d84e1eb0bf8b02614a8 (diff)
downloadcore-793679f47a23c2f8c8e7354d2bb728a9a673b590.tar.gz
Merge "skip nop persistent property writes" into main
-rw-r--r--init/persistent_properties.cpp3
-rw-r--r--init/persistent_properties_test.cpp28
2 files changed, 31 insertions, 0 deletions
diff --git a/init/persistent_properties.cpp b/init/persistent_properties.cpp
index 59e57b95f..1d17e3c10 100644
--- a/init/persistent_properties.cpp
+++ b/init/persistent_properties.cpp
@@ -236,6 +236,9 @@ void WritePersistentProperty(const std::string& name, const std::string& value)
persistent_properties->mutable_properties()->end(),
[&name](const auto& record) { return record.name() == name; });
if (it != persistent_properties->mutable_properties()->end()) {
+ if (it->value() == value) {
+ return;
+ }
it->set_name(name);
it->set_value(value);
} else {
diff --git a/init/persistent_properties_test.cpp b/init/persistent_properties_test.cpp
index 576305081..97865d7b4 100644
--- a/init/persistent_properties_test.cpp
+++ b/init/persistent_properties_test.cpp
@@ -17,6 +17,9 @@
#include "persistent_properties.h"
#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <vector>
@@ -155,6 +158,31 @@ TEST(persistent_properties, UpdatePropertyBadParse) {
EXPECT_FALSE(it == read_back_properties.properties().end());
}
+TEST(persistent_properties, NopUpdateDoesntWriteFile) {
+ TemporaryFile tf;
+ ASSERT_TRUE(tf.fd != -1);
+ persistent_property_filename = tf.path;
+
+ auto last_modified = [&tf]() -> time_t {
+ struct stat buf;
+ EXPECT_EQ(fstat(tf.fd, &buf), 0);
+ return buf.st_mtime;
+ };
+
+ std::vector<std::pair<std::string, std::string>> persistent_properties = {
+ {"persist.sys.locale", "en-US"},
+ {"persist.sys.timezone", "America/Los_Angeles"},
+ };
+ ASSERT_RESULT_OK(
+ WritePersistentPropertyFile(VectorToPersistentProperties(persistent_properties)));
+
+ time_t t = last_modified();
+ sleep(2);
+ WritePersistentProperty("persist.sys.locale", "en-US");
+ // Ensure that the file was not modified
+ ASSERT_EQ(last_modified(), t);
+}
+
TEST(persistent_properties, RejectNonPersistProperty) {
TemporaryFile tf;
ASSERT_TRUE(tf.fd != -1);