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