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..921457b6997c25d1df57a1429d8396cfb3300cee 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, |
| + const base::string16& code) { |
| + 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("567")); |
| + |
| + 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( |
| + std::string folder, |
|
emaxx
2016/09/19 16:05:26
nit: s/std::string/const std::string&/
|
| + 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 16:05:26
Please move this out into a separate method. It do
|
| + ui_test_utils::NavigateToURL(browser(), |
| + extension->GetResourceURL(file_name)); |
| + base::RunLoop().RunUntilIdle(); |
| + return service; |
| + } |
| + |
| protected: |
| policy::MockConfigurationPolicyProvider provider_; |
| }; |
| @@ -268,3 +332,93 @@ IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, Basic) { |
| EXPECT_TRUE(result); |
| } |
| } |
| + |
| +// User enters the correct PIN. |
| +IN_PROC_BROWSER_TEST_F(CertificateProviderApiTest, ShowPinDialogAccept) { |
| + chromeos::CertificateProviderService* service = |
| + LoadExtensionFromFolder("request_pin", "basic.html"); |
| + |
| + // Enter the valid PIN. |
| + EnterCorrectPin(service); |
| + |
| + // The view should be set to nullptr when the window is closed. |
| + EXPECT_EQ(service->pin_dialog_manager()->active_view_for_testing(), nullptr); |
| +} |
| + |
| +// User closes the dialog kMaxClosedDialogsPer10Mins times, and the extension |
| +// should be blocked from 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 (service->pin_dialog_manager()->active_view_for_testing() == nullptr) |
| + 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 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); |
| + |
| + // The window should be active. |
| + EXPECT_EQ( |
| + service->pin_dialog_manager()->active_window_for_testing()->IsVisible(), |
| + true); |
| + EXPECT_NE(service->pin_dialog_manager()->active_view_for_testing(), nullptr); |
| + |
| + // Enter the valid PIN. |
| + EnterCorrectPin(service); |
| + |
| + // The view should be set to nullptr when the window is closed. |
| + EXPECT_EQ(service->pin_dialog_manager()->active_view_for_testing(), 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); |
| +} |