| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include <memory> | |
| 6 #include <string> | |
| 7 | |
| 8 #include "base/strings/string_util.h" | |
| 9 #include "base/test/values_test_util.h" | |
| 10 #include "base/values.h" | |
| 11 #include "sync/internal_api/public/base/model_type.h" | |
| 12 #include "sync/protocol/sync.pb.h" | |
| 13 #include "testing/gtest/include/gtest/gtest.h" | |
| 14 | |
| 15 namespace syncer { | |
| 16 namespace { | |
| 17 | |
| 18 class ModelTypeTest : public testing::Test {}; | |
| 19 | |
| 20 TEST_F(ModelTypeTest, ModelTypeToValue) { | |
| 21 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { | |
| 22 ModelType model_type = ModelTypeFromInt(i); | |
| 23 base::ExpectStringValue(ModelTypeToString(model_type), | |
| 24 ModelTypeToValue(model_type)); | |
| 25 } | |
| 26 base::ExpectStringValue("Top-level folder", | |
| 27 ModelTypeToValue(TOP_LEVEL_FOLDER)); | |
| 28 base::ExpectStringValue("Unspecified", | |
| 29 ModelTypeToValue(UNSPECIFIED)); | |
| 30 } | |
| 31 | |
| 32 TEST_F(ModelTypeTest, ModelTypeFromValue) { | |
| 33 for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) { | |
| 34 ModelType model_type = ModelTypeFromInt(i); | |
| 35 std::unique_ptr<base::StringValue> value(ModelTypeToValue(model_type)); | |
| 36 EXPECT_EQ(model_type, ModelTypeFromValue(*value)); | |
| 37 } | |
| 38 } | |
| 39 | |
| 40 TEST_F(ModelTypeTest, ModelTypeSetToValue) { | |
| 41 const ModelTypeSet model_types(BOOKMARKS, APPS); | |
| 42 | |
| 43 std::unique_ptr<base::ListValue> value(ModelTypeSetToValue(model_types)); | |
| 44 EXPECT_EQ(2u, value->GetSize()); | |
| 45 std::string types[2]; | |
| 46 EXPECT_TRUE(value->GetString(0, &types[0])); | |
| 47 EXPECT_TRUE(value->GetString(1, &types[1])); | |
| 48 EXPECT_EQ("Bookmarks", types[0]); | |
| 49 EXPECT_EQ("Apps", types[1]); | |
| 50 } | |
| 51 | |
| 52 TEST_F(ModelTypeTest, ModelTypeSetFromValue) { | |
| 53 // Try empty set first. | |
| 54 ModelTypeSet model_types; | |
| 55 std::unique_ptr<base::ListValue> value(ModelTypeSetToValue(model_types)); | |
| 56 EXPECT_EQ(model_types, ModelTypeSetFromValue(*value)); | |
| 57 | |
| 58 // Now try with a few random types. | |
| 59 model_types.Put(BOOKMARKS); | |
| 60 model_types.Put(APPS); | |
| 61 value = ModelTypeSetToValue(model_types); | |
| 62 EXPECT_EQ(model_types, ModelTypeSetFromValue(*value)); | |
| 63 } | |
| 64 | |
| 65 TEST_F(ModelTypeTest, IsRealDataType) { | |
| 66 EXPECT_FALSE(IsRealDataType(UNSPECIFIED)); | |
| 67 EXPECT_FALSE(IsRealDataType(MODEL_TYPE_COUNT)); | |
| 68 EXPECT_FALSE(IsRealDataType(TOP_LEVEL_FOLDER)); | |
| 69 EXPECT_TRUE(IsRealDataType(FIRST_REAL_MODEL_TYPE)); | |
| 70 EXPECT_TRUE(IsRealDataType(BOOKMARKS)); | |
| 71 EXPECT_TRUE(IsRealDataType(APPS)); | |
| 72 EXPECT_TRUE(IsRealDataType(ARC_PACKAGE)); | |
| 73 } | |
| 74 | |
| 75 TEST_F(ModelTypeTest, IsProxyType) { | |
| 76 EXPECT_FALSE(IsProxyType(BOOKMARKS)); | |
| 77 EXPECT_FALSE(IsProxyType(MODEL_TYPE_COUNT)); | |
| 78 EXPECT_TRUE(IsProxyType(PROXY_TABS)); | |
| 79 } | |
| 80 | |
| 81 // Make sure we can convert ModelTypes to and from specifics field | |
| 82 // numbers. | |
| 83 TEST_F(ModelTypeTest, ModelTypeToFromSpecificsFieldNumber) { | |
| 84 ModelTypeSet protocol_types = ProtocolTypes(); | |
| 85 for (ModelTypeSet::Iterator iter = protocol_types.First(); iter.Good(); | |
| 86 iter.Inc()) { | |
| 87 int field_number = GetSpecificsFieldNumberFromModelType(iter.Get()); | |
| 88 EXPECT_EQ(iter.Get(), | |
| 89 GetModelTypeFromSpecificsFieldNumber(field_number)); | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 TEST_F(ModelTypeTest, ModelTypeOfInvalidSpecificsFieldNumber) { | |
| 94 EXPECT_EQ(UNSPECIFIED, GetModelTypeFromSpecificsFieldNumber(0)); | |
| 95 } | |
| 96 | |
| 97 TEST_F(ModelTypeTest, ModelTypeHistogramMapping) { | |
| 98 std::set<int> histogram_values; | |
| 99 ModelTypeSet all_types = ModelTypeSet::All(); | |
| 100 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { | |
| 101 SCOPED_TRACE(ModelTypeToString(it.Get())); | |
| 102 int histogram_value = ModelTypeToHistogramInt(it.Get()); | |
| 103 | |
| 104 EXPECT_TRUE(histogram_values.insert(histogram_value).second) | |
| 105 << "Expected histogram values to be unique"; | |
| 106 | |
| 107 // This is not necessary for the mapping to be valid, but most instances of | |
| 108 // UMA_HISTOGRAM that use this mapping specify MODEL_TYPE_COUNT as the | |
| 109 // maximum possible value. If you break this assumption, you should update | |
| 110 // those histograms. | |
| 111 EXPECT_LT(histogram_value, MODEL_TYPE_COUNT); | |
| 112 } | |
| 113 } | |
| 114 | |
| 115 TEST_F(ModelTypeTest, ModelTypeSetFromString) { | |
| 116 syncer::ModelTypeSet empty; | |
| 117 syncer::ModelTypeSet one(BOOKMARKS); | |
| 118 syncer::ModelTypeSet two(BOOKMARKS, TYPED_URLS); | |
| 119 | |
| 120 EXPECT_EQ(empty, ModelTypeSetFromString(ModelTypeSetToString(empty))); | |
| 121 EXPECT_EQ(one, ModelTypeSetFromString(ModelTypeSetToString(one))); | |
| 122 EXPECT_EQ(two, ModelTypeSetFromString(ModelTypeSetToString(two))); | |
| 123 } | |
| 124 | |
| 125 TEST_F(ModelTypeTest, DefaultFieldValues) { | |
| 126 syncer::ModelTypeSet types = syncer::ProtocolTypes(); | |
| 127 for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) { | |
| 128 SCOPED_TRACE(ModelTypeToString(it.Get())); | |
| 129 | |
| 130 sync_pb::EntitySpecifics specifics; | |
| 131 syncer::AddDefaultFieldValue(it.Get(), &specifics); | |
| 132 EXPECT_TRUE(specifics.IsInitialized()); | |
| 133 | |
| 134 std::string tmp; | |
| 135 EXPECT_TRUE(specifics.SerializeToString(&tmp)); | |
| 136 | |
| 137 sync_pb::EntitySpecifics from_string; | |
| 138 EXPECT_TRUE(from_string.ParseFromString(tmp)); | |
| 139 EXPECT_TRUE(from_string.IsInitialized()); | |
| 140 | |
| 141 EXPECT_EQ(it.Get(), syncer::GetModelTypeFromSpecifics(from_string)); | |
| 142 } | |
| 143 } | |
| 144 | |
| 145 TEST_F(ModelTypeTest, ModelTypeToRootTagValues) { | |
| 146 ModelTypeSet all_types = ModelTypeSet::All(); | |
| 147 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { | |
| 148 ModelType model_type = it.Get(); | |
| 149 std::string root_tag = ModelTypeToRootTag(model_type); | |
| 150 if (IsProxyType(model_type)) { | |
| 151 EXPECT_EQ(root_tag, std::string()); | |
| 152 } else if (IsRealDataType(model_type)) { | |
| 153 EXPECT_TRUE(base::StartsWith(root_tag, "google_chrome_", | |
| 154 base::CompareCase::INSENSITIVE_ASCII)); | |
| 155 } else { | |
| 156 EXPECT_EQ(root_tag, "INVALID"); | |
| 157 } | |
| 158 } | |
| 159 } | |
| 160 | |
| 161 TEST_F(ModelTypeTest, ModelTypeStringMapping) { | |
| 162 ModelTypeSet all_types = ModelTypeSet::All(); | |
| 163 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { | |
| 164 ModelType model_type = it.Get(); | |
| 165 const char* model_type_string = ModelTypeToString(model_type); | |
| 166 ModelType converted_model_type = ModelTypeFromString(model_type_string); | |
| 167 if (IsRealDataType(model_type)) | |
| 168 EXPECT_EQ(converted_model_type, model_type); | |
| 169 else | |
| 170 EXPECT_EQ(converted_model_type, UNSPECIFIED); | |
| 171 } | |
| 172 } | |
| 173 | |
| 174 TEST_F(ModelTypeTest, ModelTypeNotificationTypeMapping) { | |
| 175 ModelTypeSet all_types = ModelTypeSet::All(); | |
| 176 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { | |
| 177 ModelType model_type = it.Get(); | |
| 178 std::string notification_type; | |
| 179 bool ret = RealModelTypeToNotificationType(model_type, ¬ification_type); | |
| 180 if (ret) { | |
| 181 ModelType notified_model_type; | |
| 182 EXPECT_TRUE(NotificationTypeToRealModelType(notification_type, | |
| 183 ¬ified_model_type)); | |
| 184 EXPECT_EQ(notified_model_type, model_type); | |
| 185 } else { | |
| 186 EXPECT_FALSE(ProtocolTypes().Has(model_type)); | |
| 187 EXPECT_TRUE(notification_type.empty()); | |
| 188 } | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 } // namespace | |
| 193 } // namespace syncer | |
| OLD | NEW |