| Index: components/prefs/json_pref_store_unittest.cc
|
| diff --git a/components/prefs/json_pref_store_unittest.cc b/components/prefs/json_pref_store_unittest.cc
|
| index cf93e7ef3352a137cf1bf4f5a5e312990036bae7..f6ce3adb65d28176d5d3ee98ed027d2be201c557 100644
|
| --- a/components/prefs/json_pref_store_unittest.cc
|
| +++ b/components/prefs/json_pref_store_unittest.cc
|
| @@ -69,6 +69,7 @@ void SetCurrentTimeInMinutes(double minutes, base::SimpleTestClock* clock) {
|
| class InterceptingPrefFilter : public PrefFilter {
|
| public:
|
| InterceptingPrefFilter();
|
| + InterceptingPrefFilter(OnWriteCallbackPair callback_pair);
|
| ~InterceptingPrefFilter() override;
|
|
|
| // PrefFilter implementation:
|
| @@ -76,8 +77,10 @@ class InterceptingPrefFilter : public PrefFilter {
|
| const PostFilterOnLoadCallback& post_filter_on_load_callback,
|
| std::unique_ptr<base::DictionaryValue> pref_store_contents) override;
|
| void FilterUpdate(const std::string& path) override {}
|
| - void FilterSerializeData(
|
| - base::DictionaryValue* pref_store_contents) override {}
|
| + OnWriteCallbackPair FilterSerializeData(
|
| + base::DictionaryValue* pref_store_contents) override {
|
| + return on_write_callback_pair_;
|
| + }
|
|
|
| bool has_intercepted_prefs() const { return intercepted_prefs_ != NULL; }
|
|
|
| @@ -88,11 +91,18 @@ class InterceptingPrefFilter : public PrefFilter {
|
| private:
|
| PostFilterOnLoadCallback post_filter_on_load_callback_;
|
| std::unique_ptr<base::DictionaryValue> intercepted_prefs_;
|
| + OnWriteCallbackPair on_write_callback_pair_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InterceptingPrefFilter);
|
| };
|
|
|
| InterceptingPrefFilter::InterceptingPrefFilter() {}
|
| +
|
| +InterceptingPrefFilter::InterceptingPrefFilter(
|
| + OnWriteCallbackPair callback_pair) {
|
| + on_write_callback_pair_ = callback_pair;
|
| +}
|
| +
|
| InterceptingPrefFilter::~InterceptingPrefFilter() {}
|
|
|
| void InterceptingPrefFilter::FilterOnLoad(
|
| @@ -1006,37 +1016,61 @@ enum WriteCallbackObservationState {
|
| CALLED_WITH_SUCCESS,
|
| };
|
|
|
| -class WriteCallbackObserver {
|
| +class WriteCallbacksObserver {
|
| public:
|
| - WriteCallbackObserver() = default;
|
| + WriteCallbacksObserver() = default;
|
|
|
| // Register OnWrite() to be called on the next write of |json_pref_store|.
|
| void ObserveNextWriteCallback(JsonPrefStore* json_pref_store);
|
|
|
| - // Returns true if a write was observed via OnWrite()
|
| - // and resets the observation state to false regardless.
|
| - WriteCallbackObservationState GetAndResetObservationState();
|
| + // Returns whether OnPreWrite() was called, and resets the observation state
|
| + // to false.
|
| + bool GetAndResetPreWriteObservationState();
|
|
|
| - void OnWrite(bool success) {
|
| - EXPECT_EQ(NOT_CALLED, observation_state_);
|
| - observation_state_ = success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
|
| + // Returns the |WriteCallbackObservationState| which was observed, then resets
|
| + // it to |NOT_CALLED|.
|
| + WriteCallbackObservationState GetAndResetPostWriteObservationState();
|
| +
|
| + JsonPrefStore::OnWriteCallbackPair GetCallbackPair() {
|
| + return std::make_pair(
|
| + base::Bind(&WriteCallbacksObserver::OnPreWrite, base::Unretained(this)),
|
| + base::Bind(&WriteCallbacksObserver::OnPostWrite,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + void OnPreWrite() {
|
| + EXPECT_FALSE(pre_write_called_);
|
| + pre_write_called_ = true;
|
| + }
|
| +
|
| + void OnPostWrite(bool success) {
|
| + EXPECT_EQ(NOT_CALLED, post_write_observation_state_);
|
| + post_write_observation_state_ =
|
| + success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
|
| }
|
|
|
| private:
|
| - WriteCallbackObservationState observation_state_ = NOT_CALLED;
|
| + bool pre_write_called_ = false;
|
| + WriteCallbackObservationState post_write_observation_state_ = NOT_CALLED;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(WriteCallbackObserver);
|
| + DISALLOW_COPY_AND_ASSIGN(WriteCallbacksObserver);
|
| };
|
|
|
| -void WriteCallbackObserver::ObserveNextWriteCallback(JsonPrefStore* writer) {
|
| - writer->RegisterOnNextWriteSynchronousCallback(
|
| - base::Bind(&WriteCallbackObserver::OnWrite, base::Unretained(this)));
|
| +void WriteCallbacksObserver::ObserveNextWriteCallback(JsonPrefStore* writer) {
|
| + writer->RegisterOnNextWriteSynchronousCallbacks(GetCallbackPair());
|
| +}
|
| +
|
| +bool WriteCallbacksObserver::GetAndResetPreWriteObservationState() {
|
| + bool observation_state = pre_write_called_;
|
| + pre_write_called_ = false;
|
| + return observation_state;
|
| }
|
|
|
| WriteCallbackObservationState
|
| -WriteCallbackObserver::GetAndResetObservationState() {
|
| - WriteCallbackObservationState state = observation_state_;
|
| - observation_state_ = NOT_CALLED;
|
| +WriteCallbacksObserver::GetAndResetPostWriteObservationState() {
|
| + WriteCallbackObservationState state = post_write_observation_state_;
|
| + pre_write_called_ = false;
|
| + post_write_observation_state_ = NOT_CALLED;
|
| return state;
|
| }
|
|
|
| @@ -1064,13 +1098,13 @@ class JsonPrefStoreCallbackTest : public JsonPrefStoreTest {
|
| JsonPrefStore::PostWriteCallback(
|
| base::Bind(&JsonPrefStore::RunOrScheduleNextSuccessfulWriteCallback,
|
| pref_store->AsWeakPtr()),
|
| - base::Bind(&WriteCallbackObserver::OnWrite,
|
| + base::Bind(&WriteCallbacksObserver::OnPostWrite,
|
| base::Unretained(&write_callback_observer_)),
|
| base::SequencedTaskRunnerHandle::Get(), success);
|
| }
|
|
|
| SuccessfulWriteReplyObserver successful_write_reply_observer_;
|
| - WriteCallbackObserver write_callback_observer_;
|
| + WriteCallbacksObserver write_callback_observer_;
|
|
|
| private:
|
| base::FilePath test_file_;
|
| @@ -1078,44 +1112,82 @@ class JsonPrefStoreCallbackTest : public JsonPrefStoreTest {
|
| DISALLOW_COPY_AND_ASSIGN(JsonPrefStoreCallbackTest);
|
| };
|
|
|
| -TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallback) {
|
| +TEST_F(JsonPrefStoreCallbackTest, TestSerializeDataCallbacks) {
|
| + base::FilePath input_file = temp_dir_.GetPath().AppendASCII("write.json");
|
| + ASSERT_LT(0,
|
| + base::WriteFile(input_file, kReadJson, arraysize(kReadJson) - 1));
|
| +
|
| + std::unique_ptr<InterceptingPrefFilter> intercepting_pref_filter(
|
| + new InterceptingPrefFilter(write_callback_observer_.GetCallbackPair()));
|
| + scoped_refptr<JsonPrefStore> pref_store =
|
| + new JsonPrefStore(input_file, message_loop_.task_runner(),
|
| + std::move(intercepting_pref_filter));
|
| + ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get());
|
| +
|
| + EXPECT_EQ(NOT_CALLED,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| + pref_store->SetValue("normal", base::MakeUnique<base::StringValue>("normal"),
|
| + WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
|
| + file_writer->DoScheduledWrite();
|
| +
|
| + // The observer should not be invoked right away.
|
| + EXPECT_FALSE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(NOT_CALLED,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| +
|
| + RunLoop().RunUntilIdle();
|
| +
|
| + EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| +}
|
| +
|
| +TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacks) {
|
| scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore();
|
| ImportantFileWriter* file_writer = GetImportantFileWriter(pref_store.get());
|
|
|
| - // Test RegisterOnNextWriteSynchronousCallback after
|
| + // Test RegisterOnNextWriteSynchronousCallbacks after
|
| // RegisterOnNextSuccessfulWriteReply.
|
| successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
|
| write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
|
| file_writer->WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Test RegisterOnNextSuccessfulWriteReply after
|
| - // RegisterOnNextWriteSynchronousCallback.
|
| + // RegisterOnNextWriteSynchronousCallbacks.
|
| successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
|
| write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
|
| file_writer->WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Test RegisterOnNextSuccessfulWriteReply only.
|
| successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
|
| file_writer->WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_FALSE(write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_FALSE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(NOT_CALLED,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| - // Test RegisterOnNextWriteSynchronousCallback only.
|
| + // Test RegisterOnNextWriteSynchronousCallbacks only.
|
| write_callback_observer_.ObserveNextWriteCallback(pref_store.get());
|
| file_writer->WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
| EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_TRUE(write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| + EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| }
|
|
|
| -TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) {
|
| +TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacksWithFakeFailure) {
|
| scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore();
|
|
|
| // Confirm that the observers are invoked.
|
| @@ -1124,11 +1196,12 @@ TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) {
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| - write_callback_observer_.GetAndResetObservationState());
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Confirm that the observation states were reset.
|
| EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_EQ(NOT_CALLED,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Confirm that re-installing the observers works for another write.
|
| successful_write_reply_observer_.ObserveNextWriteCallback(pref_store.get());
|
| @@ -1136,7 +1209,7 @@ TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) {
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| - write_callback_observer_.GetAndResetObservationState());
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Confirm that the successful observer is not invoked by an unsuccessful
|
| // write, and that the synchronous observer is invoked.
|
| @@ -1145,7 +1218,7 @@ TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) {
|
| RunLoop().RunUntilIdle();
|
| EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
|
| EXPECT_EQ(CALLED_WITH_ERROR,
|
| - write_callback_observer_.GetAndResetObservationState());
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
|
|
| // Do a real write, and confirm that the successful observer was invoked after
|
| // being set by |PostWriteCallback| by the last TriggerFakeWriteCallback.
|
| @@ -1153,10 +1226,11 @@ TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackWithFakeFailure) {
|
| file_writer->WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
| EXPECT_TRUE(successful_write_reply_observer_.GetAndResetObservationState());
|
| - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
| + EXPECT_EQ(NOT_CALLED,
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| }
|
|
|
| -TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackDuringProfileDeath) {
|
| +TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbacksDuringProfileDeath) {
|
| // Create a JsonPrefStore and attach observers to it, then delete it by making
|
| // it go out of scope to simulate profile switch or Chrome shutdown.
|
| {
|
| @@ -1172,8 +1246,9 @@ TEST_F(JsonPrefStoreCallbackTest, TestPostWriteCallbackDuringProfileDeath) {
|
| }
|
| RunLoop().RunUntilIdle();
|
| EXPECT_FALSE(successful_write_reply_observer_.GetAndResetObservationState());
|
| + EXPECT_TRUE(write_callback_observer_.GetAndResetPreWriteObservationState());
|
| EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| - write_callback_observer_.GetAndResetObservationState());
|
| + write_callback_observer_.GetAndResetPostWriteObservationState());
|
| }
|
|
|
| } // namespace base
|
|
|