blob: 3f24d10da61129f047c5f0ec097aeeeaacc19484 [file] [log] [blame]
joi@chromium.org20009e32012-10-25 01:33:36 +09001// Copyright (c) 2012 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 "base/files/important_file_writer.h"
6
7#include "base/compiler_specific.h"
joi@chromium.org20009e32012-10-25 01:33:36 +09008#include "base/file_util.h"
brettw@chromium.org59eef1f2013-02-24 14:40:52 +09009#include "base/files/file_path.h"
brettw@chromium.org091db522012-11-17 05:34:23 +090010#include "base/files/scoped_temp_dir.h"
joi@chromium.org20009e32012-10-25 01:33:36 +090011#include "base/logging.h"
12#include "base/message_loop.h"
tfarina@chromium.org7d4a0ec2013-02-07 01:56:19 +090013#include "base/run_loop.h"
joi@chromium.org20009e32012-10-25 01:33:36 +090014#include "base/threading/thread.h"
avi@chromium.orgb039e8b2013-06-28 09:49:07 +090015#include "base/time/time.h"
joi@chromium.org20009e32012-10-25 01:33:36 +090016#include "testing/gtest/include/gtest/gtest.h"
17
18namespace base {
19
20namespace {
21
22std::string GetFileContent(const FilePath& path) {
23 std::string content;
24 if (!file_util::ReadFileToString(path, &content)) {
25 NOTREACHED();
26 }
27 return content;
28}
29
30class DataSerializer : public ImportantFileWriter::DataSerializer {
31 public:
32 explicit DataSerializer(const std::string& data) : data_(data) {
33 }
34
rsleevi@chromium.org7cc002a2013-02-07 16:20:55 +090035 virtual bool SerializeData(std::string* output) OVERRIDE {
joi@chromium.org20009e32012-10-25 01:33:36 +090036 output->assign(data_);
37 return true;
38 }
39
40 private:
41 const std::string data_;
42};
43
44} // namespace
45
46class ImportantFileWriterTest : public testing::Test {
47 public:
48 ImportantFileWriterTest() { }
49 virtual void SetUp() {
50 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
51 file_ = temp_dir_.path().AppendASCII("test-file");
52 }
53
54 protected:
55 FilePath file_;
56 MessageLoop loop_;
57
58 private:
59 ScopedTempDir temp_dir_;
60};
61
62TEST_F(ImportantFileWriterTest, Basic) {
rsleevi@chromium.org64293f12013-06-12 01:46:36 +090063 ImportantFileWriter writer(file_, MessageLoopProxy::current().get());
brettw@chromium.org10b64122013-07-12 02:36:07 +090064 EXPECT_FALSE(PathExists(writer.path()));
joi@chromium.org20009e32012-10-25 01:33:36 +090065 writer.WriteNow("foo");
tfarina@chromium.org7d4a0ec2013-02-07 01:56:19 +090066 RunLoop().RunUntilIdle();
joi@chromium.org20009e32012-10-25 01:33:36 +090067
brettw@chromium.org10b64122013-07-12 02:36:07 +090068 ASSERT_TRUE(PathExists(writer.path()));
joi@chromium.org20009e32012-10-25 01:33:36 +090069 EXPECT_EQ("foo", GetFileContent(writer.path()));
70}
71
72TEST_F(ImportantFileWriterTest, ScheduleWrite) {
rsleevi@chromium.org64293f12013-06-12 01:46:36 +090073 ImportantFileWriter writer(file_, MessageLoopProxy::current().get());
joi@chromium.org20009e32012-10-25 01:33:36 +090074 writer.set_commit_interval(TimeDelta::FromMilliseconds(25));
75 EXPECT_FALSE(writer.HasPendingWrite());
76 DataSerializer serializer("foo");
77 writer.ScheduleWrite(&serializer);
78 EXPECT_TRUE(writer.HasPendingWrite());
79 MessageLoop::current()->PostDelayedTask(
80 FROM_HERE,
thakis@chromium.orgfc6f9292013-02-05 08:40:00 +090081 MessageLoop::QuitWhenIdleClosure(),
joi@chromium.org20009e32012-10-25 01:33:36 +090082 TimeDelta::FromMilliseconds(100));
83 MessageLoop::current()->Run();
84 EXPECT_FALSE(writer.HasPendingWrite());
brettw@chromium.org10b64122013-07-12 02:36:07 +090085 ASSERT_TRUE(PathExists(writer.path()));
joi@chromium.org20009e32012-10-25 01:33:36 +090086 EXPECT_EQ("foo", GetFileContent(writer.path()));
87}
88
89TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
rsleevi@chromium.org64293f12013-06-12 01:46:36 +090090 ImportantFileWriter writer(file_, MessageLoopProxy::current().get());
joi@chromium.org20009e32012-10-25 01:33:36 +090091 EXPECT_FALSE(writer.HasPendingWrite());
92 DataSerializer serializer("foo");
93 writer.ScheduleWrite(&serializer);
94 EXPECT_TRUE(writer.HasPendingWrite());
95 writer.DoScheduledWrite();
96 MessageLoop::current()->PostDelayedTask(
97 FROM_HERE,
thakis@chromium.orgfc6f9292013-02-05 08:40:00 +090098 MessageLoop::QuitWhenIdleClosure(),
joi@chromium.org20009e32012-10-25 01:33:36 +090099 TimeDelta::FromMilliseconds(100));
100 MessageLoop::current()->Run();
101 EXPECT_FALSE(writer.HasPendingWrite());
brettw@chromium.org10b64122013-07-12 02:36:07 +0900102 ASSERT_TRUE(PathExists(writer.path()));
joi@chromium.org20009e32012-10-25 01:33:36 +0900103 EXPECT_EQ("foo", GetFileContent(writer.path()));
104}
105
phajdan.jr@chromium.orgf3dfdd42012-11-08 13:29:12 +0900106TEST_F(ImportantFileWriterTest, BatchingWrites) {
rsleevi@chromium.org64293f12013-06-12 01:46:36 +0900107 ImportantFileWriter writer(file_, MessageLoopProxy::current().get());
joi@chromium.org20009e32012-10-25 01:33:36 +0900108 writer.set_commit_interval(TimeDelta::FromMilliseconds(25));
109 DataSerializer foo("foo"), bar("bar"), baz("baz");
110 writer.ScheduleWrite(&foo);
111 writer.ScheduleWrite(&bar);
112 writer.ScheduleWrite(&baz);
113 MessageLoop::current()->PostDelayedTask(
114 FROM_HERE,
thakis@chromium.orgfc6f9292013-02-05 08:40:00 +0900115 MessageLoop::QuitWhenIdleClosure(),
joi@chromium.org20009e32012-10-25 01:33:36 +0900116 TimeDelta::FromMilliseconds(100));
117 MessageLoop::current()->Run();
brettw@chromium.org10b64122013-07-12 02:36:07 +0900118 ASSERT_TRUE(PathExists(writer.path()));
joi@chromium.org20009e32012-10-25 01:33:36 +0900119 EXPECT_EQ("baz", GetFileContent(writer.path()));
120}
121
122} // namespace base