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 "chrome/service/cloud_print/connector_settings.h" 6 7 #include <string> 8 9 #include "base/file_util.h" 10 #include "base/files/scoped_temp_dir.h" 11 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop_proxy.h" 13 #include "base/values.h" 14 #include "chrome/common/cloud_print/cloud_print_constants.h" 15 #include "chrome/service/service_process_prefs.h" 16 17 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gtest/include/gtest/gtest.h" 19 20 namespace cloud_print { 21 22 const char kServiceStateContent[] = 23 "{" 24 " 'cloud_print': {" 25 " 'auth_token': 'token'," 26 " 'email': 'user (at) gmail.com'," 27 " 'enabled': true," 28 " 'proxy_id': 'PROXY'," 29 " 'robot_email': '123 (at) cloudprint.googleusercontent.com'," 30 " 'robot_refresh_token': '123'," 31 " 'xmpp_auth_token': 'xmp token'," 32 " 'xmpp_ping_enabled': true," 33 " 'xmpp_ping_timeout_sec': 256," 34 " 'user_settings': {" 35 " 'printers': [" 36 " { 'name': 'prn1', 'connect': false }," 37 " { 'name': 'prn2', 'connect': false }," 38 " { 'name': 'prn3', 'connect': true }" 39 " ]," 40 " 'connectNewPrinters': false" 41 " }," 42 " 'print_system_settings': {" 43 " 'delete_on_enum_fail' : true" 44 " }" 45 " }" 46 "}"; 47 48 49 class ConnectorSettingsTest : public testing::Test { 50 protected: 51 virtual void SetUp() OVERRIDE { 52 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 53 message_loop_proxy_ = base::MessageLoopProxy::current(); 54 } 55 56 ServiceProcessPrefs* CreateTestFile(const char* json) { 57 base::FilePath file_name = temp_dir_.path().AppendASCII("file.txt"); 58 base::DeleteFile(file_name, false); 59 if (json) { 60 std::string content = json; 61 std::replace(content.begin(), content.end(), '\'', '"'); 62 base::WriteFile(file_name, content.c_str(), content.size()); 63 } 64 ServiceProcessPrefs* prefs = 65 new ServiceProcessPrefs(file_name, message_loop_proxy_.get()); 66 prefs->ReadPrefs(); 67 return prefs; 68 } 69 70 base::ScopedTempDir temp_dir_; 71 base::MessageLoop message_loop_; 72 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 73 }; 74 75 TEST_F(ConnectorSettingsTest, InitFromEmpty) { 76 const char* const kEmptyJSons[] = { 77 NULL, 78 "{}", 79 "{'foo': []}", 80 "{'foo',,}", 81 }; 82 for (size_t i = 0; i < arraysize(kEmptyJSons); ++i) { 83 scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kEmptyJSons[i])); 84 ConnectorSettings settings; 85 settings.InitFrom(prefs.get()); 86 87 EXPECT_EQ("https://www.google.com/cloudprint", 88 settings.server_url().spec()); 89 EXPECT_FALSE(settings.proxy_id().empty()); 90 EXPECT_FALSE(settings.delete_on_enum_fail()); 91 EXPECT_EQ(NULL, settings.print_system_settings()); 92 EXPECT_TRUE(settings.ShouldConnect("prn1")); 93 EXPECT_FALSE(settings.xmpp_ping_enabled()); 94 } 95 } 96 97 TEST_F(ConnectorSettingsTest, InitFromFile) { 98 scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kServiceStateContent)); 99 ConnectorSettings settings; 100 settings.InitFrom(prefs.get()); 101 EXPECT_EQ("https://www.google.com/cloudprint", settings.server_url().spec()); 102 EXPECT_EQ("PROXY", settings.proxy_id()); 103 EXPECT_FALSE(settings.proxy_id().empty()); 104 EXPECT_TRUE(settings.delete_on_enum_fail()); 105 EXPECT_TRUE(settings.print_system_settings()); 106 EXPECT_TRUE(settings.xmpp_ping_enabled()); 107 EXPECT_EQ(settings.xmpp_ping_timeout_sec(), 256); 108 EXPECT_FALSE(settings.ShouldConnect("prn0")); 109 EXPECT_FALSE(settings.ShouldConnect("prn1")); 110 EXPECT_TRUE(settings.ShouldConnect("prn3")); 111 } 112 113 TEST_F(ConnectorSettingsTest, CopyFrom) { 114 scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kServiceStateContent)); 115 ConnectorSettings settings1; 116 settings1.InitFrom(prefs.get()); 117 118 ConnectorSettings settings2; 119 settings2.CopyFrom(settings1); 120 121 EXPECT_EQ(settings1.server_url(), settings2.server_url()); 122 EXPECT_EQ(settings1.proxy_id(), settings2.proxy_id()); 123 EXPECT_EQ(settings1.delete_on_enum_fail(), settings2.delete_on_enum_fail()); 124 EXPECT_EQ(settings1.print_system_settings()->size(), 125 settings2.print_system_settings()->size()); 126 EXPECT_EQ(settings1.xmpp_ping_enabled(), settings2.xmpp_ping_enabled()); 127 EXPECT_EQ(settings1.xmpp_ping_timeout_sec(), 128 settings2.xmpp_ping_timeout_sec()); 129 EXPECT_FALSE(settings2.ShouldConnect("prn0")); 130 EXPECT_FALSE(settings2.ShouldConnect("prn1")); 131 EXPECT_TRUE(settings2.ShouldConnect("prn3")); 132 } 133 134 TEST_F(ConnectorSettingsTest, SettersTest) { 135 scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile("{}")); 136 ConnectorSettings settings; 137 settings.InitFrom(prefs.get()); 138 EXPECT_FALSE(settings.xmpp_ping_enabled()); 139 140 // Set and check valid settings. 141 settings.set_xmpp_ping_enabled(true); 142 settings.SetXmppPingTimeoutSec(256); 143 EXPECT_TRUE(settings.xmpp_ping_enabled()); 144 EXPECT_EQ(settings.xmpp_ping_timeout_sec(), 256); 145 146 // Set invalid settings, and check correct defaults. 147 settings.SetXmppPingTimeoutSec(1); 148 EXPECT_EQ(settings.xmpp_ping_timeout_sec(), kMinXmppPingTimeoutSecs); 149 } 150 151 } // namespace cloud_print 152