important_file_writer_unittest.cc revision ddb351dbec246cf1fab5ec20d2d5520909041de1
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// Use of this source code is governed by a BSD-style license that can be 306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch// found in the LICENSE file. 406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "chrome/common/important_file_writer.h" 606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/compiler_specific.h" 806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/file_path.h" 906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/file_util.h" 1006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/logging.h" 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 1206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/message_loop.h" 133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 1406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "base/time.h" 1506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 1606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 1706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochnamespace { 1806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 1906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochstd::string GetFileContent(const FilePath& path) { 2006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch std::string content; 2106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch if (!file_util::ReadFileToString(path, &content)) { 2206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch NOTREACHED(); 2306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch } 2406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return content; 2506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 2606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 2706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass DataSerializer : public ImportantFileWriter::DataSerializer { 2806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public: 2906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch explicit DataSerializer(const std::string& data) : data_(data) { 3006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch } 3106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch virtual bool SerializeData(std::string* output) { 3306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch output->assign(data_); 3406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch return true; 3506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch } 3606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 3706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private: 3806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch const std::string data_; 3906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}; 4006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 4106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} // namespace 4206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 4306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdochclass ImportantFileWriterTest : public testing::Test { 4406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch public: 4506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ImportantFileWriterTest() { } 4606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch virtual void SetUp() { 4706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 4806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch file_ = temp_dir_.path().AppendASCII("test-file"); 4906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch } 5006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 5106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch protected: 5206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch FilePath file_; 5306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop loop_; 5406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 5506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch private: 5606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ScopedTempDir temp_dir_; 5706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch}; 5806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 5906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(ImportantFileWriterTest, Basic) { 6006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ImportantFileWriter writer(file_, 6106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch base::MessageLoopProxy::CreateForCurrentThread()); 6206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(file_util::PathExists(writer.path())); 6306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.WriteNow("foo"); 6406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch loop_.RunAllPending(); 6506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 6606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ASSERT_TRUE(file_util::PathExists(writer.path())); 6706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ("foo", GetFileContent(writer.path())); 6806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 6906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 7006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(ImportantFileWriterTest, ScheduleWrite) { 7106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ImportantFileWriter writer(file_, 7206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch base::MessageLoopProxy::CreateForCurrentThread()); 7306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25)); 7406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(writer.HasPendingWrite()); 7506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch DataSerializer serializer("foo"); 7606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.ScheduleWrite(&serializer); 7706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(writer.HasPendingWrite()); 7806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 7906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch new MessageLoop::QuitTask(), 100); 8006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->Run(); 8106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(writer.HasPendingWrite()); 8206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ASSERT_TRUE(file_util::PathExists(writer.path())); 8306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ("foo", GetFileContent(writer.path())); 8406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 8506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 8606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(ImportantFileWriterTest, DoScheduledWrite) { 8706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ImportantFileWriter writer(file_, 8806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch base::MessageLoopProxy::CreateForCurrentThread()); 8906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(writer.HasPendingWrite()); 9006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch DataSerializer serializer("foo"); 9106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.ScheduleWrite(&serializer); 9206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_TRUE(writer.HasPendingWrite()); 9306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.DoScheduledWrite(); 9406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 9506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch new MessageLoop::QuitTask(), 100); 9606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->Run(); 9706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_FALSE(writer.HasPendingWrite()); 9806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ASSERT_TRUE(file_util::PathExists(writer.path())); 9906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ("foo", GetFileContent(writer.path())); 10006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 10106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch 10206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen MurdochTEST_F(ImportantFileWriterTest, BatchingWrites) { 10306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ImportantFileWriter writer(file_, 10406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch base::MessageLoopProxy::CreateForCurrentThread()); 10506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25)); 10606741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch DataSerializer foo("foo"), bar("bar"), baz("baz"); 10706741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.ScheduleWrite(&foo); 10806741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.ScheduleWrite(&bar); 10906741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch writer.ScheduleWrite(&baz); 11006741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 11106741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch new MessageLoop::QuitTask(), 100); 11206741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch MessageLoop::current()->Run(); 11306741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch ASSERT_TRUE(file_util::PathExists(writer.path())); 11406741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch EXPECT_EQ("baz", GetFileContent(writer.path())); 11506741cbc25cd4227a9fba40dfd0273bfcc1a587aBen Murdoch} 116