| Index: chrome/browser/autofill/personal_data_manager_unittest.cc
|
| ===================================================================
|
| --- chrome/browser/autofill/personal_data_manager_unittest.cc (revision 0)
|
| +++ chrome/browser/autofill/personal_data_manager_unittest.cc (revision 0)
|
| @@ -0,0 +1,177 @@
|
| +// Copyright (c) 2010 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 "base/basictypes.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "chrome/browser/autofill/autofill_profile.h"
|
| +#include "chrome/browser/autofill/personal_data_manager.h"
|
| +#include "chrome/browser/chrome_thread.h"
|
| +#include "chrome/common/notification_details.h"
|
| +#include "chrome/common/notification_observer_mock.h"
|
| +#include "chrome/common/notification_registrar.h"
|
| +#include "chrome/common/notification_service.h"
|
| +#include "chrome/common/notification_type.h"
|
| +#include "chrome/test/testing_profile.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +ACTION(QuitUIMessageLoop) {
|
| + DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
|
| + MessageLoop::current()->Quit();
|
| +}
|
| +
|
| +class PersonalDataLoadedObserverMock : public PersonalDataManager::Observer {
|
| + public:
|
| + PersonalDataLoadedObserverMock() {}
|
| + virtual ~PersonalDataLoadedObserverMock() {}
|
| +
|
| + MOCK_METHOD0(OnPersonalDataLoaded, void());
|
| +};
|
| +
|
| +class PersonalDataManagerTest : public testing::Test {
|
| + protected:
|
| + PersonalDataManagerTest()
|
| + : ui_thread_(ChromeThread::UI, &message_loop_),
|
| + db_thread_(ChromeThread::DB) {
|
| + }
|
| +
|
| + virtual void SetUp() {
|
| + db_thread_.Start();
|
| +
|
| + profile_.reset(new TestingProfile);
|
| + profile_->CreateWebDataService(false);
|
| +
|
| + ResetPersonalDataManager();
|
| + }
|
| +
|
| + virtual void TearDown() {
|
| + if (profile_.get())
|
| + profile_.reset(NULL);
|
| +
|
| + db_thread_.Stop();
|
| + MessageLoop::current()->PostTask(FROM_HERE, new MessageLoop::QuitTask);
|
| + MessageLoop::current()->Run();
|
| + }
|
| +
|
| + void ResetPersonalDataManager() {
|
| + personal_data_.reset(new PersonalDataManager(profile_.get()));
|
| + personal_data_->SetObserver(&personal_data_observer_);
|
| + }
|
| +
|
| + static void SetProfileInfo(AutoFillProfile* profile,
|
| + const char* label, const char* first_name, const char* middle_name,
|
| + const char* last_name, const char* email, const char* company,
|
| + const char* address1, const char* address2, const char* city,
|
| + const char* state, const char* zipcode, const char* country,
|
| + const char* phone, const char* fax) {
|
| + profile->set_label(ASCIIToUTF16(label));
|
| + profile->SetInfo(AutoFillType(NAME_FIRST), ASCIIToUTF16(first_name));
|
| + profile->SetInfo(AutoFillType(NAME_MIDDLE), ASCIIToUTF16(middle_name));
|
| + profile->SetInfo(AutoFillType(NAME_LAST), ASCIIToUTF16(last_name));
|
| + profile->SetInfo(AutoFillType(EMAIL_ADDRESS), ASCIIToUTF16(email));
|
| + profile->SetInfo(AutoFillType(COMPANY_NAME), ASCIIToUTF16(company));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_LINE1), ASCIIToUTF16(address1));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_LINE2), ASCIIToUTF16(address2));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_CITY), ASCIIToUTF16(city));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_STATE), ASCIIToUTF16(state));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_ZIP), ASCIIToUTF16(zipcode));
|
| + profile->SetInfo(AutoFillType(ADDRESS_HOME_COUNTRY), ASCIIToUTF16(country));
|
| + profile->SetInfo(AutoFillType(PHONE_HOME_NUMBER), ASCIIToUTF16(phone));
|
| + profile->SetInfo(AutoFillType(PHONE_FAX_NUMBER), ASCIIToUTF16(fax));
|
| + }
|
| +
|
| + MessageLoopForUI message_loop_;
|
| + ChromeThread ui_thread_;
|
| + ChromeThread db_thread_;
|
| + scoped_ptr<TestingProfile> profile_;
|
| + scoped_ptr<PersonalDataManager> personal_data_;
|
| + NotificationRegistrar registrar_;
|
| + NotificationObserverMock observer_;
|
| + PersonalDataLoadedObserverMock personal_data_observer_;
|
| +};
|
| +
|
| +// TODO(jhawkins): Test SaveProfiles w/out a WebDataService in the profile.
|
| +TEST_F(PersonalDataManagerTest, SetProfiles) {
|
| + AutoFillProfile profile0(string16(), 0);
|
| + SetProfileInfo(&profile0, "Billing", "Marion", "Mitchell", "Morrison",
|
| + "johnwayne@me.xyz", "Fox", "123 Zoo St.", "unit 5", "Hollywood", "CA",
|
| + "91601", "US", "12345678910", "01987654321");
|
| +
|
| + AutoFillProfile profile1(string16(), 0);
|
| + SetProfileInfo(&profile1, "Home", "Josephine", "Alicia", "Saenz",
|
| + "joewayne@me.xyz", "Fox", "903 Apple Ct.", NULL, "Orlando", "FL", "32801",
|
| + "US", "19482937549", "13502849239");
|
| +
|
| + AutoFillProfile profile2(string16(), 0);
|
| + SetProfileInfo(&profile2, "Work", "Josephine", "Alicia", "Saenz",
|
| + "joewayne@me.xyz", "Fox", "1212 Center.", "Bld. 5", "Orlando", "FL",
|
| + "32801", "US", "19482937549", "13502849239");
|
| +
|
| + // This will verify that the web database has been loaded and the notification
|
| + // sent out.
|
| + EXPECT_CALL(personal_data_observer_,
|
| + OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
|
| +
|
| + // The message loop will exit when the mock observer is notified.
|
| + MessageLoop::current()->Run();
|
| +
|
| + // Add the three test profiles to the database.
|
| + std::vector<AutoFillProfile> update;
|
| + update.push_back(profile0);
|
| + update.push_back(profile1);
|
| + personal_data_->SetProfiles(&update);
|
| +
|
| + // The PersonalDataManager will update the unique IDs when saving the
|
| + // profiles, so we have to update the expectations.
|
| + profile0.set_unique_id(update[0].unique_id());
|
| + profile1.set_unique_id(update[1].unique_id());
|
| +
|
| + const std::vector<AutoFillProfile*>& results1 = personal_data_->profiles();
|
| + ASSERT_EQ(2U, results1.size());
|
| + EXPECT_EQ(profile0, *results1.at(0));
|
| + EXPECT_EQ(profile1, *results1.at(1));
|
| +
|
| + // Three operations in one:
|
| + // - Update profile0
|
| + // - Remove profile1
|
| + // - Add profile2
|
| + profile0.SetInfo(AutoFillType(NAME_FIRST), ASCIIToUTF16("John"));
|
| + update.clear();
|
| + update.push_back(profile0);
|
| + update.push_back(profile2);
|
| + personal_data_->SetProfiles(&update);
|
| +
|
| + // Set the expected unique ID for profile2.
|
| + profile2.set_unique_id(update[1].unique_id());
|
| +
|
| + // AutoFillProfile IDs are re-used, so the third profile to be added will have
|
| + // a unique ID that matches the old unique ID of the removed profile1, even
|
| + // though that ID has already been used.
|
| + const std::vector<AutoFillProfile*>& results2 = personal_data_->profiles();
|
| + ASSERT_EQ(2U, results2.size());
|
| + EXPECT_EQ(profile0, *results2.at(0));
|
| + EXPECT_EQ(profile2, *results2.at(1));
|
| + EXPECT_EQ(profile2.unique_id(), profile1.unique_id());
|
| +
|
| + // Reset the PersonalDataManager. This tests that the personal data was saved
|
| + // to the web database, and that we can load the profiles from the web
|
| + // database.
|
| + ResetPersonalDataManager();
|
| +
|
| + //PersonalDataLoadedObserver observer;
|
| + // This will verify that the web database has been loaded and the notification
|
| + // sent out.
|
| + EXPECT_CALL(personal_data_observer_,
|
| + OnPersonalDataLoaded()).WillOnce(QuitUIMessageLoop());
|
| +
|
| + // The message loop will exit when the PersonalDataLoadedObserver is notified.
|
| + MessageLoop::current()->Run();
|
| +
|
| + // Verify that we've loaded the profiles from the web database.
|
| + const std::vector<AutoFillProfile*>& results3 = personal_data_->profiles();
|
| + ASSERT_EQ(2U, results3.size());
|
| + EXPECT_EQ(profile0, *results3.at(0));
|
| + EXPECT_EQ(profile2, *results3.at(1));
|
| +}
|
|
|
| Property changes on: chrome/browser/autofill/personal_data_manager_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|