diff options
Diffstat (limited to 'base/files/important_file_writer_unittest.cc')
-rw-r--r-- | base/files/important_file_writer_unittest.cc | 149 |
1 files changed, 37 insertions, 112 deletions
diff --git a/base/files/important_file_writer_unittest.cc b/base/files/important_file_writer_unittest.cc index 9b8dcfd4e3..43e051ebcf 100644 --- a/base/files/important_file_writer_unittest.cc +++ b/base/files/important_file_writer_unittest.cc @@ -46,61 +46,39 @@ class DataSerializer : public ImportantFileWriter::DataSerializer { const std::string data_; }; -enum WriteCallbackObservationState { - NOT_CALLED, - CALLED_WITH_ERROR, - CALLED_WITH_SUCCESS, -}; - -class WriteCallbacksObserver { +class SuccessfulWriteObserver { public: - WriteCallbacksObserver() = default; + SuccessfulWriteObserver() : successful_write_observed_(false) {} - // Register OnBeforeWrite() and OnAfterWrite() to be called on the next write + // Register on_successful_write() to be called on the next successful write // of |writer|. - void ObserveNextWriteCallbacks(ImportantFileWriter* writer); + void ObserveNextSuccessfulWrite(ImportantFileWriter* writer); - // Returns the |WriteCallbackObservationState| which was observed, then resets - // it to |NOT_CALLED|. - WriteCallbackObservationState GetAndResetObservationState(); + // Returns true if a successful write was observed via on_successful_write() + // and resets the observation state to false regardless. + bool GetAndResetObservationState(); private: - void OnBeforeWrite() { - EXPECT_FALSE(before_write_called_); - before_write_called_ = true; - } - - void OnAfterWrite(bool success) { - EXPECT_EQ(NOT_CALLED, after_write_observation_state_); - after_write_observation_state_ = - success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR; + void on_successful_write() { + EXPECT_FALSE(successful_write_observed_); + successful_write_observed_ = true; } - bool before_write_called_ = false; - WriteCallbackObservationState after_write_observation_state_ = NOT_CALLED; + bool successful_write_observed_; - DISALLOW_COPY_AND_ASSIGN(WriteCallbacksObserver); + DISALLOW_COPY_AND_ASSIGN(SuccessfulWriteObserver); }; -void WriteCallbacksObserver::ObserveNextWriteCallbacks( +void SuccessfulWriteObserver::ObserveNextSuccessfulWrite( ImportantFileWriter* writer) { - writer->RegisterOnNextWriteCallbacks( - base::Bind(&WriteCallbacksObserver::OnBeforeWrite, - base::Unretained(this)), - base::Bind(&WriteCallbacksObserver::OnAfterWrite, - base::Unretained(this))); + writer->RegisterOnNextSuccessfulWriteCallback(base::Bind( + &SuccessfulWriteObserver::on_successful_write, base::Unretained(this))); } -WriteCallbackObservationState -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; +bool SuccessfulWriteObserver::GetAndResetObservationState() { + bool was_successful_write_observed = successful_write_observed_; + successful_write_observed_ = false; + return was_successful_write_observed; } } // namespace @@ -110,11 +88,11 @@ class ImportantFileWriterTest : public testing::Test { ImportantFileWriterTest() { } void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); - file_ = temp_dir_.GetPath().AppendASCII("test-file"); + file_ = temp_dir_.path().AppendASCII("test-file"); } protected: - WriteCallbacksObserver write_callback_observer_; + SuccessfulWriteObserver successful_write_observer_; FilePath file_; MessageLoop loop_; @@ -125,102 +103,49 @@ class ImportantFileWriterTest : public testing::Test { TEST_F(ImportantFileWriterTest, Basic) { ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get()); EXPECT_FALSE(PathExists(writer.path())); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - writer.WriteNow(MakeUnique<std::string>("foo")); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); + writer.WriteNow(WrapUnique(new std::string("foo"))); RunLoop().RunUntilIdle(); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); ASSERT_TRUE(PathExists(writer.path())); EXPECT_EQ("foo", GetFileContent(writer.path())); } -TEST_F(ImportantFileWriterTest, WriteWithObserver) { +TEST_F(ImportantFileWriterTest, BasicWithSuccessfulWriteObserver) { ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get()); EXPECT_FALSE(PathExists(writer.path())); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - - // Confirm that the observer is invoked. - write_callback_observer_.ObserveNextWriteCallbacks(&writer); - writer.WriteNow(MakeUnique<std::string>("foo")); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); + successful_write_observer_.ObserveNextSuccessfulWrite(&writer); + writer.WriteNow(WrapUnique(new std::string("foo"))); RunLoop().RunUntilIdle(); - EXPECT_EQ(CALLED_WITH_SUCCESS, - write_callback_observer_.GetAndResetObservationState()); + // Confirm that the observer is invoked. + EXPECT_TRUE(successful_write_observer_.GetAndResetObservationState()); ASSERT_TRUE(PathExists(writer.path())); EXPECT_EQ("foo", GetFileContent(writer.path())); // Confirm that re-installing the observer works for another write. - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - write_callback_observer_.ObserveNextWriteCallbacks(&writer); - writer.WriteNow(MakeUnique<std::string>("bar")); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); + successful_write_observer_.ObserveNextSuccessfulWrite(&writer); + writer.WriteNow(WrapUnique(new std::string("bar"))); RunLoop().RunUntilIdle(); - EXPECT_EQ(CALLED_WITH_SUCCESS, - write_callback_observer_.GetAndResetObservationState()); + EXPECT_TRUE(successful_write_observer_.GetAndResetObservationState()); ASSERT_TRUE(PathExists(writer.path())); EXPECT_EQ("bar", GetFileContent(writer.path())); // Confirm that writing again without re-installing the observer doesn't // result in a notification. - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - writer.WriteNow(MakeUnique<std::string>("baz")); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); + writer.WriteNow(WrapUnique(new std::string("baz"))); RunLoop().RunUntilIdle(); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); + EXPECT_FALSE(successful_write_observer_.GetAndResetObservationState()); ASSERT_TRUE(PathExists(writer.path())); EXPECT_EQ("baz", GetFileContent(writer.path())); } -TEST_F(ImportantFileWriterTest, FailedWriteWithObserver) { - // Use an invalid file path (relative paths are invalid) to get a - // FILE_ERROR_ACCESS_DENIED error when trying to write the file. - ImportantFileWriter writer(FilePath().AppendASCII("bad/../path"), - ThreadTaskRunnerHandle::Get()); - EXPECT_FALSE(PathExists(writer.path())); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - write_callback_observer_.ObserveNextWriteCallbacks(&writer); - writer.WriteNow(MakeUnique<std::string>("foo")); - RunLoop().RunUntilIdle(); - - // Confirm that the write observer was invoked with its boolean parameter set - // to false. - EXPECT_EQ(CALLED_WITH_ERROR, - write_callback_observer_.GetAndResetObservationState()); - EXPECT_FALSE(PathExists(writer.path())); -} - -TEST_F(ImportantFileWriterTest, CallbackRunsOnWriterThread) { - base::Thread file_writer_thread("ImportantFileWriter test thread"); - file_writer_thread.Start(); - ImportantFileWriter writer(file_, file_writer_thread.task_runner()); - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - - // 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 - // |file_writer_thread| is unblocked. - EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState()); - - wait_helper.Signal(); - file_writer_thread.FlushForTesting(); - - EXPECT_EQ(CALLED_WITH_SUCCESS, - write_callback_observer_.GetAndResetObservationState()); - ASSERT_TRUE(PathExists(writer.path())); - EXPECT_EQ("foo", GetFileContent(writer.path())); -} - TEST_F(ImportantFileWriterTest, ScheduleWrite) { ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get(), |