196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/*
296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * you may not use this file except in compliance with the License.
696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * You may obtain a copy of the License at
796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project *
1096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * See the License for the specific language governing permissions and
1496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * limitations under the License.
1596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
1696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
1796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectpackage com.android.email.activity.setup;
1896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedyimport android.content.Context;
2096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.content.Intent;
2196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.ActivityInstrumentationTestCase2;
2296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.UiThreadTest;
2396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.test.suitebuilder.annotation.MediumTest;
2496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.EditText;
2596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
26515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.email.R;
27515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.email.activity.setup.AccountSetupOutgoing;
28515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.email.activity.setup.AccountSetupOutgoingFragment;
29515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.email.activity.setup.SetupData;
30515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.emailcommon.provider.Account;
31515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xieimport com.android.emailcommon.provider.HostAuth;
32515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xie
33fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadlerimport java.net.URISyntaxException;
34fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
3696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Tests of the basic UI logic in the Account Setup Outgoing (SMTP) screen.
37e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank * You can run this entire test case with:
38e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank *   runtest -c com.android.email.activity.setup.AccountSetupOutgoingTests email
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
4096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project@MediumTest
41040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedypublic class AccountSetupOutgoingTests extends
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        ActivityInstrumentationTestCase2<AccountSetupOutgoing> {
4396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private AccountSetupOutgoing mActivity;
45fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    private AccountSetupOutgoingFragment mFragment;
4696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mServerView;
47fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    private EditText mPasswordView;
48040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public AccountSetupOutgoingTests() {
5083457b0235b8a13e2d885d5b7550784ad470bb9cMakoto Onuki        super(AccountSetupOutgoing.class);
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Common setup code for all tests.  Sets up a default launch intent, which some tests
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * will use (others will override).
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void setUp() throws Exception {
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.setUp();
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // This sets up a default URI which can be used by any of the test methods below.
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Individual test methods can replace this with a custom URI if they wish
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // (except those that run on the UI thread - for them, it's too late to change it.)
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user:password@server.com:999");
6596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
6696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
67040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
6896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
6996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test processing with a complete, good URI -> good fields
7096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testGoodUri() {
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
734c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertTrue(mActivity.mNextButtonEnabled);
7496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
75040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No user is not OK - not enabled
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
79040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testBadUriNoUser()
80040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://:password@server.com:999");
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
8396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
844c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertFalse(mActivity.mNextButtonEnabled);
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
86040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
8896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No password is not OK - not enabled
8996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
90040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testBadUriNoPassword()
91040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
9296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user@server.com:999");
9396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
9496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
954c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertFalse(mActivity.mNextButtonEnabled);
9696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
97040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
9896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No port is OK - still enabled
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
101040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testGoodUriNoPort()
102040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
10396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user:password@server.com");
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
1064c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertTrue(mActivity.mNextButtonEnabled);
10796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
108040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
10996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test for non-standard but OK server names
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @UiThreadTest
11396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testGoodServerVariants() {
11496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
1154c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertTrue(mActivity.mNextButtonEnabled);
116040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("  server.com  ");
1184c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertTrue(mActivity.mNextButtonEnabled);
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
120040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test for non-empty but non-OK server names
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @UiThreadTest
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testBadServerVariants() {
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
1274c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertTrue(mActivity.mNextButtonEnabled);
128040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("  ");
1304c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertFalse(mActivity.mNextButtonEnabled);
131040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
13296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("serv$er.com");
1334c3a8ede019f8683a7d15defd995790c4b5ebdacAndrew Stadler        assertFalse(mActivity.mNextButtonEnabled);
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
135fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
136fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /**
137fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * Test to confirm that passwords with leading or trailing spaces are accepted verbatim.
138fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     */
139fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    @UiThreadTest
140fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    public void testPasswordNoTrim() throws URISyntaxException {
141fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        getActivityAndFields();
142fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
143fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        // Clear the password - should disable
144fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword(null, false);
145fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
146fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        // Various combinations of spaces should be OK
147fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword(" leading", true);
148fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword("trailing ", true);
14989b8fdca1841efd832e05cee877ab3eaf3780aaeJerry Xie// TODO: need to fix this part of the test
15089b8fdca1841efd832e05cee877ab3eaf3780aaeJerry Xie//        checkPassword("em bedded", true);
15189b8fdca1841efd832e05cee877ab3eaf3780aaeJerry Xie//        checkPassword(" ", true);
152fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    }
153fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
154fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /**
155fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * Check password field for a given password.  Should be called in UI thread.  Confirms that
156fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * the password has not been trimmed.
157fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     *
158fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * @param password the password to test with
159fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * @param expectNext true if expected that this password will enable the "next" button
160fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     */
161fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    private void checkPassword(String password, boolean expectNext) throws URISyntaxException {
162fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        mPasswordView.setText(password);
163fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        if (expectNext) {
164fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler            assertTrue(mActivity.mNextButtonEnabled);
165fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        } else {
166fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler            assertFalse(mActivity.mNextButtonEnabled);
167fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        }
168fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    }
169fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
17096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
17196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO:  A series of tests to explore the logic around security models & ports
17296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
173040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
17496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
17596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Get the activity (which causes it to be started, using our intent) and get the UI fields
17696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
17796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void getActivityAndFields() {
17896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mActivity = getActivity();
179fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        mFragment = mActivity.mFragment;
18096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView = (EditText) mActivity.findViewById(R.id.account_server);
181515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xie        mPasswordView = (EditText) mActivity.findViewById(R.id.account_server);
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
183040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
18596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Create an intent with the Account in it
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
187040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private Intent getTestIntent(String senderUriString)
188040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
189f5418f1f93b02e7fab9f15eb201800b65510998eMarc Blank        Account account = new Account();
190040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        Context context = getInstrumentation().getTargetContext();
191040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy        HostAuth auth = account.getOrCreateHostAuthSend(context);
192313586c8eb4e23ceec068b82f3dc0be1c8a7045fBen Komalo        HostAuth.setHostAuthFromString(auth, senderUriString);
193515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xie        // TODO: we need to do something with this SetupData, add it as an extra in the intent?
194515d830e8755d3674e04bcc60d7f85b4fa7fb202Jerry Xie        SetupData setupData = new SetupData(SetupData.FLOW_MODE_NORMAL, account);
195e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank        return new Intent(Intent.ACTION_MAIN);
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
19896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
199