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;
24452744474af7b33d54b5c37f8a09370532ae5315Tony Mantlerimport android.view.View;
25951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantlerimport android.widget.CheckBox;
2696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Projectimport android.widget.EditText;
2796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
2817d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xieimport com.android.email.R;
2917d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xieimport com.android.emailcommon.provider.Account;
3017d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xieimport com.android.emailcommon.provider.HostAuth;
3117d3a29c9d8f7a27c463239f190bdcc4e0804527Jerry Xie
32fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadlerimport java.net.URISyntaxException;
33fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
3496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project/**
3596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project * Tests of the basic UI logic in the Account Setup Outgoing (SMTP) screen.
36e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank * You can run this entire test case with:
37e6cc662abc0b5fffe223cda5e980b4f05a4e91ddMarc Blank *   runtest -c com.android.email.activity.setup.AccountSetupOutgoingTests email
3896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project */
3996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project@MediumTest
40040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedypublic class AccountSetupOutgoingTests extends
4176472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        ActivityInstrumentationTestCase2<AccountSetupFinal> {
4296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
4376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    private AccountSetupFinal mActivity;
4496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private EditText mServerView;
4510c7412555ce7f1499cf2834f35e95adf4769de3Martin Hibdon    private AuthenticationView mAuthenticationView;
46040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
4796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public AccountSetupOutgoingTests() {
4876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        super(AccountSetupFinal.class);
4996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
5096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
5296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Common setup code for all tests.  Sets up a default launch intent, which some tests
5396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * will use (others will override).
5496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
5596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @Override
5696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    protected void setUp() throws Exception {
5796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        super.setUp();
5896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
5996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // This sets up a default URI which can be used by any of the test methods below.
6096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // Individual test methods can replace this with a custom URI if they wish
6196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        // (except those that run on the UI thread - for them, it's too late to change it.)
6296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user:password@server.com:999");
6396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
6496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
65040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
6676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    private boolean isNextButtonEnabled() {
67452744474af7b33d54b5c37f8a09370532ae5315Tony Mantler        final View nextButton = mActivity.findViewById(R.id.next);
68452744474af7b33d54b5c37f8a09370532ae5315Tony Mantler        return nextButton.isEnabled();
6976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    }
7076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler
7196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
7296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test processing with a complete, good URI -> good fields
7396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
74951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler    @UiThreadTest
7596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testGoodUri() {
7696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
7776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertTrue(isNextButtonEnabled());
7896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
79040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
8096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
8196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No user is not OK - not enabled
8296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
83040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testBadUriNoUser()
84951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler            throws Throwable {
8596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://:password@server.com:999");
8696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
8796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
88951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler        runTestOnUiThread(new Runnable() {
89951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler            @Override
90951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler            public void run() {
91951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler                final CheckBox requireLoginView = (CheckBox)
92951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler                        mActivity.findViewById(R.id.account_require_login);
93951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler                requireLoginView.setChecked(true);
94951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler            }
95951eb080f98e86d50cb549ee52fb72d8f07196c3Tony Mantler        });
9676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertFalse(isNextButtonEnabled());
9796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
98040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
9996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
10096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No password is not OK - not enabled
10196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
102040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testBadUriNoPassword()
103040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
10496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user@server.com:999");
10596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
10696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
10776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertFalse(isNextButtonEnabled());
10896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
109040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
11096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
11196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * No port is OK - still enabled
11296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
113040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    public void testGoodUriNoPort()
114040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
11596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        Intent i = getTestIntent("smtp://user:password@server.com");
11696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        setActivityIntent(i);
11796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
11876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertTrue(isNextButtonEnabled());
11996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
120040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
12196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
12296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test for non-standard but OK server names
12396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
12496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @UiThreadTest
12596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testGoodServerVariants() {
12696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
12776472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertTrue(isNextButtonEnabled());
128040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
12996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("  server.com  ");
13076472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertTrue(isNextButtonEnabled());
13196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
132040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
13396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
13496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Test for non-empty but non-OK server names
13596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
13696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    @UiThreadTest
13796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    public void testBadServerVariants() {
13896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        getActivityAndFields();
13976472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertTrue(isNextButtonEnabled());
140040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
14196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("  ");
14276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertFalse(isNextButtonEnabled());
143040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
14496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView.setText("serv$er.com");
14576472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        assertFalse(isNextButtonEnabled());
14696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
147fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
148fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /**
149fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * Test to confirm that passwords with leading or trailing spaces are accepted verbatim.
150fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     */
151fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    @UiThreadTest
15276472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler    public void brokentestPasswordNoTrim() throws URISyntaxException {
153fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        getActivityAndFields();
154fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
155fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        // Clear the password - should disable
156fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword(null, false);
157fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
158fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        // Various combinations of spaces should be OK
159fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword(" leading", true);
160fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        checkPassword("trailing ", true);
1617037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie// TODO: need to fix this part of the test
1627037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie//        checkPassword("em bedded", true);
1637037a0bd3d8e925a9115f475f5c0d05ddae2eeeeJerry Xie//        checkPassword(" ", true);
164fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    }
165fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
166fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    /**
167fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * Check password field for a given password.  Should be called in UI thread.  Confirms that
168fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * the password has not been trimmed.
169fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     *
170fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * @param password the password to test with
171fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     * @param expectNext true if expected that this password will enable the "next" button
172fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler     */
173fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    private void checkPassword(String password, boolean expectNext) throws URISyntaxException {
17410c7412555ce7f1499cf2834f35e95adf4769de3Martin Hibdon        mAuthenticationView.setPassword(password);
175fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        if (expectNext) {
17676472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            assertTrue(isNextButtonEnabled());
177fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        } else {
17876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler            assertFalse(isNextButtonEnabled());
179fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler        }
180fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler    }
181fb4333b3a5051b08d3a255000bb1b8331e2a1d43Andrew Stadler
18296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
18396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * TODO:  A series of tests to explore the logic around security models & ports
18496c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
185040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
18696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
18796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Get the activity (which causes it to be started, using our intent) and get the UI fields
18896c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
18996c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    private void getActivityAndFields() {
19096c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mActivity = getActivity();
19196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project        mServerView = (EditText) mActivity.findViewById(R.id.account_server);
192c5685ba600f25e663da6c2612040e668db81ec49Tony Mantler        mAuthenticationView = (AuthenticationView) mActivity.findViewById(R.id.authentication_view);
19396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
194040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy
19596c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    /**
19696c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     * Create an intent with the Account in it
19796c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project     */
198040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy    private Intent getTestIntent(String senderUriString)
199040ddf60cfef4aaecf4bfe1f897fce3248d777a4Todd Kennedy            throws URISyntaxException {
2009c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final Account account = new Account();
2019c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final Context context = getInstrumentation().getTargetContext();
2029c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final HostAuth auth = account.getOrCreateHostAuthSend(context);
20376472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        auth.setHostAuthFromString(senderUriString);
2049c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        final SetupDataFragment setupDataFragment =
20506415a635f5f01d8e1620b29f44d68dc4dfdf435Tony Mantler                new SetupDataFragment();
20606415a635f5f01d8e1620b29f44d68dc4dfdf435Tony Mantler        setupDataFragment.setFlowMode(SetupDataFragment.FLOW_MODE_NORMAL);
20706415a635f5f01d8e1620b29f44d68dc4dfdf435Tony Mantler        setupDataFragment.setAccount(account);
20876472ae40cd55d17edb0420e8fc2a7bae60c50deTony Mantler        final Intent i = new Intent(AccountSetupFinal.ACTION_JUMP_TO_OUTGOING);
2099c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
2109c8c471f971f9c8e40002503a0799ce56c5bfd76Tony Mantler        return i;
21196c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project    }
21296c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project
21396c5af40d639d629267794f4f0338a267ff94ce5The Android Open Source Project}
214