Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / extensions / echo_private_apitest.cc
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/browser/chromeos/extensions/echo_private_api.h"
6
7 #include "base/bind.h"
8 #include "base/command_line.h"
9 #include "base/message_loop/message_loop_proxy.h"
10 #include "chrome/browser/chromeos/settings/cros_settings.h"
11 #include "chrome/browser/chromeos/ui/echo_dialog_view.h"
12 #include "chrome/browser/extensions/extension_apitest.h"
13 #include "chrome/browser/extensions/extension_function_test_utils.h"
14 #include "chromeos/chromeos_switches.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace utils = extension_function_test_utils;
18
19 namespace chromeos {
20
21 class ExtensionEchoPrivateApiTest : public ExtensionApiTest {
22  public:
23   enum DialogTestAction {
24     DIALOG_TEST_ACTION_NONE,
25     DIALOG_TEST_ACTION_ACCEPT,
26     DIALOG_TEST_ACTION_CANCEL,
27   };
28
29   ExtensionEchoPrivateApiTest()
30       : expected_dialog_buttons_(ui::DIALOG_BUTTON_NONE),
31         dialog_action_(DIALOG_TEST_ACTION_NONE),
32         dialog_invocation_count_(0) {
33   }
34
35   virtual ~ExtensionEchoPrivateApiTest() {}
36
37   virtual void SetUpCommandLine(CommandLine* command_line) override {
38     ExtensionApiTest::SetUpCommandLine(command_line);
39
40     // Force usage of stub cros settings provider instead of device settings
41     // provider.
42     command_line->AppendSwitch(switches::kStubCrosSettings);
43   }
44
45   void RunDefaultGetUserFunctionAndExpectResultEquals(bool expected_result) {
46     scoped_refptr<EchoPrivateGetUserConsentFunction> function(
47         EchoPrivateGetUserConsentFunction::CreateForTest(base::Bind(
48             &ExtensionEchoPrivateApiTest::OnDialogShown, this)));
49     function->set_has_callback(true);
50
51     scoped_ptr<base::Value> result(utils::RunFunctionAndReturnSingleResult(
52         function.get(),
53         "[{\"serviceName\":\"some_name\",\"origin\":\"http://chromium.org\"}]",
54         browser()));
55
56     ASSERT_TRUE(result.get());
57     ASSERT_EQ(base::Value::TYPE_BOOLEAN, result->GetType());
58
59     bool result_as_boolean = false;
60     ASSERT_TRUE(result->GetAsBoolean(&result_as_boolean));
61
62     EXPECT_EQ(expected_result, result_as_boolean);
63   }
64
65   void OnDialogShown(chromeos::EchoDialogView* dialog) {
66     dialog_invocation_count_++;
67     ASSERT_LE(dialog_invocation_count_, 1);
68
69     EXPECT_EQ(expected_dialog_buttons_, dialog->GetDialogButtons());
70
71     // Don't accept the dialog if the dialog buttons don't match expectation.
72     // Accepting a dialog which should not have accept option may crash the
73     // test. The test already failed, so it's ok to cancel the dialog.
74     DialogTestAction dialog_action = dialog_action_;
75     if (dialog_action == DIALOG_TEST_ACTION_ACCEPT &&
76         expected_dialog_buttons_ != dialog->GetDialogButtons()) {
77       dialog_action = DIALOG_TEST_ACTION_CANCEL;
78     }
79
80     // Perform test action on the dialog.
81     // The dialog should stay around until AcceptWindow or CancelWindow is
82     // called, so base::Unretained is safe.
83     if (dialog_action == DIALOG_TEST_ACTION_ACCEPT) {
84       base::MessageLoopProxy::current()->PostTask(
85           FROM_HERE,
86           base::Bind(base::IgnoreResult(&chromeos::EchoDialogView::Accept),
87                      base::Unretained(dialog)));
88     } else if (dialog_action == DIALOG_TEST_ACTION_CANCEL) {
89       base::MessageLoopProxy::current()->PostTask(
90           FROM_HERE,
91           base::Bind(base::IgnoreResult(&chromeos::EchoDialogView::Cancel),
92                      base::Unretained(dialog)));
93     }
94   }
95
96   int dialog_invocation_count() const {
97     return dialog_invocation_count_;
98   }
99
100  protected:
101   int expected_dialog_buttons_;
102   DialogTestAction dialog_action_;
103
104  private:
105   int dialog_invocation_count_;
106 };
107
108 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest, EchoTest) {
109   EXPECT_TRUE(RunComponentExtensionTest("echo/component_extension"))
110       << message_;
111 }
112
113 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest,
114                        GetUserConsent_InvalidOrigin) {
115   expected_dialog_buttons_ =  ui::DIALOG_BUTTON_NONE;
116   dialog_action_ = DIALOG_TEST_ACTION_NONE;
117
118   scoped_refptr<EchoPrivateGetUserConsentFunction> function(
119       EchoPrivateGetUserConsentFunction::CreateForTest(base::Bind(
120           &ExtensionEchoPrivateApiTest::OnDialogShown,
121           base::Unretained(this))));
122
123   std::string error = utils::RunFunctionAndReturnError(
124       function.get(),
125       "[{\"serviceName\":\"some name\",\"origin\":\"invalid\"}]",
126       browser());
127
128   EXPECT_EQ("Invalid origin.", error);
129   EXPECT_EQ(0, dialog_invocation_count());
130 }
131
132 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest,
133                        GetUserConsent_AllowRedeemPrefNotSet) {
134   expected_dialog_buttons_ = ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
135   dialog_action_ = DIALOG_TEST_ACTION_ACCEPT;
136
137   RunDefaultGetUserFunctionAndExpectResultEquals(true);
138
139   EXPECT_EQ(1, dialog_invocation_count());
140 }
141
142 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest,
143                        GetUserConsent_AllowRedeemPrefTrue) {
144   chromeos::CrosSettings::Get()->SetBoolean(
145             chromeos::kAllowRedeemChromeOsRegistrationOffers, true);
146
147   expected_dialog_buttons_ = ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
148   dialog_action_ = DIALOG_TEST_ACTION_ACCEPT;
149
150   RunDefaultGetUserFunctionAndExpectResultEquals(true);
151
152   EXPECT_EQ(1, dialog_invocation_count());
153 }
154
155 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest,
156                        GetUserConsent_ConsentDenied) {
157   chromeos::CrosSettings::Get()->SetBoolean(
158             chromeos::kAllowRedeemChromeOsRegistrationOffers, true);
159
160   expected_dialog_buttons_ = ui::DIALOG_BUTTON_CANCEL | ui::DIALOG_BUTTON_OK;
161   dialog_action_ = DIALOG_TEST_ACTION_CANCEL;
162
163   RunDefaultGetUserFunctionAndExpectResultEquals(false);
164
165   EXPECT_EQ(1, dialog_invocation_count());
166 }
167
168 IN_PROC_BROWSER_TEST_F(ExtensionEchoPrivateApiTest,
169                        GetUserConsent_AllowRedeemPrefFalse) {
170   chromeos::CrosSettings::Get()->SetBoolean(
171             chromeos::kAllowRedeemChromeOsRegistrationOffers, false);
172
173   expected_dialog_buttons_ = ui::DIALOG_BUTTON_CANCEL;
174   dialog_action_ = DIALOG_TEST_ACTION_CANCEL;
175
176   RunDefaultGetUserFunctionAndExpectResultEquals(false);
177
178   EXPECT_EQ(1, dialog_invocation_count());
179 }
180
181 }  // namespace chromeos