Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: components/prefs/json_pref_store_unittest.cc

Issue 2372663003: Allow ImportantFileWriter to take in a pre-write callback. (Closed)
Patch Set: Add a WaitableEvent to fix a race condition in CallbackRunsOnWriterThread Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/prefs/json_pref_store.cc ('k') | components/prefs/pref_filter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/prefs/json_pref_store.h" 5 #include "components/prefs/json_pref_store.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 void SetCurrentTimeInMinutes(double minutes, base::SimpleTestClock* clock) { 62 void SetCurrentTimeInMinutes(double minutes, base::SimpleTestClock* clock) {
63 const int32_t kBaseTimeMins = 100; 63 const int32_t kBaseTimeMins = 100;
64 clock->SetNow(base::Time::FromDoubleT((kBaseTimeMins + minutes) * 60)); 64 clock->SetNow(base::Time::FromDoubleT((kBaseTimeMins + minutes) * 60));
65 } 65 }
66 66
67 // A PrefFilter that will intercept all calls to FilterOnLoad() and hold on 67 // A PrefFilter that will intercept all calls to FilterOnLoad() and hold on
68 // to the |prefs| until explicitly asked to release them. 68 // to the |prefs| until explicitly asked to release them.
69 class InterceptingPrefFilter : public PrefFilter { 69 class InterceptingPrefFilter : public PrefFilter {
70 public: 70 public:
71 InterceptingPrefFilter(); 71 InterceptingPrefFilter();
72 InterceptingPrefFilter(OnWriteCallbackPair callback_pair);
72 ~InterceptingPrefFilter() override; 73 ~InterceptingPrefFilter() override;
73 74
74 // PrefFilter implementation: 75 // PrefFilter implementation:
75 void FilterOnLoad( 76 void FilterOnLoad(
76 const PostFilterOnLoadCallback& post_filter_on_load_callback, 77 const PostFilterOnLoadCallback& post_filter_on_load_callback,
77 std::unique_ptr<base::DictionaryValue> pref_store_contents) override; 78 std::unique_ptr<base::DictionaryValue> pref_store_contents) override;
78 void FilterUpdate(const std::string& path) override {} 79 void FilterUpdate(const std::string& path) override {}
79 void FilterSerializeData( 80 OnWriteCallbackPair FilterSerializeData(
80 base::DictionaryValue* pref_store_contents) override {} 81 base::DictionaryValue* pref_store_contents) override {
82 return on_write_callback_pair_;
83 }
81 84
82 bool has_intercepted_prefs() const { return intercepted_prefs_ != NULL; } 85 bool has_intercepted_prefs() const { return intercepted_prefs_ != NULL; }
83 86
84 // Finalize an intercepted read, handing |intercepted_prefs_| back to its 87 // Finalize an intercepted read, handing |intercepted_prefs_| back to its
85 // JsonPrefStore. 88 // JsonPrefStore.
86 void ReleasePrefs(); 89 void ReleasePrefs();
87 90
88 private: 91 private:
89 PostFilterOnLoadCallback post_filter_on_load_callback_; 92 PostFilterOnLoadCallback post_filter_on_load_callback_;
90 std::unique_ptr<base::DictionaryValue> intercepted_prefs_; 93 std::unique_ptr<base::DictionaryValue> intercepted_prefs_;
94 OnWriteCallbackPair on_write_callback_pair_;
91 95
92 DISALLOW_COPY_AND_ASSIGN(InterceptingPrefFilter); 96 DISALLOW_COPY_AND_ASSIGN(InterceptingPrefFilter);
93 }; 97 };
94 98
95 InterceptingPrefFilter::InterceptingPrefFilter() {} 99 InterceptingPrefFilter::InterceptingPrefFilter() {}
100
101 InterceptingPrefFilter::InterceptingPrefFilter(
102 OnWriteCallbackPair callback_pair) {
103 on_write_callback_pair_ = callback_pair;
104 }
105
96 InterceptingPrefFilter::~InterceptingPrefFilter() {} 106 InterceptingPrefFilter::~InterceptingPrefFilter() {}
97 107
98 void InterceptingPrefFilter::FilterOnLoad( 108 void InterceptingPrefFilter::FilterOnLoad(
99 const PostFilterOnLoadCallback& post_filter_on_load_callback, 109 const PostFilterOnLoadCallback& post_filter_on_load_callback,
100 std::unique_ptr<base::DictionaryValue> pref_store_contents) { 110 std::unique_ptr<base::DictionaryValue> pref_store_contents) {
101 post_filter_on_load_callback_ = post_filter_on_load_callback; 111 post_filter_on_load_callback_ = post_filter_on_load_callback;
102 intercepted_prefs_ = std::move(pref_store_contents); 112 intercepted_prefs_ = std::move(pref_store_contents);
103 } 113 }
104 114
105 void InterceptingPrefFilter::ReleasePrefs() { 115 void InterceptingPrefFilter::ReleasePrefs() {
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 base::Bind(&SuccessfulWriteReplyObserver::OnSuccessfulWrite, 1009 base::Bind(&SuccessfulWriteReplyObserver::OnSuccessfulWrite,
1000 base::Unretained(this))); 1010 base::Unretained(this)));
1001 } 1011 }
1002 1012
1003 enum WriteCallbackObservationState { 1013 enum WriteCallbackObservationState {
1004 NOT_CALLED, 1014 NOT_CALLED,
1005 CALLED_WITH_ERROR, 1015 CALLED_WITH_ERROR,
1006 CALLED_WITH_SUCCESS, 1016 CALLED_WITH_SUCCESS,
1007 }; 1017 };
1008 1018
1009 class WriteCallbackObserver { 1019 class WriteCallbacksObserver {
1010 public: 1020 public:
1011 WriteCallbackObserver() = default; 1021 WriteCallbacksObserver() = default;
1012 1022
1013 // Register OnWrite() to be called on the next write of |json_pref_store|. 1023 // Register OnWrite() to be called on the next write of |json_pref_store|.
1014 void ObserveNextWriteCallback(JsonPrefStore* json_pref_store); 1024 void ObserveNextWriteCallback(JsonPrefStore* json_pref_store);
1015 1025
1016 // Returns true if a write was observed via OnWrite() 1026 // Returns whether OnPreWrite() was called, and resets the observation state
1017 // and resets the observation state to false regardless. 1027 // to false.
1018 WriteCallbackObservationState GetAndResetObservationState(); 1028 bool GetAndResetPreWriteObservationState();
1019 1029
1020 void OnWrite(bool success) { 1030 // Returns the |WriteCallbackObservationState| which was observed, then resets
1021 EXPECT_EQ(NOT_CALLED, observation_state_); 1031 // it to |NOT_CALLED|.
1022 observation_state_ = success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR; 1032 WriteCallbackObservationState GetAndResetPostWriteObservationState();
1033
1034 JsonPrefStore::OnWriteCallbackPair GetCallbackPair() {
1035 return std::make_pair(
1036 base::Bind(&WriteCallbacksObserver::OnPreWrite, base::Unretained(this)),
1037 base::Bind(&WriteCallbacksObserver::OnPostWrite,
1038 base::Unretained(this)));
1039 }
1040
1041 void OnPreWrite() {
1042 EXPECT_FALSE(pre_write_called_);
1043 pre_write_called_ = true;
1044 }
1045
1046 void OnPostWrite(bool success) {
1047 EXPECT_EQ(NOT_CALLED, post_write_observation_state_);
1048 post_write_observation_state_ =
1049 success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
1023 } 1050 }
1024 1051
1025 private: 1052 private:
1026 WriteCallbackObservationState observation_state_ = NOT_CALLED; 1053 bool pre_write_called_ = false;
1054 WriteCallbackObservationState post_write_observation_state_ = NOT_CALLED;
1027 1055
1028 DISALLOW_COPY_AND_ASSIGN(WriteCallbackObserver); 1056 DISALLOW_COPY_AND_ASSIGN(WriteCallbacksObserver);
1029 }; 1057 };
1030 1058
1031 void WriteCallbackObserver::ObserveNextWriteCallback(JsonPrefStore* writer) { 1059 void WriteCallbacksObserver::ObserveNextWriteCallback(JsonPrefStore* writer) {
1032 writer->RegisterOnNextWriteSynchronousCallback( 1060 writer->RegisterOnNextWriteSynchronousCallbacks(GetCallbackPair());
1033 base::Bind(&WriteCallbackObserver::OnWrite, base::Unretained(this))); 1061 }
1062
1063 bool WriteCallbacksObserver::GetAndResetPreWriteObservationState() {
1064 bool observation_state = pre_write_called_;
1065 pre_write_called_ = false;
1066 return observation_state;
1034 } 1067 }
1035 1068
1036 WriteCallbackObservationState 1069 WriteCallbackObservationState
1037 WriteCallbackObserver::GetAndResetObservationState() { 1070 WriteCallbacksObserver::GetAndResetPostWriteObservationState() {
1038 WriteCallbackObservationState state = observation_state_; 1071 WriteCallbackObservationState state = post_write_observation_state_;
1039 observation_state_ = NOT_CALLED; 1072 pre_write_called_ = false;
1073 post_write_observation_state_ = NOT_CALLED;
1040 return state; 1074 return state;
1041 } 1075 }
1042 1076
1043 class JsonPrefStoreCallbackTest : public JsonPrefStoreTest { 1077 class JsonPrefStoreCallbackTest : public JsonPrefStoreTest {
1044 public: 1078 public:
1045 JsonPrefStoreCallbackTest() = default; 1079 JsonPrefStoreCallbackTest() = default;
1046 1080
1047 protected: 1081 protected:
1048 void SetUp() override { 1082 void SetUp() override {
1049 JsonPrefStoreTest::SetUp(); 1083 JsonPrefStoreTest::SetUp();
1050 test_file_ = temp_dir_.path().AppendASCII("test.json"); 1084 test_file_ = temp_dir_.path().AppendASCII("test.json");
1051 } 1085 }
1052 1086
1053 scoped_refptr<JsonPrefStore> CreatePrefStore() { 1087 scoped_refptr<JsonPrefStore> CreatePrefStore() {
1054 return new JsonPrefStore(test_file_, message_loop_.task_runner(), 1088 return new JsonPrefStore(test_file_, message_loop_.task_runner(),
1055 std::unique_ptr<PrefFilter>()); 1089 std::unique_ptr<PrefFilter>());
1056 } 1090 }
1057 1091
1058 // Return the ImportantFileWriter for a given JsonPrefStore. 1092 // Return the ImportantFileWriter for a given JsonPrefStore.
1059 ImportantFileWriter* GetImportantFileWriter(JsonPrefStore* pref_store) { 1093 ImportantFileWriter* GetImportantFileWriter(JsonPrefStore* pref_store) {
1060 return &(pref_store->writer_); 1094 return &(pref_store->writer_);
1061 } 1095 }
1062 1096
1063 void TriggerFakeWriteForCallback(JsonPrefStore* pref_store, bool success) { 1097 void TriggerFakeWriteForCallback(JsonPrefStore* pref_store, bool success) {
1064 JsonPrefStore::PostWriteCallback( 1098 JsonPrefStore::PostWriteCallback(
1065 base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback, 1099 base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback,
1066 pref_store->AsWeakPtr()), 1100 pref_store->AsWeakPtr()),
1067 base::Bind(&WriteCallbackObserver::OnWrite, 1101 base::Bind(&WriteCallbacksObserver::OnPostWrite,
1068 base::Unretained(&write_callback_observer_)), 1102 base::Unretained(&write_callback_observer_)),
1069 base::SequencedTaskRunnerHandle::Get(), success); 1103 base::SequencedTaskRunnerHandle::Get(), success);
1070 } 1104 }
1071 1105
1072 SuccessfulWriteReplyObserver successful_write_reply_observer_; 1106 SuccessfulWriteReplyObserver successful_write_reply_observer_;
1073 WriteCallbackObserver write_callback_observer_; 1107 WriteCallbacksObserver write_callback_observer_;
1074 1108
1075 private: 1109 private:
1076 base::FilePath test_file_; 1110 base::FilePath test_file_;
1077 1111
1078 DISALLOW_COPY_AND_ASSIGN(JsonPrefStoreCallbackTest); 1112 DISALLOW_COPY_AND_ASSIGN(JsonPrefStoreCallbackTest);
1079 }; 1113 };
1080 1114
1081 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallback) { 1115 TEST_F(JsonPrefStoreCallbackTest, TestSerializeDataCallbacks) {
1116 base::FilePath input_file = temp_dir_.GetPath().AppendASCII("write.json");
1117 ASSERT_LT(0,
1118 base::WriteFile(input_file, kReadJson, arraysize(kReadJson) - 1));
1119
1120 std::unique_ptr<InterceptingPrefFilter> intercepting_pref_filter(
1121 new InterceptingPrefFilter(write_callback_observer_.GetCallbackPair()));
1122 scoped_refptr<JsonPrefStore> pref_store =
1123 new JsonPrefStore(input_file, message_loop_.task_runner(),
1124 std::move(intercepting_pref_filter));
1125 ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get());
1126
1127 EXPECT_EQ(NOT_CALLED,
1128 write_callback_observer_.GetAndResetPostWriteObservationState());
1129 pref_store->SetValue("normal", base::MakeUnique<base::StringValue>("normal"),
1130 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
1131 file_writer->DoScheduledWrite();
1132
1133 // The observer should not be invoked right away.
1134 EXPECT_FALSE(write_callback_observer_.GetAndResetPreWriteObservationState());
1135 EXPECT_EQ(NOT_CALLED,
1136 write_callback_observer_.GetAndResetPostWriteObservationState());
1137
1138 RunLoop().RunUntilIdle();
1139
1140 EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
1141 EXPECT_EQ(CALLED_WITH_SUCCESS,
1142 write_callback_observer_.GetAndResetPostWriteObservationState());
1143 }
1144
1145 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacks) {
1082 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore(); 1146 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore();
1083 ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get()); 1147 ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get());
1084 1148
1085 // Test RegisterOnNextWriteSynchronousCallback after 1149 // Test RegisterOnNextWriteSynchronousCallbacks after
1086 // RegisterOnNextSuccessfulWriteReply. 1150 // RegisterOnNextSuccessfulWriteReply.
1087 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1151 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1088 write_callback_observer_.ObserveNextWriteCallback(pref_store.get()); 1152 write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
1089 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1153 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1090 RunLoop().RunUntilIdle(); 1154 RunLoop().RunUntilIdle();
1091 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1155 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1092 EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState()); 1156 EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
1157 EXPECT_EQ(CALLED_WITH_SUCCESS,
1158 write_callback_observer_.GetAndResetPostWriteObservationState());
1093 1159
1094 // Test RegisterOnNextSuccessfulWriteReply after 1160 // Test RegisterOnNextSuccessfulWriteReply after
1095 // RegisterOnNextWriteSynchronousCallback. 1161 // RegisterOnNextWriteSynchronousCallbacks.
1096 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1162 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1097 write_callback_observer_.ObserveNextWriteCallback(pref_store.get()); 1163 write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
1098 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1164 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1099 RunLoop().RunUntilIdle(); 1165 RunLoop().RunUntilIdle();
1100 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1166 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1101 EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState()); 1167 EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
1168 EXPECT_EQ(CALLED_WITH_SUCCESS,
1169 write_callback_observer_.GetAndResetPostWriteObservationState());
1102 1170
1103 // Test RegisterOnNextSuccessfulWriteReply only. 1171 // Test RegisterOnNextSuccessfulWriteReply only.
1104 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1172 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1105 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1173 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1106 RunLoop().RunUntilIdle(); 1174 RunLoop().RunUntilIdle();
1107 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1175 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1108 EXPECT_FALSE(write_callback_observer_.GetAndResetObservationState()); 1176 EXPECT_FALSE(write_callback_observer_.GetAndResetPreWriteObservationState());
1177 EXPECT_EQ(NOT_CALLED,
1178 write_callback_observer_.GetAndResetPostWriteObservationState());
1109 1179
1110 // Test RegisterOnNextWriteSynchronousCallback only. 1180 // Test RegisterOnNextWriteSynchronousCallbacks only.
1111 write_callback_observer_.ObserveNextWriteCallback(pref_store.get()); 1181 write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
1112 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1182 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1113 RunLoop().RunUntilIdle(); 1183 RunLoop().RunUntilIdle();
1114 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState()); 1184 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
1115 EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState()); 1185 EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
1186 EXPECT_EQ(CALLED_WITH_SUCCESS,
1187 write_callback_observer_.GetAndResetPostWriteObservationState());
1116 } 1188 }
1117 1189
1118 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) { 1190 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacksWithFakeFailure) {
1119 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore(); 1191 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore();
1120 1192
1121 // Confirm that the observers are invoked. 1193 // Confirm that the observers are invoked.
1122 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1194 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1123 TriggerFakeWriteForCallback(pref_store.get(), true); 1195 TriggerFakeWriteForCallback(pref_store.get(), true);
1124 RunLoop().RunUntilIdle(); 1196 RunLoop().RunUntilIdle();
1125 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1197 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1126 EXPECT_EQ(CALLED_WITH_SUCCESS, 1198 EXPECT_EQ(CALLED_WITH_SUCCESS,
1127 write_callback_observer_.GetAndResetObservationState()); 1199 write_callback_observer_.GetAndResetPostWriteObservationState());
1128 1200
1129 // Confirm that the observation states were reset. 1201 // Confirm that the observation states were reset.
1130 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState()); 1202 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
1131 EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); 1203 EXPECT_EQ(NOT_CALLED,
1204 write_callback_observer_.GetAndResetPostWriteObservationState());
1132 1205
1133 // Confirm that re-installing the observers works for another write. 1206 // Confirm that re-installing the observers works for another write.
1134 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1207 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1135 TriggerFakeWriteForCallback(pref_store.get(), true); 1208 TriggerFakeWriteForCallback(pref_store.get(), true);
1136 RunLoop().RunUntilIdle(); 1209 RunLoop().RunUntilIdle();
1137 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1210 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1138 EXPECT_EQ(CALLED_WITH_SUCCESS, 1211 EXPECT_EQ(CALLED_WITH_SUCCESS,
1139 write_callback_observer_.GetAndResetObservationState()); 1212 write_callback_observer_.GetAndResetPostWriteObservationState());
1140 1213
1141 // Confirm that the successful observer is not invoked by an unsuccessful 1214 // Confirm that the successful observer is not invoked by an unsuccessful
1142 // write, and that the synchronous observer is invoked. 1215 // write, and that the synchronous observer is invoked.
1143 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get()); 1216 successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
1144 TriggerFakeWriteForCallback(pref_store.get(), false); 1217 TriggerFakeWriteForCallback(pref_store.get(), false);
1145 RunLoop().RunUntilIdle(); 1218 RunLoop().RunUntilIdle();
1146 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState()); 1219 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
1147 EXPECT_EQ(CALLED_WITH_ERROR, 1220 EXPECT_EQ(CALLED_WITH_ERROR,
1148 write_callback_observer_.GetAndResetObservationState()); 1221 write_callback_observer_.GetAndResetPostWriteObservationState());
1149 1222
1150 // Do a real write, and confirm that the successful observer was invoked after 1223 // Do a real write, and confirm that the successful observer was invoked after
1151 // being set by |PostWriteCallback| by the last TriggerFakeWriteCallback. 1224 // being set by |PostWriteCallback| by the last TriggerFakeWriteCallback.
1152 ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get()); 1225 ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get());
1153 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1226 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1154 RunLoop().RunUntilIdle(); 1227 RunLoop().RunUntilIdle();
1155 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState()); 1228 EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
1156 EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); 1229 EXPECT_EQ(NOT_CALLED,
1230 write_callback_observer_.GetAndResetPostWriteObservationState());
1157 } 1231 }
1158 1232
1159 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackDuringProfileDeath) { 1233 TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacksDuringProfileDeath) {
1160 // Create a JsonPrefStore and attach observers to it, then delete it by making 1234 // Create a JsonPrefStore and attach observers to it, then delete it by making
1161 // it go out of scope to simulate profile switch or Chrome shutdown. 1235 // it go out of scope to simulate profile switch or Chrome shutdown.
1162 { 1236 {
1163 scoped_refptr<JsonPrefStore> soon_out_of_scope_pref_store = 1237 scoped_refptr<JsonPrefStore> soon_out_of_scope_pref_store =
1164 CreatePrefStore(); 1238 CreatePrefStore();
1165 ImportantFileWriter* file_writer = 1239 ImportantFileWriter* file_writer =
1166 GetImportantFileWriter(soon_out_of_scope_pref_store.get()); 1240 GetImportantFileWriter(soon_out_of_scope_pref_store.get());
1167 successful_write_reply_observer_.ObserveNextWriteCallback( 1241 successful_write_reply_observer_.ObserveNextWriteCallback(
1168 soon_out_of_scope_pref_store.get()); 1242 soon_out_of_scope_pref_store.get());
1169 write_callback_observer_.ObserveNextWriteCallback( 1243 write_callback_observer_.ObserveNextWriteCallback(
1170 soon_out_of_scope_pref_store.get()); 1244 soon_out_of_scope_pref_store.get());
1171 file_writer->WriteNow(MakeUnique<std::string>("foo")); 1245 file_writer->WriteNow(MakeUnique<std::string>("foo"));
1172 } 1246 }
1173 RunLoop().RunUntilIdle(); 1247 RunLoop().RunUntilIdle();
1174 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState()); 1248 EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
1249 EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
1175 EXPECT_EQ(CALLED_WITH_SUCCESS, 1250 EXPECT_EQ(CALLED_WITH_SUCCESS,
1176 write_callback_observer_.GetAndResetObservationState()); 1251 write_callback_observer_.GetAndResetPostWriteObservationState());
1177 } 1252 }
1178 1253
1179 } // namespace base 1254 } // namespace base
OLDNEW
« no previous file with comments | « components/prefs/json_pref_store.cc ('k') | components/prefs/pref_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698