From 6a86690a2ad8f6c5068d901e6cbc368598e13ddc Mon Sep 17 00:00:00 2001 From: Andrew Lee Date: Mon, 8 Jun 2015 18:16:42 -0700 Subject: Fix some more unit tests... + Pull out voicemail playback tests into their own test class. + Fix CallDetailActivity unit tests. + Some minor tweaks to functional code to facilitate. Bug: 21471763 Change-Id: I0f1747ab7ad6eba7dd2a7f6f8cfd060b409771bc --- .../com/android/dialer/CallDetailActivityTest.java | 173 ++-------------- .../dialer/voicemail/VoicemailPlaybackTest.java | 219 +++++++++++++++++++++ 2 files changed, 233 insertions(+), 159 deletions(-) create mode 100644 tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java (limited to 'tests/src/com/android/dialer') diff --git a/tests/src/com/android/dialer/CallDetailActivityTest.java b/tests/src/com/android/dialer/CallDetailActivityTest.java index 97b1b0989..3b6b61141 100644 --- a/tests/src/com/android/dialer/CallDetailActivityTest.java +++ b/tests/src/com/android/dialer/CallDetailActivityTest.java @@ -17,13 +17,11 @@ package com.android.dialer; import static com.android.dialer.calllog.CallLogAsyncTaskUtil.Tasks.GET_CALL_DETAILS; -import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; import android.content.Intent; -import android.content.res.AssetManager; import android.net.Uri; import android.provider.CallLog; import android.provider.VoicemailContract; @@ -36,31 +34,19 @@ import android.widget.TextView; import com.android.dialer.calllog.CallLogAsyncTaskUtil; import com.android.dialer.util.AsyncTaskExecutors; import com.android.dialer.util.FakeAsyncTaskExecutor; -import com.android.contacts.common.test.IntegrationTestUtils; -import com.android.dialer.util.LocaleTestUtils; import com.android.internal.view.menu.ContextMenuBuilder; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.List; -import java.util.Locale; - /** * Unit tests for the {@link CallDetailActivity}. NOTE: The screen needs to be on for the * UI-related tests to pass. */ @LargeTest public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 { - private static final String TEST_ASSET_NAME = "quick_test_recording.mp3"; - private static final String MIME_TYPE = "audio/mp3"; private static final String CONTACT_NUMBER = "+1412555555"; private static final String VOICEMAIL_FILE_LOCATION = "/sdcard/sadlfj893w4j23o9sfu.mp3"; private Uri mCallLogUri; private Uri mVoicemailUri; - private IntegrationTestUtils mTestUtils; - private LocaleTestUtils mLocaleTestUtils; private FakeAsyncTaskExecutor mFakeAsyncTaskExecutor; private CallDetailActivity mActivityUnderTest; @@ -71,89 +57,23 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 - * The repro steps for this crash were to open a voicemail that does not have an attachment, - * then click the play button (which just reported an error), then after that try to adjust the - * rate. See http://b/5047879. - */ - public void testClickIncreaseRateButtonWithInvalidVoicemailDoesNotCrash() throws Throwable { - setActivityIntentForTestVoicemailEntry(); - startActivityUnderTest(); - mTestUtils.clickButton(mActivityUnderTest, R.id.playback_start_stop); + super.tearDown(); } /** Test for bug where missing Extras on intent used to start Activity causes NPE. */ @@ -170,35 +90,32 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 0) { - out.write(buffer, 0, bytesRead); - } - } - private void cleanUpUri() { if (mVoicemailUri != null) { getContentResolver().delete(VoicemailContract.Voicemails.CONTENT_URI, @@ -272,41 +159,9 @@ public class CallDetailActivityTest extends ActivityInstrumentationTestCase2 views = mTestUtils.getTextViewsWithString(mActivityUnderTest, text); - assertEquals("There should have been one TextView with text '" + text + "' but found " - + views, 1, views.size()); - return views.get(0); - } - - private void assertHasOneTextViewContaining(String text1, String text2) throws Throwable { - assertNotNull(mActivityUnderTest); - List view1s = mTestUtils.getTextViewsWithString(mActivityUnderTest, text1); - List view2s = mTestUtils.getTextViewsWithString(mActivityUnderTest, text2); - assertEquals("There should have been one TextView with text '" + text1 + "' or text '" - + text2 + "' but found " + view1s + view2s, 1, view1s.size() + view2s.size()); - } - - private void assertZeroTextViewsContaining(String text) throws Throwable { - assertNotNull(mActivityUnderTest); - List views = mTestUtils.getTextViewsWithString(mActivityUnderTest, text); - assertEquals("There should have been no TextViews with text '" + text + "' but found " - + views, 0, views.size()); - } - private void startActivityUnderTest() throws Throwable { assertNull(mActivityUnderTest); mActivityUnderTest = getActivity(); assertNotNull("activity should not be null", mActivityUnderTest); - // We have to run all tasks, not just one. - // This is because it seems that we can have onResume, onPause, onResume during the course - // of a single unit test. - mFakeAsyncTaskExecutor.runAllTasks(GET_CALL_DETAILS); - CallLogAsyncTaskUtil.resetForTest(); - } - - private AssetManager getAssets() { - return getInstrumentation().getContext().getAssets(); } } diff --git a/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java b/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java new file mode 100644 index 000000000..dd86b0d6f --- /dev/null +++ b/tests/src/com/android/dialer/voicemail/VoicemailPlaybackTest.java @@ -0,0 +1,219 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.dialer.voicemail; + +import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.content.res.AssetManager; +import android.net.Uri; +import android.provider.VoicemailContract; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.LargeTest; +import android.view.View; +import android.widget.TextView; + +import com.android.contacts.common.test.IntegrationTestUtils; +import com.android.dialer.R; +import com.android.dialer.util.AsyncTaskExecutors; +import com.android.dialer.util.FakeAsyncTaskExecutor; +import com.android.dialer.util.LocaleTestUtils; +import com.android.dialer.voicemail.VoicemailPlaybackLayout; +import com.android.dialer.voicemail.VoicemailPlaybackPresenter; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.List; +import java.util.Locale; + +/** + * Unit tests for the {@link VoicemailPlaybackPresenter} and {@link VoicemailPlaybackLayout}. + */ +@LargeTest +public class VoicemailPlaybackTest extends InstrumentationTestCase { + private static final String TEST_ASSET_NAME = "quick_test_recording.mp3"; + private static final String MIME_TYPE = "audio/mp3"; + private static final String CONTACT_NUMBER = "+1412555555"; + private static final String VOICEMAIL_FILE_LOCATION = "/sdcard/sadlfj893w4j23o9sfu.mp3"; + + private Context mContext; + private VoicemailPlaybackPresenter mPresenter; + private VoicemailPlaybackLayout mLayout; + + private Uri mVoicemailUri; + private IntegrationTestUtils mTestUtils; + private LocaleTestUtils mLocaleTestUtils; + private FakeAsyncTaskExecutor mFakeAsyncTaskExecutor; + + @Override + public void setUp() throws Exception { + super.setUp(); + + mFakeAsyncTaskExecutor = new FakeAsyncTaskExecutor(getInstrumentation()); + AsyncTaskExecutors.setFactoryForTest(mFakeAsyncTaskExecutor.getFactory()); + mTestUtils = new IntegrationTestUtils(getInstrumentation()); + + // Some of the tests rely on the text - safest to force a specific locale. + mLocaleTestUtils = new LocaleTestUtils(getInstrumentation().getTargetContext()); + mLocaleTestUtils.setLocale(Locale.US); + + mContext = getInstrumentation().getTargetContext(); + mLayout = new VoicemailPlaybackLayout(mContext); + mLayout.onFinishInflate(); + mPresenter = new VoicemailPlaybackPresenter(mContext, null); + } + + @Override + protected void tearDown() throws Exception { + cleanUpVoicemailUri(); + + mLocaleTestUtils.restoreLocale(); + mLocaleTestUtils = null; + + mLayout = null; + mPresenter = null; + mTestUtils = null; + AsyncTaskExecutors.setFactoryForTest(null); + + super.tearDown(); + } + + public void testFetchingVoicemail() throws Throwable { + setUriForRealFileVoicemailEntry(); + setPlaybackViewForPresenter(); + assertHasOneTextViewContaining("Loading voicemail"); + } + + public void testWhenCheckForContentCompletes() throws Throwable { + setUriForRealFileVoicemailEntry(); + setPlaybackViewForPresenter(); + + // There is a background check that is testing to see if we have the content available. + // Once that task completes, we shouldn't be showing the fetching message. + mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT); + + assertHasOneTextViewContaining("Buffering"); + assertHasZeroTextViewsContaining("Loading voicemail"); + } + + public void testInvalidVoicemailShowsErrorMessage() throws Throwable { + setUriForInvalidVoicemailEntry(); + setPlaybackViewForPresenter(); + + mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT); + + // The media player will have thrown an IOException since the file doesn't exist. + // This should have put a failed to play message on screen, buffering is gone. + assertHasOneTextViewContaining("Couldn't play voicemail"); + assertHasZeroTextViewsContaining("Buffering"); + } + + public void testClickingSpeakerphoneButton() throws Throwable { + setUriForRealFileVoicemailEntry(); + setPlaybackViewForPresenter(); + + // Wait for check for content to complete. + mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT); + getInstrumentation().waitForIdleSync(); + + // Force the speakerphone to false to start. + mPresenter.setSpeakerphoneOn(false); + assertFalse(mPresenter.isSpeakerphoneOn()); + + View speakerphoneButton = mLayout.findViewById(R.id.playback_speakerphone); + speakerphoneButton.performClick(); + assertTrue(mPresenter.isSpeakerphoneOn()); + } + + private void cleanUpVoicemailUri() { + if (mVoicemailUri != null) { + getContentResolver().delete(VoicemailContract.Voicemails.CONTENT_URI, + "_ID = ?", new String[] { String.valueOf(ContentUris.parseId(mVoicemailUri)) }); + mVoicemailUri = null; + } + } + + private void setUriForRealFileVoicemailEntry() throws IOException { + assertNull(mVoicemailUri); + ContentValues values = new ContentValues(); + values.put(VoicemailContract.Voicemails.DATE, String.valueOf(System.currentTimeMillis())); + values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER); + values.put(VoicemailContract.Voicemails.MIME_TYPE, MIME_TYPE); + values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1); + String packageName = getInstrumentation().getTargetContext().getPackageName(); + mVoicemailUri = getContentResolver().insert( + VoicemailContract.Voicemails.buildSourceUri(packageName), values); + AssetManager assets = getAssets(); + try (InputStream inputStream = assets.open(TEST_ASSET_NAME); + OutputStream outputStream = getContentResolver().openOutputStream(mVoicemailUri)) { + copyBetweenStreams(inputStream, outputStream); + } + } + + private void setUriForInvalidVoicemailEntry() { + assertNull(mVoicemailUri); + ContentResolver contentResolver = getContentResolver(); + ContentValues values = new ContentValues(); + values.put(VoicemailContract.Voicemails.NUMBER, CONTACT_NUMBER); + values.put(VoicemailContract.Voicemails.HAS_CONTENT, 1); + values.put(VoicemailContract.Voicemails._DATA, VOICEMAIL_FILE_LOCATION); + mVoicemailUri = contentResolver.insert(VoicemailContract.Voicemails.CONTENT_URI, values); + } + + private void setPlaybackViewForPresenter() { + getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + mPresenter.setPlaybackView(mLayout, mVoicemailUri, false); + } + }); + } + + public void copyBetweenStreams(InputStream in, OutputStream out) throws IOException { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = in.read(buffer)) > 0) { + out.write(buffer, 0, bytesRead); + } + } + + private void assertHasOneTextViewContaining(String text) throws Throwable { + assertNotNull(mLayout); + List views = mTestUtils.getTextViewsWithString(mLayout, text); + assertEquals("There should have been one TextView with text '" + text + "' but found " + + views, 1, views.size()); + } + + private void assertHasZeroTextViewsContaining(String text) throws Throwable { + assertNotNull(mLayout); + List views = mTestUtils.getTextViewsWithString(mLayout, text); + assertEquals("There should have been no TextViews with text '" + text + "' but found " + + views, 0, views.size()); + } + + private ContentResolver getContentResolver() { + return getInstrumentation().getTargetContext().getContentResolver(); + } + + private AssetManager getAssets() { + return getInstrumentation().getContext().getAssets(); + } +} -- cgit v1.2.3