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/files/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 20namespace cloud_print { 21 22const char kServiceStateContent[] = 23 "{" 24 " 'cloud_print': {" 25 " 'auth_token': 'token'," 26 " 'email': 'user@gmail.com'," 27 " 'enabled': true," 28 " 'proxy_id': 'PROXY'," 29 " 'robot_email': '123@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 49class 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 75TEST_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 97TEST_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 113TEST_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 134TEST_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