linphone-android/tests/src/org/linphone/test/CallsVideo.java
2014-12-02 15:34:41 +01:00

580 lines
19 KiB
Java

package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.IncomingCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphonePlayer;
import org.linphone.core.PayloadType;
import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.mediastream.Log;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.DisplayMetrics;
import android.view.View;
/**
* @author Sylvain Berfini
*/
public class CallsVideo extends SampleTest {
@SmallTest
@MediumTest
@LargeTest
public void testAInit() {
//Enable video
goToSettings();
selectItemInListOnUIThread(3);
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_enable_title));
solo.sleep(500);
// enable auto accept and auto share video
goToVideoCodecsSettings();
solo.sleep(500);
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_initiate_call_with_video_title));
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_automatically_accept_video_title));
solo.sleep(500);
solo.goBack();
solo.goBack();
solo.sleep(1000);
Assert.assertTrue(LinphoneManager.getLc().isVideoEnabled());
Assert.assertTrue(LinphoneManager.getLc().getVideoAutoAcceptPolicy());
Assert.assertTrue(LinphoneManager.getLc().getVideoAutoInitiatePolicy());
}
@SmallTest
@MediumTest
@LargeTest
public void testBOutgoingCallWithDefaultConfig() {
LinphoneTestManager.getInstance().declineCall = false; // Just in case
LinphoneTestManager.getLc().enableVideo(true, true);
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
assertCallIsRunningWithVideo();
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testCDTMFRFC2833InPCMUCall() {
disableAllEnabledAudioCodecs();
solo.clickOnText("PCMU");
goBackToDialerAfterCodecChanges();
solo.sleep(1000);
LinphoneManager.getLc().setUseRfc2833ForDtmfs(true);
LinphoneManager.getLc().setUseSipInfoForDtmfs(false);
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
solo.clickOnView(solo.getView(org.linphone.R.id.dialer));
solo.clickOnView(solo.getView(org.linphone.R.id.Digit3));
solo.clickOnView(solo.getView(org.linphone.R.id.dialer));
solo.sleep(1000);
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
//To enable when issue http://git.linphone.org/mantis/view.php?id=750 will be fixed
//Assert.assertTrue(LinphoneTestManager.getInstance().isDTMFReceived);
LinphoneTestManager.getInstance().isDTMFReceived = false;
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testDDTMFSIPINFO() {
LinphoneManager.getLc().setUseRfc2833ForDtmfs(false);
LinphoneManager.getLc().setUseSipInfoForDtmfs(true);
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
solo.clickOnView(solo.getView(org.linphone.R.id.dialer));
solo.clickOnView(solo.getView(org.linphone.R.id.Digit3));
solo.clickOnView(solo.getView(org.linphone.R.id.dialer));
solo.sleep(1000);
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
//To enable when issue http://git.linphone.org/mantis/view.php?id=751 will be fixed
//Assert.assertTrue(LinphoneTestManager.getInstance().isDTMFReceived);
LinphoneTestManager.getInstance().isDTMFReceived = false;
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testEOutgoingCallToAudioClient() {
LinphoneTestManager.getLc().enableVideo(false, false);
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testFOutgoingCallToVideoClient() {
LinphoneTestManager.getLc().enableVideo(true, true);
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
assertCallIsRunningWithVideo();
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testGOutgoingCallCancelled() {
LinphoneTestManager.getInstance().autoAnswer = false;
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
solo.waitForActivity("InCallActivity", 5000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
solo.sleep(2000);
Assert.assertEquals(LinphoneCall.State.OutgoingRinging, LinphoneManager.getLc().getCalls()[0].getState());
LinphoneTestManager.getInstance().autoAnswer = true;
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testHOutgoingCallDeclined() {
LinphoneTestManager.getInstance().autoAnswer = true; // Just in case
LinphoneTestManager.getInstance().declineCall = true;
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
solo.sleep(1500);
Assert.assertTrue(solo.searchText(aContext.getString(org.linphone.R.string.error_call_declined)));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
LinphoneTestManager.getInstance().declineCall = false;
}
@LargeTest
public void testIIncomingAudioCall() {
LinphoneTestManager.getInstance().declineCall = false; // Just in case
LinphoneTestManager.getLc().enableVideo(false, false);
solo.sleep(2000);
try {
LinphoneTestManager.getLc().invite("sip:" + iContext.getString(org.linphone.test.R.string.account_linphone_login) + "@" + iContext.getString(org.linphone.test.R.string.account_linphone_domain));
} catch (LinphoneCoreException e) {
e.printStackTrace();
}
solo.waitForActivity("IncomingCallActivity", 5000);
solo.assertCurrentActivity("Expected Incoming Call Activity", IncomingCallActivity.class);
solo.sleep(1000);
View topLayout = solo.getView(org.linphone.R.id.topLayout);
int topLayoutHeigh = topLayout.getMeasuredHeight();
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
int topOffset = dm.heightPixels - topLayoutHeigh;
int slidersTop = topLayoutHeigh - 80 - topOffset; // 80 is the bottom margin set in incoming.xml
solo.drag(10, topLayout.getMeasuredWidth() - 10, slidersTop, slidersTop, 10);
assertCallIsCorrectlyRunning();
}
@SmallTest
@MediumTest
@LargeTest
public void testJIncomingVideoCall() {
LinphoneTestManager.getLc().enableVideo(true, true);
solo.sleep(2000);
try {
LinphoneTestManager.getLc().invite("sip:" + iContext.getString(org.linphone.test.R.string.account_linphone_login) + "@" + iContext.getString(org.linphone.test.R.string.account_linphone_domain));
} catch (LinphoneCoreException e) {
e.printStackTrace();
}
solo.waitForActivity("IncomingCallActivity", 5000);
solo.assertCurrentActivity("Expected Incoming Call Activity", IncomingCallActivity.class);
solo.sleep(1000);
View topLayout = solo.getView(org.linphone.R.id.topLayout);
int topLayoutHeigh = topLayout.getMeasuredHeight();
DisplayMetrics dm = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
int topOffset = dm.heightPixels - topLayoutHeigh;
int slidersTop = topLayoutHeigh - 80 - topOffset; // 80 is the bottom margin set in incoming.xml
solo.drag(10, topLayout.getMeasuredWidth() - 10, slidersTop, slidersTop, 10);
assertCallIsCorrectlyRunning();
assertCallIsRunningWithVideo();
}
// @SmallTest
// @MediumTest
// @LargeTest
// public void testJIncommingCallWithCallPlayer() throws InterruptedException {
// testJIncomingVideoCall();
// Thread.sleep(2000);
// callPlayerTest();
// }
//TODO: Test each video codec
@MediumTest
@LargeTest
public void testKSelfPauseResumeCall() {
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
solo.clickOnView(solo.getView(org.linphone.R.id.pause));
solo.sleep(1000);
LinphoneCall.State state = LinphoneManager.getLc().getCalls()[0].getState();
Assert.assertTrue(LinphoneCall.State.Paused == state || LinphoneCall.State.Pausing == state);
solo.clickOnView(solo.getView(org.linphone.R.id.pause));
solo.sleep(1000);
state = LinphoneManager.getLc().getCalls()[0].getState();
Assert.assertTrue(LinphoneCall.State.Resuming == state || LinphoneCall.State.StreamsRunning == state);
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testLRemotePauseResumeCall() {
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
LinphoneTestManager.getLc().pauseAllCalls();
solo.sleep(1000);
Assert.assertEquals(LinphoneCall.State.PausedByRemote, LinphoneManager.getLc().getCalls()[0].getState());
LinphoneTestManager.getLc().resumeCall(LinphoneTestManager.getLc().getCalls()[0]);
solo.sleep(1000);
LinphoneCall.State state = LinphoneManager.getLc().getCalls()[0].getState();
Assert.assertTrue(LinphoneCall.State.Resuming == state || LinphoneCall.State.StreamsRunning == state);
solo.clickLongOnScreen(200, 200); //To ensure controls are shown
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testMSwitchOffVideoInCall() {
solo.enterText(0, iContext.getString(org.linphone.test.R.string.account_test_calls_login) + "@" + iContext.getString(org.linphone.test.R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.Call));
assertCallIsCorrectlyRunning();
assertCallIsRunningWithVideo();
Assert.assertTrue(solo.getView(org.linphone.R.id.video).isEnabled());
solo.clickOnView(solo.getView(org.linphone.R.id.video));
solo.sleep(1000);
Assert.assertFalse(LinphoneManager.getLc().getCurrentCall().getCurrentParamsCopy().getVideoEnabled());
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
private void assertCallIsRunningWithVideo() {
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
Assert.assertTrue(call.getCurrentParamsCopy().getVideoEnabled());
}
private void assertCallIsCorrectlyRunning() {
solo.waitForActivity("InCallActivity", 5000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
solo.sleep(2000);
LinphoneCall call = LinphoneManager.getLc().getCalls()[0];
int retry = 0;
while ((call.getState() == LinphoneCall.State.OutgoingProgress || call.getState() == LinphoneCall.State.IncomingReceived) && retry < 5) {
solo.sleep(1000);
retry++;
Log.w("Call in progress but not running, retry = " + retry);
}
Assert.assertEquals(LinphoneCall.State.StreamsRunning, call.getState());
}
private void goToSettings() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(org.linphone.R.id.settings));
}
private void goToAudioCodecsSettings() {
goToSettings();
selectItemInListOnUIThread(4);
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_audio));
solo.sleep(500);
}
private void goToVideoCodecsSettings() {
goToSettings();
selectItemInListOnUIThread(6);
if (solo.searchText(aContext.getString(org.linphone.R.string.pref_video), 2)) // Needed in case pref_video_enable_title contains pref_video
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video), 2);
else
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video));
solo.sleep(500);
}
private boolean isAudioCodecEnabled(String mime, int rate) {
LinphoneCore lc = LinphoneTestManager.getLc();
for (final PayloadType pt : lc.getAudioCodecs()) {
if (pt.getMime().equals(mime) && pt.getRate() == rate)
return lc.isPayloadTypeEnabled(pt);
}
return false;
}
private void disableAllEnabledAudioCodecs() {
goToAudioCodecsSettings();
if (isAudioCodecEnabled("opus", 48000)) {
solo.clickOnText("opus");
solo.sleep(500);
}
if (isAudioCodecEnabled("speex", 16000)) {
solo.clickOnText("speex");
solo.sleep(500);
}
if (isAudioCodecEnabled("speex", 8000)) {
solo.clickOnText("speex", 1);
solo.sleep(500);
}
if (isAudioCodecEnabled("iLBC", 8000)) {
solo.clickOnText("iLBC");
solo.sleep(500);
}
if (isAudioCodecEnabled("AMR", 8000)) {
solo.clickOnText("AMR");
solo.sleep(500);
}
if (isAudioCodecEnabled("AMRWB", 8000)) {
solo.clickOnText("AMRWB");
solo.sleep(500);
}
if (isAudioCodecEnabled("G729", 8000)) {
solo.clickOnText("G729");
solo.sleep(500);
}
if (isAudioCodecEnabled("GSM", 8000)) {
solo.clickOnText("GSM");
solo.sleep(500);
}
if (isAudioCodecEnabled("G722", 8000)) {
solo.clickOnText("G722");
solo.sleep(500);
}
if (isAudioCodecEnabled("SILK", 24000)) {
solo.clickOnText("SILK");
solo.sleep(500);
}
if (isAudioCodecEnabled("SILK", 16000)) {
solo.clickOnText("SILK", 1);
solo.sleep(500);
}
if (isAudioCodecEnabled("SILK", 8000)) {
solo.clickOnText("SILK", 2);
solo.sleep(500);
}
if (isAudioCodecEnabled("PCMU", 8000)) {
solo.clickOnText("PCMU");
solo.sleep(500);
}
if (isAudioCodecEnabled("PCMA", 8000)) {
solo.clickOnText("PCMA");
solo.sleep(500);
}
}
private boolean isVideoCodecEnabled(String mime) {
LinphoneCore lc = LinphoneTestManager.getLc();
for (final PayloadType pt : lc.getVideoCodecs()) {
if (pt.getMime().equals(mime))
return lc.isPayloadTypeEnabled(pt);
}
return false;
}
private void disableAllEnabledVideoCodecs() {
goToVideoCodecsSettings();
if (isVideoCodecEnabled("VP8")) {
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_vp8_title));
solo.sleep(500);
}
if (isVideoCodecEnabled("H264")) {
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_h264_title));
solo.sleep(500);
}
if (isVideoCodecEnabled("MP4V-ES")) {
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_mpeg4_title));
solo.sleep(500);
}
}
// private void forceH264Codec() {
// goToVideoCodecsSettings();
//
// if (isVideoCodecEnabled("VP8")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_vp8_title));
// solo.sleep(500);
// }
//
// if (!isVideoCodecEnabled("H264")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_h264_title));
// solo.sleep(500);
// }
//
// if (isVideoCodecEnabled("MP4V-ES")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_mpeg4_title));
// solo.sleep(500);
// }
// }
// private void enableAllDisabledVideoCodecs() {
// goToVideoCodecsSettings();
//
// if (!isVideoCodecEnabled("VP8")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_vp8_title));
// solo.sleep(500);
// }
//
// if (!isVideoCodecEnabled("H264")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_h264_title));
// solo.sleep(500);
// }
//
// if (!isVideoCodecEnabled("MP4V-ES")) {
// solo.clickOnText(aContext.getString(org.linphone.R.string.pref_video_codec_mpeg4_title));
// solo.sleep(500);
// }
// }
private void goBackToDialerAfterCodecChanges()
{
solo.goBack();
solo.goBack();
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
// private void callPlayerTest() throws InterruptedException {
// LinphoneCall call = LinphoneTestManager.getLc().getCurrentCall();
// Assert.assertNotNull(call);
// if(call == null) return;
// LinphonePlayer player = call.getPlayer();
// Assert.assertNotNull(player);
// if(player == null) return;
// EofListenerImpl eof = new EofListenerImpl();
// int openResult = player.open("/storage/sdcard0/Movies/test.mkv", eof);
// Assert.assertEquals(openResult, 0);
// if(openResult == 0) {
// Assert.assertEquals(player.start(), 0);
// try {
// Assert.assertTrue(eof.waitForEof(20000));
// } catch (InterruptedException e) {
// throw e;
// } finally {
// player.close();
// }
// }
// }
//
// private class EofListenerImpl implements LinphonePlayer.Listener {
// private boolean mEof = false;
//
// @Override
// public void endOfFile(LinphonePlayer player) {
// mEof = true;
// }
//
// public boolean waitForEof(int timeout) throws InterruptedException {
// final int refreshTime = 100;
// int time = 0;
// while(time < timeout && !mEof) {
// Thread.sleep(refreshTime);
// time += refreshTime;
// }
// return time < timeout;
// }
// }
}