Index: chrome/browser/password_manager/keyring_proxy/keyring_proxy_client_unittest.cc |
=================================================================== |
--- chrome/browser/password_manager/keyring_proxy/keyring_proxy_client_unittest.cc (revision 0) |
+++ chrome/browser/password_manager/keyring_proxy/keyring_proxy_client_unittest.cc (revision 0) |
@@ -0,0 +1,270 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <gnome-keyring.h> |
+#include <unistd.h> |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/file_util.h" |
+#include "base/stl_util.h" |
+#include "base/string_number_conversions.h" |
+#include "base/stringprintf.h" |
+#include "base/utf_string_conversions.h" |
+#include "chrome/browser/password_manager/keyring_proxy/keyring_proxy.h" |
+#include "chrome/browser/password_manager/keyring_proxy/keyring_proxy_client.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "webkit/forms/password_form.h" |
+ |
+namespace keyring_proxy { |
+ |
+class TestKeyringProxyClient : public KeyringProxyClient { |
+ public: |
+ using KeyringProxyClient::ConnectForTesting; |
+ using KeyringProxyClient::CancelAllRequests; |
+ using KeyringProxyClient::HandleProxyReply; |
+}; |
+ |
+class KeyringProxyClientTest : public testing::Test { |
+ protected: |
+ virtual void SetUp() { |
+ FILE* file = file_util::CreateAndOpenTemporaryFile(&path_); |
+ ASSERT_FALSE(file == NULL); |
+ int fd = dup(fileno(file)); |
+ EXPECT_GE(fd, 0); |
+ fclose(file); |
+ // Now that we've got a file descriptor to an empty file, "connect" to it. |
+ client_.ConnectForTesting(fd, false); |
+ |
+ // Set up a sample form. |
+ sample_form_.origin = GURL("http://www.google.com/"); |
+ sample_form_.action = GURL("http://www.google.com/login"); |
+ sample_form_.username_element = UTF8ToUTF16("user"); |
+ sample_form_.username_value = UTF8ToUTF16("joeschmoe"); |
+ sample_form_.password_element = UTF8ToUTF16("pass"); |
+ sample_form_.password_value = UTF8ToUTF16("seekrit"); |
+ sample_form_.submit_element = UTF8ToUTF16("submit"); |
+ sample_form_.signon_realm = "Google"; |
+ sample_form_.ssl_valid = true; |
+ sample_form_.preferred = true; |
+ sample_form_.date_created = base::Time::FromTimeT(12345); |
+ sample_form_.blacklisted_by_user = false; |
+ sample_form_.scheme = webkit::forms::PasswordForm::SCHEME_HTML; |
+ } |
+ |
+ virtual void TearDown() { |
+ EXPECT_TRUE(file_util::Delete(path_, false)); |
+ } |
+ |
+ std::string GetRequests() { |
+ std::string requests; |
+ EXPECT_TRUE(file_util::ReadFileToString(path_, &requests)); |
+ return requests; |
+ } |
+ |
+ webkit::forms::PasswordForm sample_form_; |
+ |
+ FilePath path_; |
+ TestKeyringProxyClient client_; |
+}; |
+ |
+// The tests all declare RequestContexts on the stack, so we need to cancel them |
+// before each test's body returns. Since gtest uses exceptions for some kinds |
+// of failures, we need to use an object's destructor to make sure that happens. |
+// IMPORTANT NOTE: Define the RequestCanceler after all RequestContexts! |
+class RequestCanceler { |
+ public: |
+ explicit RequestCanceler(TestKeyringProxyClient* client) |
+ : client_(client) {} |
+ ~RequestCanceler() { client_->CancelAllRequests(); } |
+ private: |
+ TestKeyringProxyClient* client_; |
+}; |
+ |
+TEST_F(KeyringProxyClientTest, AddLogin) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.AddLogin(sample_form_, "chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\n+%s\n+%s\n+%s\n+%s\n+%s\n+%s\n+%s\n" |
+ "+%s\n+%s\n%d\n%d\n+%s\n%d\n%d\nchrome\n\n", |
+ KeyringProxy::kAddLoginCommand, |
+ sample_form_.origin.spec().c_str(), |
+ UTF16ToUTF8(sample_form_.password_value).c_str(), |
+ sample_form_.origin.spec().c_str(), |
+ sample_form_.action.spec().c_str(), |
+ UTF16ToUTF8(sample_form_.username_element).c_str(), |
+ UTF16ToUTF8(sample_form_.username_value).c_str(), |
+ UTF16ToUTF8(sample_form_.password_element).c_str(), |
+ UTF16ToUTF8(sample_form_.submit_element).c_str(), |
+ sample_form_.signon_realm.c_str(), |
+ sample_form_.ssl_valid, |
+ sample_form_.preferred, |
+ base::Int64ToString( |
+ sample_form_.date_created.ToTimeT()).c_str(), |
+ sample_form_.blacklisted_by_user, |
+ sample_form_.scheme), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, AddLoginSearch) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.AddLoginSearch(sample_form_, "chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\n+%s\n+%s\n+%s\n+%s\n+%s\n+%s\nchrome\n\n", |
+ KeyringProxy::kAddLoginSearchCommand, |
+ sample_form_.origin.spec().c_str(), |
+ UTF16ToUTF8(sample_form_.username_element).c_str(), |
+ UTF16ToUTF8(sample_form_.username_value).c_str(), |
+ UTF16ToUTF8(sample_form_.password_element).c_str(), |
+ UTF16ToUTF8(sample_form_.submit_element).c_str(), |
+ sample_form_.signon_realm.c_str()), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, UpdateLoginSearch) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.UpdateLoginSearch(sample_form_, "chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\n+%s\n+%s\n+%s\n+%s\n+%s\nchrome\n\n", |
+ KeyringProxy::kUpdateLoginSearchCommand, |
+ sample_form_.origin.spec().c_str(), |
+ UTF16ToUTF8(sample_form_.username_element).c_str(), |
+ UTF16ToUTF8(sample_form_.username_value).c_str(), |
+ UTF16ToUTF8(sample_form_.password_element).c_str(), |
+ sample_form_.signon_realm.c_str()), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, RemoveLogin) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.RemoveLogin(sample_form_, "chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\n+%s\n+%s\n+%s\n+%s\n+%s\n+%s\n+%s\nchrome\n\n", |
+ KeyringProxy::kRemoveLoginCommand, |
+ sample_form_.origin.spec().c_str(), |
+ sample_form_.action.spec().c_str(), |
+ UTF16ToUTF8(sample_form_.username_element).c_str(), |
+ UTF16ToUTF8(sample_form_.username_value).c_str(), |
+ UTF16ToUTF8(sample_form_.password_element).c_str(), |
+ UTF16ToUTF8(sample_form_.submit_element).c_str(), |
+ sample_form_.signon_realm.c_str()), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetLogins) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.GetLogins(sample_form_, "chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\n+%s\nchrome\n\n", |
+ KeyringProxy::kGetLoginsCommand, |
+ sample_form_.signon_realm.c_str()), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetLoginsList) { |
+ // This test also lightly tests the request ID mechanism. |
+ KeyringProxyClient::RequestContext context[2]; |
+ RequestCanceler canceler(&client_); |
+ client_.GetLoginsList(false, "chrome", &context[0]); |
+ client_.GetLoginsList(true, "chrome", &context[1]); |
+ EXPECT_EQ(StringPrintf("%c1\n0\nchrome\n\n%c2\n1\nchrome\n\n", |
+ KeyringProxy::kGetLoginsListCommand, |
+ KeyringProxy::kGetLoginsListCommand), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetAllLogins) { |
+ KeyringProxyClient::RequestContext context; |
+ RequestCanceler canceler(&client_); |
+ client_.GetAllLogins("chrome", &context); |
+ EXPECT_EQ(StringPrintf("%c1\nchrome\n\n", KeyringProxy::kGetAllLoginsCommand), |
+ GetRequests()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetAllLoginsEmptyReply) { |
+ std::vector<webkit::forms::PasswordForm*> forms; |
+ KeyringProxyClient::RequestContext context(&forms); |
+ RequestCanceler canceler(&client_); |
+ client_.GetAllLogins("chrome", &context); |
+ std::vector<std::string> reply; |
+ reply.push_back(StringPrintf("1 %d", GNOME_KEYRING_RESULT_NO_MATCH)); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_TRUE(context.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_NO_MATCH, context.result_code); |
+ EXPECT_EQ(0u, forms.size()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetAllLoginsOneReply) { |
+ std::vector<webkit::forms::PasswordForm*> forms; |
+ KeyringProxyClient::RequestContext context(&forms); |
+ RequestCanceler canceler(&client_); |
+ client_.GetAllLogins("chrome", &context); |
+ std::vector<std::string> reply; |
+ reply.push_back(StringPrintf("1 %d", GNOME_KEYRING_RESULT_OK)); |
+ reply.push_back("+" + sample_form_.origin.spec()); |
+ reply.push_back("+" + sample_form_.action.spec()); |
+ reply.push_back("+" + UTF16ToUTF8(sample_form_.username_element)); |
+ reply.push_back("+" + UTF16ToUTF8(sample_form_.username_value)); |
+ reply.push_back("+" + UTF16ToUTF8(sample_form_.password_element)); |
+ reply.push_back("+" + UTF16ToUTF8(sample_form_.password_value)); |
+ reply.push_back("+" + UTF16ToUTF8(sample_form_.submit_element)); |
+ reply.push_back("+" + sample_form_.signon_realm); |
+ reply.push_back(sample_form_.ssl_valid ? "1" : "0"); |
+ reply.push_back(sample_form_.preferred ? "1" : "0"); |
+ reply.push_back("+" + base::Int64ToString( |
+ sample_form_.date_created.ToTimeT())); |
+ reply.push_back(sample_form_.blacklisted_by_user ? "1" : "0"); |
+ reply.push_back(StringPrintf("%d", sample_form_.scheme)); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_TRUE(context.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_OK, context.result_code); |
+ ASSERT_EQ(1u, forms.size()); |
+ // TODO(mdm): verify the form is actually correct, i.e. == sample_form_ |
+ STLDeleteElements(&forms); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetAllLoginsInOrderReplies) { |
+ std::vector<webkit::forms::PasswordForm*> forms; |
+ KeyringProxyClient::RequestContext context1(&forms); |
+ KeyringProxyClient::RequestContext context2(&forms); |
+ RequestCanceler canceler(&client_); |
+ client_.GetAllLogins("chrome", &context1); |
+ client_.GetAllLogins("chrome", &context2); |
+ std::vector<std::string> reply; |
+ reply.push_back(StringPrintf("1 %d", GNOME_KEYRING_RESULT_NO_MATCH)); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_TRUE(context1.event.IsSignaled()); |
+ EXPECT_FALSE(context2.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_NO_MATCH, context1.result_code); |
+ EXPECT_EQ(0u, forms.size()); |
+ reply[0] = StringPrintf("2 %d", GNOME_KEYRING_RESULT_NO_MATCH); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_TRUE(context2.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_NO_MATCH, context2.result_code); |
+ EXPECT_EQ(0u, forms.size()); |
+} |
+ |
+TEST_F(KeyringProxyClientTest, GetAllLoginsOutOfOrderReplies) { |
+ std::vector<webkit::forms::PasswordForm*> forms; |
+ KeyringProxyClient::RequestContext context1(&forms); |
+ KeyringProxyClient::RequestContext context2(&forms); |
+ RequestCanceler canceler(&client_); |
+ client_.GetAllLogins("chrome", &context1); |
+ client_.GetAllLogins("chrome", &context2); |
+ std::vector<std::string> reply; |
+ reply.push_back(StringPrintf("2 %d", GNOME_KEYRING_RESULT_NO_MATCH)); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_FALSE(context1.event.IsSignaled()); |
+ EXPECT_TRUE(context2.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_NO_MATCH, context2.result_code); |
+ EXPECT_EQ(0u, forms.size()); |
+ reply[0] = StringPrintf("1 %d", GNOME_KEYRING_RESULT_NO_MATCH); |
+ client_.HandleProxyReply(reply); |
+ EXPECT_TRUE(context1.event.IsSignaled()); |
+ EXPECT_EQ(GNOME_KEYRING_RESULT_NO_MATCH, context1.result_code); |
+ EXPECT_EQ(0u, forms.size()); |
+} |
+ |
+} // namespace keyring_proxy |
Property changes on: chrome/browser/password_manager/keyring_proxy/keyring_proxy_client_unittest.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |