Chromium Code Reviews| Index: chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java |
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..396a0803860284254cc071c873d5706124c8efdb |
| --- /dev/null |
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java |
| @@ -0,0 +1,195 @@ |
| +// Copyright 2016 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. |
| + |
| +package org.chromium.chrome.browser.preferences; |
| + |
| +import android.accounts.Account; |
| +import android.app.Activity; |
| +import android.app.Instrumentation; |
| +import android.content.Context; |
| +import android.content.Intent; |
| +import android.test.suitebuilder.annotation.SmallTest; |
| + |
| +import org.chromium.base.ThreadUtils; |
| +import org.chromium.base.test.util.CommandLineFlags; |
| +import org.chromium.base.test.util.Feature; |
| +import org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences; |
| +import org.chromium.chrome.browser.sync.ProfileSyncService; |
| +import org.chromium.content.browser.test.NativeLibraryTestBase; |
| +import org.chromium.sync.AndroidSyncSettings; |
| +import org.chromium.sync.signin.AccountManagerHelper; |
| +import org.chromium.sync.test.util.AccountHolder; |
| +import org.chromium.sync.test.util.MockAccountManager; |
| +import org.chromium.sync.test.util.MockSyncContentResolverDelegate; |
| + |
| +/** |
| + * Tests for verifying whether users are presented with the correct option of viewing |
| + * passwords according to the user group they belong to (syncing with sync passphrase, |
| + * syncing without sync passsphrase, non-syncing). |
| + */ |
| + |
| +public class PasswordViewingTypeTest extends NativeLibraryTestBase { |
| + |
| + private MainPreferences mMainPreferences; |
| + private ChromeBasePreference mPasswordsPref; |
| + private static final String DEFAULT_ACCOUNT = "test@gmail.com"; |
| + private Context mContext; |
| + private MockSyncContentResolverDelegate mSyncContentResolverDelegate; |
| + private String mAuthority; |
| + private Account mAccount; |
| + private Account mAlternateAccount; |
| + private MockAccountManager mAccountManager; |
| + |
| + @Override |
| + protected void setUp() throws Exception { |
| + |
| + mSyncContentResolverDelegate = new MockSyncContentResolverDelegate(); |
| + mContext = getInstrumentation().getTargetContext(); |
| + mMainPreferences = (MainPreferences) startMainPreferences(getInstrumentation(), |
| + mContext).getFragmentForTest(); |
| + mPasswordsPref = (ChromeBasePreference) mMainPreferences.findPreference( |
| + MainPreferences.PREF_SAVED_PASSWORDS); |
| + setupTestAccounts(mContext); |
| + AndroidSyncSettings.overrideForTests(mContext, mSyncContentResolverDelegate); |
| + mAuthority = AndroidSyncSettings.getContractAuthority(mContext); |
| + AndroidSyncSettings.updateAccount(mContext, mAccount); |
| + super.setUp(); |
| + loadNativeLibraryAndInitBrowserProcess(); |
| + } |
| + |
| + private void setupTestAccounts(Context context) { |
| + mAccountManager = new MockAccountManager(context, context); |
| + AccountManagerHelper.overrideAccountManagerHelperForTests(context, mAccountManager); |
| + mAccount = setupTestAccount("account@example.com"); |
| + mAlternateAccount = setupTestAccount("alternate@example.com"); |
| + } |
| + |
| + private Account setupTestAccount(String accountName) { |
| + Account account = AccountManagerHelper.createAccountFromName(accountName); |
| + AccountHolder.Builder accountHolder = |
| + AccountHolder.create().account(account).password("password").alwaysAccept(true); |
| + mAccountManager.addAccountHolderExplicitly(accountHolder.build()); |
| + return account; |
| + } |
| + |
| + /* |
|
Bernhard Bauer
2016/07/20 14:56:19
Javadoc-style comment.
dozsa
2016/07/21 08:51:33
Done.
|
| + * Launches the main preferences. |
| + */ |
| + private static Preferences startMainPreferences(Instrumentation instrumentation, |
| + final Context mContext) { |
| + Intent intent = PreferencesLauncher.createIntentForSettingsPage(mContext, |
| + MainPreferences.class.getName()); |
| + Activity activity = (Preferences) instrumentation.startActivitySync(intent); |
| + assertTrue(activity instanceof Preferences); |
| + return (Preferences) activity; |
| + } |
| + |
| + /** |
| + * Fake ProfileSyncService to test redirecting the user to passwords.google.com |
| + * and natively displaying passwords. |
| + */ |
| + private static class FakeProfileSyncService extends ProfileSyncService { |
|
Bernhard Bauer
2016/07/20 14:56:19
You could make this an anonymous class in override
dozsa
2016/07/21 08:51:33
Thank you for the suggestion. Done.
|
| + |
| + private boolean mUsingPassphrase; |
|
Bernhard Bauer
2016/07/20 14:56:19
Make this final?
dozsa
2016/07/21 08:51:33
Removed so no longer necessary.
|
| + |
| + public FakeProfileSyncService(boolean usingPassphrase) { |
| + super(); |
| + mUsingPassphrase = usingPassphrase; |
| + } |
| + |
| + @Override |
| + public boolean isUsingSecondaryPassphrase() { |
| + return mUsingPassphrase; |
| + } |
| + |
| + @Override |
| + public boolean isBackendInitialized() { |
| + return true; |
| + } |
| + } |
| + |
| + private void overrideProfileSyncService(final boolean usingPassphrase) { |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + ProfileSyncService.overrideForTests(new FakeProfileSyncService(usingPassphrase)); |
| + } |
| + }); |
| + } |
| + |
| + private void enableChromeSyncOnUiThread() { |
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() { |
| + @Override |
| + public void run() { |
| + AndroidSyncSettings.enableChromeSync(mContext); |
| + } |
| + }); |
| + } |
| + |
| + /** |
| + * Verifies that sync settings are being set up correctly in the case of redirecting users. |
| + */ |
| + @SmallTest |
| + @CommandLineFlags.Add("enable-features=" + MainPreferences.VIEW_PASSWORDS) |
| + @Feature({"Sync"}) |
| + public void testUserRedirectSyncSettings() throws InterruptedException { |
|
vabr (Chromium)
2016/07/20 14:16:44
Since tests now pass, and you know that the sync s
dozsa
2016/07/21 08:51:33
I've kept the test but made a helper method for tu
|
| + |
| + // Turn on syncability |
| + mSyncContentResolverDelegate.setMasterSyncAutomatically(true); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + |
| + //First sync |
|
Bernhard Bauer
2016/07/20 14:56:19
Add a space at the beginning of the comment (also
dozsa
2016/07/21 08:51:33
Done.
|
| + mSyncContentResolverDelegate.setIsSyncable(mAccount, mAuthority, 1); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mAuthority, true); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + |
| + //Set ProfileSyncService to not use passphrase |
| + overrideProfileSyncService(false); |
| + |
| + assertTrue(AndroidSyncSettings.isSyncEnabled(mContext)); |
| + assertTrue(ProfileSyncService.get().isBackendInitialized()); |
| + assertFalse(ProfileSyncService.get().isUsingSecondaryPassphrase()); |
| + } |
| + |
| + /** |
| + * Verifies that syncing users with a custom passphrase are allowed to |
| + * natively view passwords. |
| + */ |
| + @SmallTest |
| + public void testSyncingNativePasswordView() throws InterruptedException { |
| + // Turn off syncability |
| + mSyncContentResolverDelegate.setMasterSyncAutomatically(true); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + |
| + //First sync |
| + mSyncContentResolverDelegate.setIsSyncable(mAccount, mAuthority, 1); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + mSyncContentResolverDelegate.setSyncAutomatically(mAccount, mAuthority, true); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + |
| + //Set ProfileSyncService to use passphrase |
| + overrideProfileSyncService(true); |
| + |
| + assertEquals(SavePasswordsPreferences.class.getCanonicalName(), |
| + mPasswordsPref.getFragment()); |
| + assertNotNull(mMainPreferences.getActivity().getIntent()); |
| + } |
| + |
| + /** |
| + * Verifies that non-syncing users are allowed to natively view passwords. |
| + */ |
| + @SmallTest |
| + public void testNonSyncingNativePasswordView() throws InterruptedException { |
| + // Turn off syncability |
| + mSyncContentResolverDelegate.setMasterSyncAutomatically(false); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + mSyncContentResolverDelegate.setIsSyncable(mAccount, mAuthority, 0); |
| + mSyncContentResolverDelegate.waitForLastNotificationCompleted(); |
| + AndroidSyncSettings.overrideForTests(mContext, mSyncContentResolverDelegate); |
| + assertEquals(SavePasswordsPreferences.class.getCanonicalName(), |
| + mPasswordsPref.getFragment()); |
| + } |
| + |
| +} |