OLD | NEW |
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 "chrome/browser/extensions/extension_sync_data.h" | 5 #include "chrome/browser/extensions/extension_sync_data.h" |
6 | 6 |
7 #include "base/files/file_path.h" | 7 #include "base/files/file_path.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/version.h" | 9 #include "base/version.h" |
10 #include "sync/protocol/extension_specifics.pb.h" | 10 #include "sync/protocol/extension_specifics.pb.h" |
11 #include "sync/protocol/sync.pb.h" | 11 #include "sync/protocol/sync.pb.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 12 #include "testing/gtest/include/gtest/gtest.h" |
13 #include "url/gurl.h" | 13 #include "url/gurl.h" |
14 | 14 |
| 15 namespace extensions { |
| 16 |
15 namespace { | 17 namespace { |
16 | 18 |
17 const char kValidId[] = "abcdefghijklmnopabcdefghijklmnop"; | 19 const char kValidId[] = "abcdefghijklmnopabcdefghijklmnop"; |
18 const char kVersion[] = "1.0.0.1"; | 20 const char kVersion[] = "1.0.0.1"; |
19 const char kValidUpdateUrl[] = | 21 const char kValidUpdateUrl[] = |
20 "https://clients2.google.com/service/update2/crx"; | 22 "https://clients2.google.com/service/update2/crx"; |
21 const char kName[] = "MyExtension"; | 23 const char kName[] = "MyExtension"; |
22 | 24 |
| 25 // Serializes a protobuf structure (entity specifics) into an ExtensionSyncData |
| 26 // and back again, and confirms that the input is the same as the output. |
| 27 void ProtobufToSyncDataEqual(const sync_pb::EntitySpecifics& entity) { |
| 28 syncer::SyncData sync_data = |
| 29 syncer::SyncData::CreateLocalData("sync_tag", "non_unique_title", entity); |
| 30 ExtensionSyncData extension_sync_data(sync_data); |
| 31 syncer::SyncData output_sync_data = extension_sync_data.GetSyncData(); |
| 32 const sync_pb::ExtensionSpecifics& output = |
| 33 output_sync_data.GetSpecifics().extension(); |
| 34 const sync_pb::ExtensionSpecifics& input = entity.extension(); |
| 35 |
| 36 // Check for field-by-field quality. It'd be nice if we could use |
| 37 // AssertionResults here (instead of EXPECT_EQ) so that we could get valid |
| 38 // line numbers, but it's not worth the ugliness of the verbose comparison. |
| 39 EXPECT_EQ(input.id(), output.id()); |
| 40 EXPECT_EQ(input.name(), output.name()); |
| 41 EXPECT_EQ(input.version(), output.version()); |
| 42 EXPECT_EQ(input.update_url(), output.update_url()); |
| 43 EXPECT_EQ(input.enabled(), output.enabled()); |
| 44 EXPECT_EQ(input.incognito_enabled(), output.incognito_enabled()); |
| 45 EXPECT_EQ(input.remote_install(), output.remote_install()); |
| 46 EXPECT_EQ(input.installed_by_custodian(), output.installed_by_custodian()); |
| 47 EXPECT_EQ(input.has_all_urls_enabled(), output.has_all_urls_enabled()); |
| 48 if (input.has_all_urls_enabled()) |
| 49 EXPECT_EQ(input.all_urls_enabled(), output.all_urls_enabled()); |
| 50 } |
| 51 |
| 52 // Serializes an ExtensionSyncData into a protobuf structure and back again, and |
| 53 // confirms that the input is the same as the output. |
| 54 void SyncDataToProtobufEqual(const ExtensionSyncData& input) { |
| 55 syncer::SyncData sync_data = input.GetSyncData(); |
| 56 ExtensionSyncData output(sync_data); |
| 57 |
| 58 EXPECT_EQ(input.id(), output.id()); |
| 59 EXPECT_EQ(input.uninstalled(), output.uninstalled()); |
| 60 EXPECT_EQ(input.enabled(), output.enabled()); |
| 61 EXPECT_EQ(input.incognito_enabled(), output.incognito_enabled()); |
| 62 EXPECT_EQ(input.remote_install(), output.remote_install()); |
| 63 EXPECT_EQ(input.installed_by_custodian(), output.installed_by_custodian()); |
| 64 EXPECT_EQ(input.all_urls_enabled(), output.all_urls_enabled()); |
| 65 EXPECT_TRUE(input.version().Equals(output.version())); |
| 66 EXPECT_EQ(input.update_url(), output.update_url()); |
| 67 EXPECT_EQ(input.name(), output.name()); |
| 68 } |
| 69 |
| 70 } // namespace |
| 71 |
23 class ExtensionSyncDataTest : public testing::Test { | 72 class ExtensionSyncDataTest : public testing::Test { |
24 }; | 73 }; |
25 | 74 |
26 TEST_F(ExtensionSyncDataTest, SyncDataToExtensionSyncDataForExtension) { | 75 // Tests the conversion process from a protobuf to an ExtensionSyncData and vice |
| 76 // versa. |
| 77 TEST_F(ExtensionSyncDataTest, ExtensionSyncDataForExtension) { |
27 sync_pb::EntitySpecifics entity; | 78 sync_pb::EntitySpecifics entity; |
28 sync_pb::ExtensionSpecifics* extension_specifics = entity.mutable_extension(); | 79 sync_pb::ExtensionSpecifics* extension_specifics = entity.mutable_extension(); |
29 extension_specifics->set_id(kValidId); | 80 extension_specifics->set_id(kValidId); |
30 extension_specifics->set_update_url(kValidUpdateUrl); | 81 extension_specifics->set_update_url(kValidUpdateUrl); |
31 extension_specifics->set_enabled(false); | 82 extension_specifics->set_enabled(false); |
32 extension_specifics->set_incognito_enabled(true); | 83 extension_specifics->set_incognito_enabled(true); |
| 84 extension_specifics->set_remote_install(false); |
| 85 extension_specifics->set_installed_by_custodian(false); |
| 86 extension_specifics->set_all_urls_enabled(true); |
33 extension_specifics->set_version(kVersion); | 87 extension_specifics->set_version(kVersion); |
34 extension_specifics->set_name(kName); | 88 extension_specifics->set_name(kName); |
35 syncer::SyncData sync_data = | |
36 syncer::SyncData::CreateLocalData("sync_tag", "non_unique_title", entity); | |
37 | 89 |
38 extensions::ExtensionSyncData extension_sync_data(sync_data); | 90 // Check the serialize-deserialize process for proto to ExtensionSyncData. |
39 EXPECT_EQ(extension_specifics->id(), extension_sync_data.id()); | 91 ProtobufToSyncDataEqual(entity); |
40 EXPECT_EQ(extension_specifics->version(), | 92 |
41 extension_sync_data.version().GetString()); | 93 // Explicitly test that conversion to an ExtensionSyncData gets the correct |
42 EXPECT_EQ(extension_specifics->update_url(), | 94 // result (otherwise we just know that conversion to/from a proto gives us |
43 extension_sync_data.update_url().spec()); | 95 // the same result, but don't know that it's right). |
44 EXPECT_EQ(extension_specifics->enabled(), extension_sync_data.enabled()); | 96 ExtensionSyncData extension_sync_data; |
45 EXPECT_EQ(extension_specifics->incognito_enabled(), | 97 extension_sync_data.PopulateFromExtensionSpecifics(*extension_specifics); |
46 extension_sync_data.incognito_enabled()); | 98 EXPECT_EQ(kValidId, extension_sync_data.id()); |
47 EXPECT_EQ(extension_specifics->name(), extension_sync_data.name()); | 99 EXPECT_EQ(GURL(kValidUpdateUrl), extension_sync_data.update_url()); |
48 EXPECT_FALSE(extension_sync_data.uninstalled()); | 100 EXPECT_EQ(false, extension_sync_data.enabled()); |
| 101 EXPECT_EQ(true, extension_sync_data.incognito_enabled()); |
| 102 EXPECT_EQ(false, extension_sync_data.remote_install()); |
| 103 EXPECT_EQ(ExtensionSyncData::BOOLEAN_TRUE, |
| 104 extension_sync_data.all_urls_enabled()); |
| 105 EXPECT_TRUE(Version(kVersion).Equals(extension_sync_data.version())); |
| 106 EXPECT_EQ(std::string(kName), extension_sync_data.name()); |
| 107 |
| 108 // Check the serialize-deserialize process for ExtensionSyncData to proto. |
| 109 SyncDataToProtobufEqual(extension_sync_data); |
| 110 |
| 111 // The most important thing to test is the "all urls" bit, since it is a |
| 112 // tri-state boolean (and thus has more logic). Also flip another bit for a |
| 113 // sanity check. |
| 114 extension_specifics->set_all_urls_enabled(false); |
| 115 extension_specifics->set_incognito_enabled(false); |
| 116 ProtobufToSyncDataEqual(entity); |
| 117 |
| 118 extension_sync_data.PopulateFromExtensionSpecifics(*extension_specifics); |
| 119 EXPECT_EQ(ExtensionSyncData::BOOLEAN_FALSE, |
| 120 extension_sync_data.all_urls_enabled()); |
| 121 EXPECT_EQ(false, extension_sync_data.incognito_enabled()); |
| 122 |
| 123 SyncDataToProtobufEqual(extension_sync_data); |
| 124 |
| 125 extension_specifics->clear_all_urls_enabled(); |
| 126 ProtobufToSyncDataEqual(entity); |
| 127 |
| 128 extension_sync_data.PopulateFromExtensionSpecifics(*extension_specifics); |
| 129 EXPECT_FALSE(extension_specifics->has_all_urls_enabled()); |
| 130 EXPECT_EQ(ExtensionSyncData::BOOLEAN_UNSET, |
| 131 extension_sync_data.all_urls_enabled()); |
| 132 |
| 133 SyncDataToProtobufEqual(extension_sync_data); |
49 } | 134 } |
50 | 135 |
51 TEST_F(ExtensionSyncDataTest, ExtensionSyncDataToSyncDataForExtension) { | 136 } // namespace extensions |
52 sync_pb::EntitySpecifics entity; | |
53 sync_pb::ExtensionSpecifics* input_extension = entity.mutable_extension(); | |
54 input_extension->set_id(kValidId); | |
55 input_extension->set_update_url(kValidUpdateUrl); | |
56 input_extension->set_enabled(true); | |
57 input_extension->set_incognito_enabled(false); | |
58 input_extension->set_version(kVersion); | |
59 input_extension->set_name(kName); | |
60 syncer::SyncData sync_data = | |
61 syncer::SyncData::CreateLocalData("sync_tag", "non_unique_title", entity); | |
62 extensions::ExtensionSyncData extension_sync_data(sync_data); | |
63 | |
64 syncer::SyncData output_sync_data = extension_sync_data.GetSyncData(); | |
65 const sync_pb::ExtensionSpecifics& output_specifics = | |
66 output_sync_data.GetSpecifics().extension(); | |
67 EXPECT_EQ(extension_sync_data.id(), output_specifics.id()); | |
68 EXPECT_EQ(extension_sync_data.update_url().spec(), | |
69 output_specifics.update_url()); | |
70 EXPECT_EQ(extension_sync_data.enabled(), output_specifics.enabled()); | |
71 EXPECT_EQ(extension_sync_data.incognito_enabled(), | |
72 output_specifics.incognito_enabled()); | |
73 EXPECT_EQ(extension_sync_data.version().GetString(), | |
74 output_specifics.version()); | |
75 EXPECT_EQ(extension_sync_data.name(), output_specifics.name()); | |
76 } | |
77 | |
78 } // namespace | |
OLD | NEW |