Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(223)

Side by Side Diff: base/prefs/json_pref_store_unittest.cc

Issue 1127963002: Implement lossy pref behavior for JsonPrefStore. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@prefs-fix-flags
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/prefs/json_pref_store.h" 5 #include "base/prefs/json_pref_store.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/files/file_util.h" 8 #include "base/files/file_util.h"
9 #include "base/files/scoped_temp_dir.h" 9 #include "base/files/scoped_temp_dir.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 EXPECT_TRUE(actual->GetAsBoolean(&boolean)); 206 EXPECT_TRUE(actual->GetAsBoolean(&boolean));
207 EXPECT_TRUE(boolean); 207 EXPECT_TRUE(boolean);
208 208
209 pref_store->SetValue(kNewWindowsInTabs, new FundamentalValue(false), 209 pref_store->SetValue(kNewWindowsInTabs, new FundamentalValue(false),
210 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 210 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
211 EXPECT_TRUE(pref_store->GetValue(kNewWindowsInTabs, &actual)); 211 EXPECT_TRUE(pref_store->GetValue(kNewWindowsInTabs, &actual));
212 EXPECT_TRUE(actual->GetAsBoolean(&boolean)); 212 EXPECT_TRUE(actual->GetAsBoolean(&boolean));
213 EXPECT_FALSE(boolean); 213 EXPECT_FALSE(boolean);
214 214
215 EXPECT_TRUE(pref_store->GetValue(kMaxTabs, &actual)); 215 EXPECT_TRUE(pref_store->GetValue(kMaxTabs, &actual));
216 int integer = 0; 216 int integer;
217 EXPECT_TRUE(actual->GetAsInteger(&integer)); 217 EXPECT_TRUE(actual->GetAsInteger(&integer));
218 EXPECT_EQ(20, integer); 218 EXPECT_EQ(20, integer);
219 pref_store->SetValue(kMaxTabs, new FundamentalValue(10), 219 pref_store->SetValue(kMaxTabs, new FundamentalValue(10),
220 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS); 220 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
221 EXPECT_TRUE(pref_store->GetValue(kMaxTabs, &actual)); 221 EXPECT_TRUE(pref_store->GetValue(kMaxTabs, &actual));
222 EXPECT_TRUE(actual->GetAsInteger(&integer)); 222 EXPECT_TRUE(actual->GetAsInteger(&integer));
223 EXPECT_EQ(10, integer); 223 EXPECT_EQ(10, integer);
224 224
225 pref_store->SetValue(kLongIntPref, 225 pref_store->SetValue(kLongIntPref,
226 new StringValue(base::Int64ToString(214748364842LL)), 226 new StringValue(base::Int64ToString(214748364842LL)),
(...skipping 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 histogram.ReportOutstandingWrites(); 802 histogram.ReportOutstandingWrites();
803 scoped_ptr<HistogramSamples> samples = 803 scoped_ptr<HistogramSamples> samples =
804 histogram.GetHistogram()->SnapshotSamples(); 804 histogram.GetHistogram()->SnapshotSamples();
805 ASSERT_EQ(3, samples->GetCount(0)); 805 ASSERT_EQ(3, samples->GetCount(0));
806 ASSERT_EQ(1, samples->GetCount(1)); 806 ASSERT_EQ(1, samples->GetCount(1));
807 ASSERT_EQ(1, samples->GetCount(2)); 807 ASSERT_EQ(1, samples->GetCount(2));
808 ASSERT_EQ(1, samples->GetCount(3)); 808 ASSERT_EQ(1, samples->GetCount(3));
809 ASSERT_EQ(6, samples->TotalCount()); 809 ASSERT_EQ(6, samples->TotalCount());
810 } 810 }
811 811
812 class TestImportantFileWriter : public ImportantFileWriter {
813 public:
814 TestImportantFileWriter() {}
815 ~TestImportantFileWriter() override {}
816
817 // ImportantFileWriter overrides.
818 bool HasPendingWrite() const override { return !!serializer_; }
819
820 void WriteNow(scoped_ptr<std::string> data) override { NOTREACHED(); }
821
822 void ScheduleWrite(DataSerializer* serializer) override {
823 serializer_ = serializer;
824 }
825
826 void DoScheduledWrite() override {
827 CHECK(serializer_ && !has_last_write_);
828 if (!serializer_->SerializeData(&last_write_))
829 NOTREACHED();
830 serializer_ = nullptr;
831 has_last_write_ = true;
832 }
833
834 void RegisterOnNextSuccessfulWriteCallback(
835 const base::Closure& on_next_successful_write) override {
836 NOTREACHED();
837 }
838
839 TimeDelta CommitInterval() const override {
840 return TimeDelta::FromSeconds(5);
841 }
842
843 std::string GetAndClearLastWrite() {
844 std::string result = last_write_;
845 last_write_ = std::string();
846 has_last_write_ = false;
847 return result;
848 }
849
850 private:
851 DataSerializer* serializer_ = nullptr;
852 std::string last_write_;
853 bool has_last_write_ = false;
854 };
855
856 // This test subclass just contains some helper functions.
857 class JsonPrefStoreLossyWriteTest : public JsonPrefStoreTest {
858 protected:
859 // A struct used for conveniently setting values in the PrefStore
860 struct PrefDetails {
Mattias Nissler (ping if slow) 2015/05/07 07:59:53 This is actually not providing any benefit that I
861 std::string key;
862 scoped_ptr<base::Value> value;
863 uint32 flags;
864 };
865
866 static PrefDetails GetNormalPrefDetails() {
867 return {"normal",
868 scoped_ptr<base::Value>(new base::StringValue("normal")),
869 WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS};
870 }
871
872 static PrefDetails GetLossyPrefDetails() {
873 return {"lossy",
874 scoped_ptr<base::Value>(new base::StringValue("lossy")),
875 WriteablePrefStore::LOSSY_PREF_WRITE_FLAG};
876 }
877
878 // Creates a JsonPrefStore with the given |file_writer|.
879 scoped_refptr<JsonPrefStore> CreatePrefStore(
880 TestImportantFileWriter* file_writer) {
881 base::FilePath file(FILE_PATH_LITERAL("abc.txt"));
882 return new JsonPrefStore(file, file, message_loop_.task_runner(),
883 scoped_ptr<base::ImportantFileWriter>(file_writer),
884 scoped_ptr<PrefFilter>());
885 }
886 };
887
888 TEST_F(JsonPrefStoreLossyWriteTest, LossyWriteBasic) {
889 TestImportantFileWriter* file_writer = new TestImportantFileWriter;
890 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore(file_writer);
891 PrefDetails normal = GetNormalPrefDetails();
892 PrefDetails lossy = GetLossyPrefDetails();
893
894 // Set a normal pref and check that it gets scheduled to be written.
895 ASSERT_FALSE(file_writer->HasPendingWrite());
896 pref_store->SetValue(normal.key, normal.value->DeepCopy(), normal.flags);
897 ASSERT_TRUE(file_writer->HasPendingWrite());
898 file_writer->DoScheduledWrite();
899 ASSERT_EQ("{\"normal\":\"normal\"}", file_writer->GetAndClearLastWrite());
900 ASSERT_FALSE(file_writer->HasPendingWrite());
Mattias Nissler (ping if slow) 2015/05/07 07:59:53 Instead of mocking the file writer, you could just
901
902 // Set a lossy pref and check that it is not scheduled to be written.
903 // SetValue/RemoveValue
904 pref_store->SetValue(lossy.key, lossy.value->DeepCopy(), lossy.flags);
905 ASSERT_FALSE(file_writer->HasPendingWrite());
906 pref_store->RemoveValue(lossy.key, lossy.flags);
907 ASSERT_FALSE(file_writer->HasPendingWrite());
Mattias Nissler (ping if slow) 2015/05/07 07:59:53 Same here, could just spin the loop and check the
908
909 // SetValueSilently/RemoveValueSilently.
910 pref_store->SetValueSilently(lossy.key, lossy.value->DeepCopy(), lossy.flags);
911 ASSERT_FALSE(file_writer->HasPendingWrite());
912 pref_store->RemoveValueSilently(lossy.key, lossy.flags);
913 ASSERT_FALSE(file_writer->HasPendingWrite());
914
915 // ReportValueChanged.
916 pref_store->SetValue(lossy.key, lossy.value->DeepCopy(), lossy.flags);
917 ASSERT_FALSE(file_writer->HasPendingWrite());
918 pref_store->ReportValueChanged(lossy.key, lossy.flags);
919 ASSERT_FALSE(file_writer->HasPendingWrite());
920
921 // Call CommitPendingWrite and check that the lossy pref and the normal pref
922 // are there with the last values set above.
923 pref_store->CommitPendingWrite();
924 ASSERT_FALSE(file_writer->HasPendingWrite());
925 ASSERT_EQ("{\"lossy\":\"lossy\",\"normal\":\"normal\"}",
926 file_writer->GetAndClearLastWrite());
927 }
928
929 TEST_F(JsonPrefStoreLossyWriteTest, LossyWriteMixed) {
930 TestImportantFileWriter* file_writer = new TestImportantFileWriter;
931 scoped_refptr<JsonPrefStore> pref_store = CreatePrefStore(file_writer);
932 PrefDetails normal = GetNormalPrefDetails();
933 PrefDetails lossy = GetLossyPrefDetails();
934
935 // Set a normal pref and check that it is scheduled to be written.
936 ASSERT_FALSE(file_writer->HasPendingWrite());
937 pref_store->SetValue(normal.key, normal.value->DeepCopy(), normal.flags);
938 ASSERT_TRUE(file_writer->HasPendingWrite());
939 // Set a lossy pref and check that the write is still scheduled.
940 pref_store->SetValue(lossy.key, lossy.value->DeepCopy(), lossy.flags);
941 ASSERT_TRUE(file_writer->HasPendingWrite());
942 // Call DoScheduledWrite and check both prefs get written.
943 file_writer->DoScheduledWrite();
944 ASSERT_EQ("{\"lossy\":\"lossy\",\"normal\":\"normal\"}",
945 file_writer->GetAndClearLastWrite());
946 ASSERT_FALSE(file_writer->HasPendingWrite());
947
948 // Cleanup.
949 pref_store->RemoveValue(normal.key, normal.flags);
950 pref_store->RemoveValue(lossy.key, lossy.flags);
951 pref_store->CommitPendingWrite();
952 file_writer->GetAndClearLastWrite();
953 ASSERT_FALSE(file_writer->HasPendingWrite());
954
955 // Set a lossy pref and check that it is not scheduled to be written.
956 pref_store->SetValue(lossy.key, lossy.value->DeepCopy(), lossy.flags);
957 ASSERT_FALSE(file_writer->HasPendingWrite());
958 // Set a normal pref and check that it is scheduled to be written.
959 pref_store->SetValue(normal.key, normal.value->DeepCopy(), normal.flags);
960 ASSERT_TRUE(file_writer->HasPendingWrite());
961 // Call DoScheduledWrite and check both prefs get written.
962 file_writer->DoScheduledWrite();
963 ASSERT_EQ("{\"lossy\":\"lossy\",\"normal\":\"normal\"}",
964 file_writer->GetAndClearLastWrite());
965 ASSERT_FALSE(file_writer->HasPendingWrite());
966 }
967
812 } // namespace base 968 } // namespace base
OLDNEW
« no previous file with comments | « base/prefs/json_pref_store.cc ('k') | chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698