• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/common/important_file_writer.h"
6 
7 #include "base/compiler_specific.h"
8 #include "base/file_path.h"
9 #include "base/file_util.h"
10 #include "base/logging.h"
11 #include "base/memory/scoped_temp_dir.h"
12 #include "base/message_loop.h"
13 #include "base/threading/thread.h"
14 #include "base/time.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 
17 namespace {
18 
GetFileContent(const FilePath & path)19 std::string GetFileContent(const FilePath& path) {
20   std::string content;
21   if (!file_util::ReadFileToString(path, &content)) {
22     NOTREACHED();
23   }
24   return content;
25 }
26 
27 class DataSerializer : public ImportantFileWriter::DataSerializer {
28  public:
DataSerializer(const std::string & data)29   explicit DataSerializer(const std::string& data) : data_(data) {
30   }
31 
SerializeData(std::string * output)32   virtual bool SerializeData(std::string* output) {
33     output->assign(data_);
34     return true;
35   }
36 
37  private:
38   const std::string data_;
39 };
40 
41 }  // namespace
42 
43 class ImportantFileWriterTest : public testing::Test {
44  public:
ImportantFileWriterTest()45   ImportantFileWriterTest() { }
SetUp()46   virtual void SetUp() {
47     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
48     file_ = temp_dir_.path().AppendASCII("test-file");
49   }
50 
51  protected:
52   FilePath file_;
53   MessageLoop loop_;
54 
55  private:
56   ScopedTempDir temp_dir_;
57 };
58 
TEST_F(ImportantFileWriterTest,Basic)59 TEST_F(ImportantFileWriterTest, Basic) {
60   ImportantFileWriter writer(file_,
61                              base::MessageLoopProxy::CreateForCurrentThread());
62   EXPECT_FALSE(file_util::PathExists(writer.path()));
63   writer.WriteNow("foo");
64   loop_.RunAllPending();
65 
66   ASSERT_TRUE(file_util::PathExists(writer.path()));
67   EXPECT_EQ("foo", GetFileContent(writer.path()));
68 }
69 
TEST_F(ImportantFileWriterTest,ScheduleWrite)70 TEST_F(ImportantFileWriterTest, ScheduleWrite) {
71   ImportantFileWriter writer(file_,
72                              base::MessageLoopProxy::CreateForCurrentThread());
73   writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25));
74   EXPECT_FALSE(writer.HasPendingWrite());
75   DataSerializer serializer("foo");
76   writer.ScheduleWrite(&serializer);
77   EXPECT_TRUE(writer.HasPendingWrite());
78   MessageLoop::current()->PostDelayedTask(FROM_HERE,
79                                           new MessageLoop::QuitTask(), 100);
80   MessageLoop::current()->Run();
81   EXPECT_FALSE(writer.HasPendingWrite());
82   ASSERT_TRUE(file_util::PathExists(writer.path()));
83   EXPECT_EQ("foo", GetFileContent(writer.path()));
84 }
85 
TEST_F(ImportantFileWriterTest,DoScheduledWrite)86 TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
87   ImportantFileWriter writer(file_,
88                              base::MessageLoopProxy::CreateForCurrentThread());
89   EXPECT_FALSE(writer.HasPendingWrite());
90   DataSerializer serializer("foo");
91   writer.ScheduleWrite(&serializer);
92   EXPECT_TRUE(writer.HasPendingWrite());
93   writer.DoScheduledWrite();
94   MessageLoop::current()->PostDelayedTask(FROM_HERE,
95                                           new MessageLoop::QuitTask(), 100);
96   MessageLoop::current()->Run();
97   EXPECT_FALSE(writer.HasPendingWrite());
98   ASSERT_TRUE(file_util::PathExists(writer.path()));
99   EXPECT_EQ("foo", GetFileContent(writer.path()));
100 }
101 
TEST_F(ImportantFileWriterTest,BatchingWrites)102 TEST_F(ImportantFileWriterTest, BatchingWrites) {
103   ImportantFileWriter writer(file_,
104                              base::MessageLoopProxy::CreateForCurrentThread());
105   writer.set_commit_interval(base::TimeDelta::FromMilliseconds(25));
106   DataSerializer foo("foo"), bar("bar"), baz("baz");
107   writer.ScheduleWrite(&foo);
108   writer.ScheduleWrite(&bar);
109   writer.ScheduleWrite(&baz);
110   MessageLoop::current()->PostDelayedTask(FROM_HERE,
111                                           new MessageLoop::QuitTask(), 100);
112   MessageLoop::current()->Run();
113   ASSERT_TRUE(file_util::PathExists(writer.path()));
114   EXPECT_EQ("baz", GetFileContent(writer.path()));
115 }
116