| Index: base/files/important_file_writer_unittest.cc
|
| diff --git a/base/files/important_file_writer_unittest.cc b/base/files/important_file_writer_unittest.cc
|
| index b8920a07679e890454eb0d399547cf891aa60866..9b8dcfd4e369d524b86b1851f9a399319f071fb4 100644
|
| --- a/base/files/important_file_writer_unittest.cc
|
| +++ b/base/files/important_file_writer_unittest.cc
|
| @@ -52,38 +52,54 @@ enum WriteCallbackObservationState {
|
| CALLED_WITH_SUCCESS,
|
| };
|
|
|
| -class WriteCallbackObserver {
|
| +class WriteCallbacksObserver {
|
| public:
|
| - WriteCallbackObserver() : observation_state_(NOT_CALLED) {}
|
| + WriteCallbacksObserver() = default;
|
|
|
| - // Register OnWrite() to be called on the next write of |writer|.
|
| - void ObserveNextWriteCallback(ImportantFileWriter* writer);
|
| + // Register OnBeforeWrite() and OnAfterWrite() to be called on the next write
|
| + // of |writer|.
|
| + void ObserveNextWriteCallbacks(ImportantFileWriter* writer);
|
|
|
| - // Returns true if a write was observed via OnWrite()
|
| - // and resets the observation state to false regardless.
|
| + // Returns the |WriteCallbackObservationState| which was observed, then resets
|
| + // it to |NOT_CALLED|.
|
| WriteCallbackObservationState GetAndResetObservationState();
|
|
|
| private:
|
| - void OnWrite(bool success) {
|
| - EXPECT_EQ(NOT_CALLED, observation_state_);
|
| - observation_state_ = success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
|
| + void OnBeforeWrite() {
|
| + EXPECT_FALSE(before_write_called_);
|
| + before_write_called_ = true;
|
| }
|
|
|
| - WriteCallbackObservationState observation_state_;
|
| + void OnAfterWrite(bool success) {
|
| + EXPECT_EQ(NOT_CALLED, after_write_observation_state_);
|
| + after_write_observation_state_ =
|
| + success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
|
| + }
|
| +
|
| + bool before_write_called_ = false;
|
| + WriteCallbackObservationState after_write_observation_state_ = NOT_CALLED;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(WriteCallbackObserver);
|
| + DISALLOW_COPY_AND_ASSIGN(WriteCallbacksObserver);
|
| };
|
|
|
| -void WriteCallbackObserver::ObserveNextWriteCallback(
|
| +void WriteCallbacksObserver::ObserveNextWriteCallbacks(
|
| ImportantFileWriter* writer) {
|
| - writer->RegisterOnNextWriteCallback(
|
| - base::Bind(&WriteCallbackObserver::OnWrite, base::Unretained(this)));
|
| + writer->RegisterOnNextWriteCallbacks(
|
| + base::Bind(&WriteCallbacksObserver::OnBeforeWrite,
|
| + base::Unretained(this)),
|
| + base::Bind(&WriteCallbacksObserver::OnAfterWrite,
|
| + base::Unretained(this)));
|
| }
|
|
|
| WriteCallbackObservationState
|
| -WriteCallbackObserver::GetAndResetObservationState() {
|
| - WriteCallbackObservationState state = observation_state_;
|
| - observation_state_ = NOT_CALLED;
|
| +WriteCallbacksObserver::GetAndResetObservationState() {
|
| + EXPECT_EQ(after_write_observation_state_ != NOT_CALLED, before_write_called_)
|
| + << "The before-write callback should always be called before the "
|
| + "after-write callback";
|
| +
|
| + WriteCallbackObservationState state = after_write_observation_state_;
|
| + before_write_called_ = false;
|
| + after_write_observation_state_ = NOT_CALLED;
|
| return state;
|
| }
|
|
|
| @@ -98,7 +114,7 @@ class ImportantFileWriterTest : public testing::Test {
|
| }
|
|
|
| protected:
|
| - WriteCallbackObserver write_callback_observer_;
|
| + WriteCallbacksObserver write_callback_observer_;
|
| FilePath file_;
|
| MessageLoop loop_;
|
|
|
| @@ -124,7 +140,7 @@ TEST_F(ImportantFileWriterTest, WriteWithObserver) {
|
| EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
|
|
| // Confirm that the observer is invoked.
|
| - write_callback_observer_.ObserveNextWriteCallback(&writer);
|
| + write_callback_observer_.ObserveNextWriteCallbacks(&writer);
|
| writer.WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
|
|
| @@ -135,7 +151,7 @@ TEST_F(ImportantFileWriterTest, WriteWithObserver) {
|
|
|
| // Confirm that re-installing the observer works for another write.
|
| EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
| - write_callback_observer_.ObserveNextWriteCallback(&writer);
|
| + write_callback_observer_.ObserveNextWriteCallbacks(&writer);
|
| writer.WriteNow(MakeUnique<std::string>("bar"));
|
| RunLoop().RunUntilIdle();
|
|
|
| @@ -162,7 +178,7 @@ TEST_F(ImportantFileWriterTest, FailedWriteWithObserver) {
|
| ThreadTaskRunnerHandle::Get());
|
| EXPECT_FALSE(PathExists(writer.path()));
|
| EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
| - write_callback_observer_.ObserveNextWriteCallback(&writer);
|
| + write_callback_observer_.ObserveNextWriteCallbacks(&writer);
|
| writer.WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
|
|
| @@ -179,15 +195,26 @@ TEST_F(ImportantFileWriterTest, CallbackRunsOnWriterThread) {
|
| ImportantFileWriter writer(file_, file_writer_thread.task_runner());
|
| EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
|
|
| - write_callback_observer_.ObserveNextWriteCallback(&writer);
|
| + // Block execution on |file_writer_thread| to verify that callbacks are
|
| + // executed on it.
|
| + base::WaitableEvent wait_helper(
|
| + base::WaitableEvent::ResetPolicy::MANUAL,
|
| + base::WaitableEvent::InitialState::NOT_SIGNALED);
|
| + file_writer_thread.task_runner()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&base::WaitableEvent::Wait, base::Unretained(&wait_helper)));
|
| +
|
| + write_callback_observer_.ObserveNextWriteCallbacks(&writer);
|
| writer.WriteNow(MakeUnique<std::string>("foo"));
|
| RunLoop().RunUntilIdle();
|
|
|
| - // Expect the callback to not have been executed before the write.
|
| + // Expect the callback to not have been executed before the
|
| + // |file_writer_thread| is unblocked.
|
| EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
|
|
|
| - // Make sure tasks posted by WriteNow() have ran before continuing.
|
| + wait_helper.Signal();
|
| file_writer_thread.FlushForTesting();
|
| +
|
| EXPECT_EQ(CALLED_WITH_SUCCESS,
|
| write_callback_observer_.GetAndResetObservationState());
|
| ASSERT_TRUE(PathExists(writer.path()));
|
|
|