15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/cloud_print/connector_settings.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
12b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/service/service_process_prefs.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cloud_print {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kServiceStateContent[] =
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "{"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "   'cloud_print': {"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'auth_token': 'token',"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'email': 'user@gmail.com',"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'enabled': true,"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'proxy_id': 'PROXY',"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'robot_email': '123@cloudprint.googleusercontent.com',"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'robot_refresh_token': '123',"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'xmpp_auth_token': 'xmp token',"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'xmpp_ping_enabled': true,"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'xmpp_ping_timeout_sec': 256,"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "      'user_settings': {"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "        'printers': ["
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "          { 'name': 'prn1', 'connect': false },"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "          { 'name': 'prn2', 'connect': false },"
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "          { 'name': 'prn3', 'connect': true }"
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "        ],"
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "        'connectNewPrinters': false"
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "      },"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      'print_system_settings': {"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "         'delete_on_enum_fail' : true"
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "      }"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "   }"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConnectorSettingsTest : public testing::Test {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_loop_proxy_ = base::MessageLoopProxy::current();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ServiceProcessPrefs* CreateTestFile(const char* json) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_name = temp_dir_.path().AppendASCII("file.txt");
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::DeleteFile(file_name, false);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (json) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string content = json;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::replace(content.begin(), content.end(), '\'', '"');
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WriteFile(file_name, content.c_str(), content.size());
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ServiceProcessPrefs* prefs =
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        new ServiceProcessPrefs(file_name, message_loop_proxy_.get());
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs->ReadPrefs();
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return prefs;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  base::MessageLoop message_loop_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ConnectorSettingsTest, InitFromEmpty) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* const kEmptyJSons[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "{}",
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "{'foo': []}",
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "{'foo',,}",
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kEmptyJSons); ++i) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kEmptyJSons[i]));
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConnectorSettings settings;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    settings.InitFrom(prefs.get());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("https://www.google.com/cloudprint",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              settings.server_url().spec());
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(settings.proxy_id().empty());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(settings.delete_on_enum_fail());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(NULL, settings.print_system_settings());
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(settings.ShouldConnect("prn1"));
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(settings.xmpp_ping_enabled());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ConnectorSettingsTest, InitFromFile) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kServiceStateContent));
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConnectorSettings settings;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.InitFrom(prefs.get());
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ("https://www.google.com/cloudprint", settings.server_url().spec());
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("PROXY", settings.proxy_id());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(settings.proxy_id().empty());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(settings.delete_on_enum_fail());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(settings.print_system_settings());
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(settings.xmpp_ping_enabled());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings.xmpp_ping_timeout_sec(), 256);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(settings.ShouldConnect("prn0"));
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(settings.ShouldConnect("prn1"));
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(settings.ShouldConnect("prn3"));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ConnectorSettingsTest, CopyFrom) {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile(kServiceStateContent));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConnectorSettings settings1;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings1.InitFrom(prefs.get());
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConnectorSettings settings2;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings2.CopyFrom(settings1);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.server_url(), settings2.server_url());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.proxy_id(), settings2.proxy_id());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.delete_on_enum_fail(), settings2.delete_on_enum_fail());
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.print_system_settings()->size(),
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            settings2.print_system_settings()->size());
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.xmpp_ping_enabled(), settings2.xmpp_ping_enabled());
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings1.xmpp_ping_timeout_sec(),
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            settings2.xmpp_ping_timeout_sec());
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(settings2.ShouldConnect("prn0"));
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(settings2.ShouldConnect("prn1"));
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(settings2.ShouldConnect("prn3"));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ConnectorSettingsTest, SettersTest) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ServiceProcessPrefs> prefs(CreateTestFile("{}"));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ConnectorSettings settings;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.InitFrom(prefs.get());
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(settings.xmpp_ping_enabled());
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set and check valid settings.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.set_xmpp_ping_enabled(true);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.SetXmppPingTimeoutSec(256);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(settings.xmpp_ping_enabled());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(settings.xmpp_ping_timeout_sec(), 256);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set invalid settings, and check correct defaults.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  settings.SetXmppPingTimeoutSec(1);
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(settings.xmpp_ping_timeout_sec(), kMinXmppPingTimeoutSecs);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cloud_print
152