Chromium Code Reviews| Index: chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc |
| diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc |
| index f4b3aa3c022d3becf0bbc94c1207be67020f43b2..67998400755295ae5280d11ef1db95fc44efa790 100644 |
| --- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc |
| +++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_apitest.cc |
| @@ -20,6 +20,9 @@ |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| +#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service.h" |
| +#include "chrome/browser/chromeos/certificate_provider/certificate_provider_service_factory.h" |
| +#include "chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h" |
| #include "chrome/browser/extensions/extension_apitest.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| @@ -38,6 +41,9 @@ |
| #include "extensions/test/result_catcher.h" |
| #include "net/test/spawned_test_server/spawned_test_server.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| +#include "ui/views/controls/label.h" |
| +#include "ui/views/controls/textfield/textfield.h" |
| +#include "ui/views/widget/widget.h" |
| using testing::Return; |
| using testing::_; |
| @@ -122,6 +128,43 @@ std::string JsUint8Array(const std::vector<uint8_t>& bytes) { |
| return res; |
| } |
| +// Enters the code in the ShowPinDialog window and pushes the OK event. |
| +void EnterCode(chromeos::CertificateProviderService* service, |
| + base::string16 code) { |
|
emaxx
2016/09/19 14:01:44
nit: Pass the strings by const-reference (here and
igorcov
2016/09/19 15:42:37
Done.
|
| + chromeos::RequestPinView* view = |
| + service->pin_dialog_manager()->active_view_for_testing(); |
| + view->textfield_for_testing()->SetText(code); |
| + view->Accept(); |
| + base::RunLoop().RunUntilIdle(); |
| +} |
| + |
| +// Enters the valid code for extensions from local example folders, in the |
| +// ShowPinDialog window and waits for the window to close. |
| +void EnterCorrectPin(chromeos::CertificateProviderService* service) { |
| + views::Widget* active_window = |
| + service->pin_dialog_manager()->active_window_for_testing(); |
| + EnterCode(service, base::ASCIIToUTF16("1234")); |
| + |
| + // Wait for extension to send request to close the window. |
| + while (!active_window->IsClosed()) { |
| + base::RunLoop().RunUntilIdle(); |
| + } |
| +} |
| + |
| +// Enters an invalid code for extensions from local example folders, in the |
| +// ShowPinDialog window and waits for the window to update with the error. |
| +void EnterWrongPin(chromeos::CertificateProviderService* service) { |
| + EnterCode(service, base::ASCIIToUTF16("123")); |
| + |
| + chromeos::RequestPinView* view = |
| + service->pin_dialog_manager()->active_view_for_testing(); |
| + // Waiting for extension to open the dialog again with an error in red |
| + // displayed. |
| + while (view->error_label_for_testing()->enabled_color() != SK_ColorRED) { |
| + base::RunLoop().RunUntilIdle(); |
| + } |
| +} |
| + |
| class CertificateProviderApiTest : public ExtensionApiTest { |
| public: |
| CertificateProviderApiTest() {} |
| @@ -153,6 +196,27 @@ class CertificateProviderApiTest : public ExtensionApiTest { |
| content::RunAllPendingInMessageLoop(); |
| } |
| + // Loads certificate_provider extension from folder (the page basic.html). |
| + // Returns the CertificateProviderService object from browser context. |
| + chromeos::CertificateProviderService* LoadExtensionFromFolder( |
|
emaxx
2016/09/19 14:01:44
Please change the existing tests in this file to u
|
| + std::string folder, |
| + std::string file_name) { |
| + content::WebContents* extension_contents = |
| + browser()->tab_strip_model()->GetActiveWebContents(); |
| + chromeos::CertificateProviderService* service = |
| + chromeos::CertificateProviderServiceFactory::GetForBrowserContext( |
| + extension_contents->GetBrowserContext()); |
| + const base::FilePath extension_path = |
| + test_data_dir_.AppendASCII("certificate_provider/" + folder); |
| + const extensions::Extension* const extension = |
| + LoadExtension(extension_path); |
| + service->pin_dialog_manager()->AddSignRequestId(extension->id(), 123); |
|
emaxx
2016/09/19 14:01:44
nit: The test uses the same constant "123" for dif
igorcov
2016/09/19 15:42:36
Done.
|
| + ui_test_utils::NavigateToURL(browser(), |
| + extension->GetResourceURL(file_name)); |
| + base::RunLoop().RunUntilIdle(); |
| + return service; |
| + } |
| + |
| protected: |
| policy::MockConfigurationPolicyProvider provider_; |
| }; |
| @@ -268,3 +332,99 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, Basic) { |
| EXPECT_TRUE(result); |
| } |
| } |
| + |
| +// User closes the dialog three times, and the extension should be blocked from |
|
emaxx
2016/09/19 14:01:44
nit: Replace the "three times" text with a more ge
|
| +// showing it again. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, ShowPinDialogClose) { |
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic.html"); |
| + |
| + views::Widget* window = |
| + service->pin_dialog_manager()->active_window_for_testing(); |
| + for (int i = 0; |
| + i < extensions::api::certificate_provider::kMaxClosedDialogsPer10Mins; |
| + i++) { |
| + window->Close(); |
| + // Waiting for the new window to pop up. |
| + while (window == service->pin_dialog_manager()->active_window_for_testing()) |
|
emaxx
2016/09/19 14:01:44
Not sure whether I understand the code correctly.
igorcov
2016/09/19 15:42:36
You are right. I've changed the code to wait for t
|
| + base::RunLoop().RunUntilIdle(); |
| + |
| + window = service->pin_dialog_manager()->active_window_for_testing(); |
| + } |
| + |
| + // This time when closed, the window should not be able to pop up again. |
| + window->Close(); |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_EQ(service->pin_dialog_manager()->active_view_for_testing(), nullptr); |
| +} |
| + |
| +// User enters the correct PIN. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, ShowPinDialogAccept) { |
|
emaxx
2016/09/19 14:01:44
nit: Please move this test to be the first one amo
igorcov
2016/09/19 15:42:37
Done.
|
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic.html"); |
| + |
| + EnterCorrectPin(service); |
| + chromeos::RequestPinView* view = |
| + service->pin_dialog_manager()->active_view_for_testing(); |
| + |
| + // The view should be set to nullptr when the window is closed. |
| + EXPECT_EQ(view, nullptr); |
| +} |
| + |
| +// User enters a wrong PIN first and a correct PIN on the second try. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, ShowPinDialogWrongPin) { |
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic.html"); |
| + |
| + EnterWrongPin(service); |
| + chromeos::RequestPinView* view = |
| + service->pin_dialog_manager()->active_view_for_testing(); |
| + |
| + // The window should be active. |
| + EXPECT_EQ( |
| + service->pin_dialog_manager()->active_window_for_testing()->IsVisible(), |
| + true); |
| + view = service->pin_dialog_manager()->active_view_for_testing(); |
| + EXPECT_NE(view, nullptr); |
| + |
| + // Enter the valid PIN. |
| + EnterCorrectPin(service); |
| + view = service->pin_dialog_manager()->active_view_for_testing(); |
| + |
| + // The view should be set to nullptr when the window is closed. |
| + EXPECT_EQ(view, nullptr); |
| +} |
| + |
| +// User enters wrong PIN three times. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, |
| + ShowPinDialogWrongPinThreeTimes) { |
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic.html"); |
| + for (int i = 0; i < 3; i++) { |
| + EnterWrongPin(service); |
| + } |
| + |
| + chromeos::RequestPinView* view = |
| + service->pin_dialog_manager()->active_view_for_testing(); |
| + |
| + // The textfield has to be disabled, as extension does not allow input now. |
| + EXPECT_EQ(view->textfield_for_testing()->enabled(), false); |
| + |
| + // Close the dialog. |
| + service->pin_dialog_manager()->active_window_for_testing()->Close(); |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_EQ(service->pin_dialog_manager()->active_view_for_testing(), nullptr); |
| +} |
| + |
| +// User closes the dialog while the extension is processing the request. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, |
| + ShowPinDialogCloseWhileProcessing) { |
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic_lock.html"); |
| + |
| + EnterCode(service, base::ASCIIToUTF16("123")); |
| + service->pin_dialog_manager()->active_window_for_testing()->Close(); |
| + base::RunLoop().RunUntilIdle(); |
| + // The view should be set to nullptr when the window is closed. |
| + EXPECT_EQ(service->pin_dialog_manager()->active_view_for_testing(), nullptr); |
| +} |