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