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