New tests

This commit is contained in:
Sylvain Berfini 2013-06-12 15:10:13 +02:00
parent 42e4cdc671
commit 13ccc6610f
25 changed files with 1087 additions and 1291 deletions

View file

@ -1,17 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry kind="src" path="gen"/>
<classpathentry excluding="org/linphone/mediastream/MediastreamerActivity.java" kind="src" path="submodules/linphone/mediastreamer2/java/src"/> <classpathentry excluding="org/linphone/mediastream/MediastreamerActivity.java" kind="src" path="submodules/linphone/mediastreamer2/java/src"/>
<classpathentry kind="src" path="submodules/linphone/java/j2se"/> <classpathentry kind="src" path="submodules/linphone/java/j2se"/>
<classpathentry kind="src" path="submodules/linphone/java/common"/> <classpathentry kind="src" path="submodules/linphone/java/common"/>
<classpathentry kind="src" path="submodules/linphone/java/impl"/> <classpathentry kind="src" path="submodules/linphone/java/impl"/>
<classpathentry kind="src" path="submodules/externals/axmlrpc/src/main/java"/> <classpathentry kind="src" path="submodules/externals/axmlrpc/src/main/java"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="submodules/linphone/coreapi/help/java"/> <classpathentry kind="src" path="submodules/linphone/coreapi/help/java"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="lib" path="libs/android-support-v4.jar"/> <classpathentry kind="lib" path="libs/android-support-v4.jar"/>
<classpathentry exported="true" kind="lib" path="libs/gcm.jar"/> <classpathentry exported="true" kind="lib" path="libs/gcm.jar"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/> <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/> <classpathentry kind="output" path="bin/classes"/>
</classpath> </classpath>

View file

@ -71,7 +71,6 @@ import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneCoreListener; import org.linphone.core.LinphoneCoreListener;
import org.linphone.core.LinphoneFriend; import org.linphone.core.LinphoneFriend;
import org.linphone.core.LinphoneInfoMessage; import org.linphone.core.LinphoneInfoMessage;
import org.linphone.core.LinphoneLogHandler;
import org.linphone.core.LinphoneProxyConfig; import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.PayloadType; import org.linphone.core.PayloadType;
import org.linphone.mediastream.Log; import org.linphone.mediastream.Log;
@ -1723,7 +1722,6 @@ public class LinphoneManager implements LinphoneCoreListener {
@Override @Override
public void transferState(LinphoneCore lc, LinphoneCall call, public void transferState(LinphoneCore lc, LinphoneCall call,
State new_call_state) { State new_call_state) {
// TODO Auto-generated method stub
} }
@Override @Override

View file

@ -1,10 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry kind="lib" path="/home/viish/Work/linphone-android/tests/libs/robotium-solo-4.1.jar">
<attributes>
<attribute name="javadoc_location" value="jar:file:/home/viish/Work/linphone-android/tests/libs/robotium-solo-4.1-javadoc.jar!/"/>
</attributes>
</classpathentry>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="gen"/>
<classpathentry combineaccessrules="false" kind="src" path="/linphone-android-private"/> <classpathentry combineaccessrules="false" kind="src" path="/linphone-android-private"/>
<classpathentry kind="lib" path="libs/robotium-solo-4.1.jar"/>
<classpathentry kind="output" path="bin/classes"/> <classpathentry kind="output" path="bin/classes"/>
</classpath> </classpath>

View file

@ -4,16 +4,41 @@
android:versionCode="1" android:versionCode="1"
android:versionName="1.0" > android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<!-- Needed to allow Linphone to install on tablets, since android.permission.CALL_PHONE implies android.hardware.telephony is required -->
<uses-feature android:name="android.hardware.telephony" android:required="false" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.CAMERA" />
<!-- Needed to allow Linphone to install on tablets, since android.permission.CAMERA implies android.hardware.camera and android.hardware.camera.autofocus are required -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Needed to store received images if the user wants to -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- Needed to use our own Contact editor -->
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<!-- Needed to route the audio to the bluetooth headset if available -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<instrumentation <instrumentation
android:name="android.test.InstrumentationTestRunner" android:name="android.test.InstrumentationTestRunner"
android:targetPackage="org.linphone" /> android:targetPackage="org.linphone" />
<application <application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" > android:label="@string/app_name" >
<uses-library android:name="android.test.runner" /> <uses-library android:name="android.test.runner" />
</application> </application>
</manifest> </manifest>

18
tests/ant.properties Normal file
View file

@ -0,0 +1,18 @@
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' for the location of your java source folder and
# 'out.dir' for the location of your output folder.
# You can also use it define how the release builds are signed by declaring
# the following properties:
# 'key.store' for the location of your keystore and
# 'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.
tested.project.dir=../

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="account_linphone_login">wizard15</string>
<string name="account_linphone_pwd">wizard15</string>
<string name="account_linphone_domain">sip.linphone.org</string>
<string name="account_generic_login">wizard15</string>
<string name="account_generic_pwd">wizard15</string>
<string name="account_generic_domain">test.linphone.org</string>
<string name="account_create_login">wizard42</string>
<string name="account_create_pwd">wizard42</string>
<string name="account_create_email">wizard42@linphone.org</string>
<string name="account_test_calls_login">viish</string>
<string name="account_test_calls_pwd">lucifer</string>
<string name="account_test_calls_domain">sip.linphone.org</string>
<string name="chat_test_text_sent">Ping!</string>
<string name="chat_test_text_received">Pong!</string>
</resources>

View file

@ -0,0 +1,171 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager;
import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.mediastream.video.capture.hwconf.Hacks;
import org.linphone.setup.SetupActivity;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
public class AccountAssistant extends SampleTest {
@SmallTest
@MediumTest
@LargeTest
public void testAWizardDisplayedAfterInstall() {
solo.waitForActivity("SetupActivity", 3000);
solo.assertCurrentActivity("Expected Setup Activity", SetupActivity.class);
}
@SmallTest
@MediumTest
@LargeTest
public void testBLoginWithLinphoneAccount() {
solo.waitForActivity("SetupActivity", 1000);
solo.clickOnView(solo.getView(org.linphone.R.id.setup_next));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_login_linphone));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_username), iContext.getString(R.string.account_linphone_login));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password), iContext.getString(R.string.account_linphone_pwd));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_apply));
if (!Hacks.hasBuiltInEchoCanceller())
solo.waitForActivity("LinphoneActivity", 8000);
else
solo.waitForActivity("LinphoneActivity", 2000);
Assert.assertTrue(solo.searchText(iContext.getString(R.string.account_linphone_login) + "@sip.linphone.org"));
solo.sleep(3000); //Wait for registration to be done
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 1);
LinphoneProxyConfig proxyConfig = proxyConfigs[0];
Assert.assertEquals(RegistrationState.RegistrationOk, proxyConfig.getState());
//Check the wizard added sip.linphone.org custom settings
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
String stunServer = prefs.getString(aContext.getString(org.linphone.R.string.pref_stun_server_key), "");
Assert.assertEquals(stunServer, aContext.getString(org.linphone.R.string.default_stun));
String transport = prefs.getString(aContext.getString(org.linphone.R.string.pref_transport_key), aContext.getString(org.linphone.R.string.pref_transport_udp_key));
Assert.assertEquals(transport, aContext.getString(org.linphone.R.string.pref_transport_tls_key));
String proxy = prefs.getString(aContext.getString(org.linphone.R.string.pref_proxy_key), "");
Assert.assertEquals(proxy, aContext.getString(org.linphone.R.string.default_domain) + ":5223");
boolean outboundproxy = prefs.getBoolean(aContext.getString(org.linphone.R.string.pref_enable_outbound_proxy_key), false);
Assert.assertEquals(outboundproxy, true);
boolean ice = prefs.getBoolean(aContext.getString(org.linphone.R.string.pref_ice_enable_key), false);
Assert.assertEquals(ice, true);
}
@LargeTest
public void testCWizardDoesntShowWhenAccountIsConfigured() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@MediumTest
@LargeTest
public void testDLoginWithGenericAccount() {
startWizard();
solo.clickOnView(solo.getView(org.linphone.R.id.setup_next));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_login_generic));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_username), iContext.getString(R.string.account_generic_login));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password), iContext.getString(R.string.account_generic_pwd));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_domain), iContext.getString(R.string.account_generic_domain));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_apply));
if (!Hacks.hasBuiltInEchoCanceller())
solo.waitForActivity("LinphoneActivity", 8000);
else
solo.waitForActivity("LinphoneActivity", 2000);
Assert.assertTrue(solo.searchText(iContext.getString(R.string.account_generic_login) + "@" + iContext.getString(R.string.account_generic_domain)));
solo.sleep(3000); //Wait for registration to be done
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 2);
LinphoneProxyConfig proxyConfig = proxyConfigs[1];
Assert.assertEquals(RegistrationState.RegistrationOk, proxyConfig.getState());
}
@LargeTest
public void testECreateNewAccount() {
startWizard();
solo.clickOnView(solo.getView(org.linphone.R.id.setup_next));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_create_account));
TextView error = (TextView) solo.getView(org.linphone.R.id.setup_error);
ImageView createAccount = (ImageView) solo.getView(org.linphone.R.id.setup_create);
int sleepingTime = 1500;
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_username), iContext.getString(R.string.account_create_login).substring(0,2));
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), aContext.getString(org.linphone.R.string.wizard_username_incorrect));
Assert.assertFalse(createAccount.isEnabled());
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_username));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_username), iContext.getString(R.string.account_linphone_login));
solo.sleep(sleepingTime*2);
Assert.assertEquals(error.getText(), aContext.getString(org.linphone.R.string.wizard_username_unavailable));
Assert.assertFalse(createAccount.isEnabled());
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password), iContext.getString(R.string.account_create_pwd).substring(0,2));
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), aContext.getString(org.linphone.R.string.wizard_passwords_unmatched));
Assert.assertFalse(createAccount.isEnabled());
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_password));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password), iContext.getString(R.string.account_create_pwd).substring(0,2));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password_confirm), iContext.getString(R.string.account_create_pwd).substring(0,2));
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), aContext.getString(org.linphone.R.string.wizard_password_incorrect));
Assert.assertFalse(createAccount.isEnabled());
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_email), iContext.getString(R.string.account_create_email).substring(0, 12));
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), aContext.getString(org.linphone.R.string.wizard_email_incorrect));
Assert.assertFalse(createAccount.isEnabled());
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_username));
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_password));
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_password_confirm));
solo.clearEditText((EditText) solo.getView(org.linphone.R.id.setup_email));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_username), iContext.getString(R.string.account_create_login));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password), iContext.getString(R.string.account_create_pwd));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_password_confirm), iContext.getString(R.string.account_create_pwd));
solo.enterText((EditText) solo.getView(org.linphone.R.id.setup_email), iContext.getString(R.string.account_create_email));
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), "");
Assert.assertTrue(createAccount.isEnabled());
}
@LargeTest
public void testFCancelWizard() {
startWizard();
solo.clickOnView(solo.getView(org.linphone.R.id.setup_cancel));
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
private void startWizard() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(org.linphone.R.id.settings));
solo.clickOnText(aContext.getString(org.linphone.R.string.setup_title).substring(0, STRING_LENGTH_MAX));
}
}

View file

@ -0,0 +1,91 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.FragmentsAvailable;
import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager;
import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.core.LinphoneProxyConfig;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
public class AccountManagement extends SampleTest {
@MediumTest
@LargeTest
public void testAEditAccount() {
goToSettings();
solo.clickOnText(iContext.getString(R.string.account_generic_login) + "@" + iContext.getString(R.string.account_generic_domain));
solo.clickOnText(aContext.getString(org.linphone.R.string.pref_username));
solo.enterText(0, "new");
//Hack to validate the dialog
solo.sendKey(KeyEvent.KEYCODE_ENTER);
solo.sendKey(KeyEvent.KEYCODE_TAB);
solo.sendKey(KeyEvent.KEYCODE_ENTER);
//End of hack
solo.goBack();
solo.goBack();
solo.waitForFragmentByTag(FragmentsAvailable.DIALER.toString(), 2000);
solo.sleep(2000); //Wait for registration to be done
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 2);
LinphoneProxyConfig proxyConfig = proxyConfigs[1];
Assert.assertEquals(proxyConfig.getState(), RegistrationState.RegistrationOk);
Assert.assertTrue(proxyConfig.getIdentity(), proxyConfig.getIdentity().contains("new"));
}
@MediumTest
@LargeTest
public void testBDeleteAccount() {
goToSettings();
solo.clickOnText(iContext.getString(R.string.account_generic_login) + "new");
selectItemInListOnUIThread(7);
solo.clickLongOnText(aContext.getString(org.linphone.R.string.pref_delete_account));
solo.goBack();
solo.goBack();
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 1);
}
@LargeTest
public void testCDisableAccount() {
goToSettings();
solo.clickOnText(iContext.getString(R.string.account_linphone_login));
selectItemInListOnUIThread(5);
solo.clickLongOnText(aContext.getString(org.linphone.R.string.pref_disable_account));
solo.goBack();
solo.goBack();
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 0);
}
@LargeTest
public void testDEnableAccount() {
goToSettings();
solo.clickOnText(iContext.getString(R.string.account_linphone_login));
selectItemInListOnUIThread(5);
solo.clickLongOnText(aContext.getString(org.linphone.R.string.pref_disable_account));
solo.goBack();
solo.goBack();
LinphoneProxyConfig[] proxyConfigs = LinphoneManager.getLc().getProxyConfigList();
Assert.assertEquals(proxyConfigs.length, 1);
}
private void goToSettings() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(org.linphone.R.id.settings));
}
}

View file

@ -1,226 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.LinphoneActivity;
import org.linphone.R;
import org.linphone.mediastream.video.capture.hwconf.Hacks;
import org.linphone.setup.SetupActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.jayway.android.robotium.solo.Solo;
public class AccountsTest extends
ActivityInstrumentationTestCase2<LinphoneActivity> {
private Solo solo;
@SuppressWarnings("deprecation")
public AccountsTest() {
super("org.linphone", LinphoneActivity.class);
}
private void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testAConfigureExistingLinphoneAccount() {
Context context = getActivity();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
int nbAccountsBefore = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
solo.waitForActivity("SetupActivity", 2000);
solo.assertCurrentActivity("Expected Setup Activity", SetupActivity.class);
Log.testSuccess("Wizard launching at first startup");
solo.clickOnView(solo.getView(R.id.setup_next));
solo.clickOnText(context.getString(R.string.setup_login_linphone));
solo.enterText((EditText) solo.getView(R.id.setup_username), "wizard15");
solo.enterText((EditText) solo.getView(R.id.setup_password), "wizard15");
solo.clickOnText(context.getString(R.string.setup_apply));
if (!Hacks.hasBuiltInEchoCanceller())
solo.waitForActivity("LinphoneActivity", 8000);
else
solo.waitForActivity("LinphoneActivity", 2000);
Assert.assertTrue(solo.searchText("wizard15@sip.linphone.org"));
int nbAccountsAfter = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
Assert.assertEquals(nbAccountsBefore + 1, nbAccountsAfter);
Log.testSuccess("Configure existing sip.linphone.org account");
String stunServer = prefs.getString(context.getString(R.string.pref_stun_server_key), "");
Assert.assertEquals(stunServer, context.getString(R.string.default_stun));
Log.testSuccess("Default stun server is configured");
String transport = prefs.getString(context.getString(R.string.pref_transport_key), context.getString(R.string.pref_transport_udp_key));
Assert.assertEquals(transport, context.getString(R.string.pref_transport_tls_key));
Log.testSuccess("TLS is set by default");
String proxy = prefs.getString(context.getString(R.string.pref_proxy_key), "");
Assert.assertEquals(proxy, context.getString(R.string.default_domain) + ":5223");
boolean outboundproxy = prefs.getBoolean(context.getString(R.string.pref_enable_outbound_proxy_key), false);
Assert.assertEquals(outboundproxy, true);
Log.testSuccess("Outbound proxy is configured");
boolean ice = prefs.getBoolean(context.getString(R.string.pref_ice_enable_key), false);
Assert.assertEquals(ice, true);
Log.testSuccess("ICE is enabled");
}
public void testBConfigureExternalSIPAccount() {
Context context = getActivity();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
int nbAccountsBefore = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
Log.testSuccess("Wizard not launching at startup if account is configured");
solo.clickOnView(solo.getView(R.id.settings));
solo.clickOnText(context.getString(R.string.setup_title));
solo.assertCurrentActivity("Expected Setup Activity", SetupActivity.class);
solo.clickOnView(solo.getView(R.id.setup_next));
solo.clickOnText(context.getString(R.string.setup_login_generic));
solo.enterText((EditText) solo.getView(R.id.setup_username), "junit");
solo.enterText((EditText) solo.getView(R.id.setup_password), "junit");
solo.enterText((EditText) solo.getView(R.id.setup_domain), "test.linphone.org");
solo.clickOnText(context.getString(R.string.setup_apply));
solo.waitForActivity("LinphoneActivity", 2000);
Assert.assertTrue(solo.searchText("junit@test.linphone.org"));
int nbAccountsAfter = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
Assert.assertEquals(nbAccountsBefore + 1, nbAccountsAfter);
Log.testSuccess("Configure existing generic account");
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
Assert.assertTrue(solo.searchText("junit@test.linphone.org"));
solo.clickOnText("junit@test.linphone.org");
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_default_account));
solo.goBack();
int defaultAccount = prefs.getInt(context.getString(R.string.pref_default_account_key), 0);
solo.sleep(1000);
Assert.assertEquals(1, defaultAccount);
Log.testSuccess("Select another account as default");
}
public void testCDeleteConfiguredAccount() {
Context context = getActivity();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
int nbAccountsBefore = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
Assert.assertTrue(solo.searchText("wizard15@sip.linphone.org"));
solo.clickOnText("wizard15@sip.linphone.org");
selectItemInListOnUIThread(7);
solo.clickOnText(context.getString(R.string.pref_delete_account));
solo.goBack();
int nbAccountsAfter = prefs.getInt(getActivity().getString(R.string.pref_extra_accounts), 0);
Assert.assertEquals(nbAccountsBefore - 1, nbAccountsAfter);
Log.testSuccess("Deleting existing SIP account");
}
public void testDTryCreatingExistingAccount() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
solo.clickOnText(context.getString(R.string.setup_title));
solo.assertCurrentActivity("Expected Setup Activity", SetupActivity.class);
solo.clickOnView(solo.getView(R.id.setup_next));
solo.clickOnText(context.getString(R.string.setup_create_account));
TextView error = (TextView) solo.getView(R.id.setup_error);
ImageView createAccount = (ImageView) solo.getView(R.id.setup_create);
int sleepingTime = 1500;
solo.enterText((EditText) solo.getView(R.id.setup_username), "wi");
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), context.getString(R.string.wizard_username_incorrect));
Assert.assertFalse(createAccount.isEnabled());
Log.testSuccess("Username incorrect error message");
solo.clearEditText((EditText) solo.getView(R.id.setup_username));
solo.enterText((EditText) solo.getView(R.id.setup_username), "wizard15");
solo.sleep(sleepingTime*2);
Assert.assertEquals(error.getText(), context.getString(R.string.wizard_username_unavailable));
Assert.assertFalse(createAccount.isEnabled());
Log.testSuccess("Username already in use error message");
solo.enterText((EditText) solo.getView(R.id.setup_password), "wi");
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), context.getString(R.string.wizard_password_incorrect));
Assert.assertFalse(createAccount.isEnabled());
Log.testSuccess("Password incorrect error message");
solo.clearEditText((EditText) solo.getView(R.id.setup_password));
solo.enterText((EditText) solo.getView(R.id.setup_password), "wizard15");
solo.enterText((EditText) solo.getView(R.id.setup_password_confirm), "wizard14");
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), context.getString(R.string.wizard_passwords_unmatched));
Assert.assertFalse(createAccount.isEnabled());
Log.testSuccess("Passwords doesn't match error message");
solo.enterText((EditText) solo.getView(R.id.setup_email), "wizard15@lin");
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), context.getString(R.string.wizard_email_incorrect));
Assert.assertFalse(createAccount.isEnabled());
Log.testSuccess("Email incorrect error message");
solo.clearEditText((EditText) solo.getView(R.id.setup_username));
solo.clearEditText((EditText) solo.getView(R.id.setup_password));
solo.clearEditText((EditText) solo.getView(R.id.setup_password_confirm));
solo.clearEditText((EditText) solo.getView(R.id.setup_email));
solo.enterText((EditText) solo.getView(R.id.setup_username), "wizard42");
solo.enterText((EditText) solo.getView(R.id.setup_password), "wizard42");
solo.enterText((EditText) solo.getView(R.id.setup_password_confirm), "wizard42");
solo.enterText((EditText) solo.getView(R.id.setup_email), "wizard42@linphone.org");
solo.sleep(sleepingTime);
Assert.assertEquals(error.getText(), "");
Assert.assertTrue(createAccount.isEnabled());
Log.testSuccess("All wizard fields correctly filled");
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}

View file

@ -1,142 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager;
import org.linphone.R;
import org.linphone.core.LinphoneCall;
import org.linphone.setup.SetupActivity;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
public class AccountzFreephonieTest extends ActivityInstrumentationTestCase2<LinphoneActivity> {
private static final String numberToCallToTestPSTNGateway = "0482532176";
private Solo solo;
@SuppressWarnings("deprecation")
public AccountzFreephonieTest() {
super("org.linphone", LinphoneActivity.class);
}
private void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
private void configureFreephonieAccount() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_network_title));
solo.clickOnText(context.getString(R.string.pref_transport));
solo.clickOnText(context.getString(R.string.pref_transport_udp));
solo.goBack();
selectItemInListOnUIThread(0);
solo.clickOnText(context.getString(R.string.setup_title));
solo.assertCurrentActivity("Expected Setup Activity", SetupActivity.class);
solo.clickOnView(solo.getView(R.id.setup_next));
solo.clickOnText(context.getString(R.string.setup_login_generic));
solo.enterText((EditText) solo.getView(R.id.setup_username), "0953335419");
solo.enterText((EditText) solo.getView(R.id.setup_password), "jodeeeeeer");
solo.enterText((EditText) solo.getView(R.id.setup_domain), "freephonie.net");
solo.clickOnText(context.getString(R.string.setup_apply));
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
solo.clickOnText("0953335419@freephonie.net");
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_default_account));
// solo.clickOnText(context.getString(R.string.pref_proxy));
// solo.enterText(0, "sip.linphone.org");
// solo.clickOnText("OK");
// solo.clickOnText(context.getString(R.string.pref_enable_outbound_proxy));
solo.goBack();
solo.goBack();
}
private void deleteFreephonieAccount() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(0);
solo.clickOnText("junit@test.linphone.org");
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_default_account));
solo.goBack();
solo.clickOnText("0953335419@freephonie.net");
selectItemInListOnUIThread(7);
solo.clickOnText(context.getString(R.string.pref_delete_account));
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_network_title));
solo.clickOnText(context.getString(R.string.pref_transport));
solo.clickOnText(context.getString(R.string.pref_transport_tls));
solo.goBack();
solo.goBack();
}
private void goToDialerAndOutgoingCall() {
solo.clickOnView(solo.getView(R.id.dialer));
solo.clickOnView(solo.getView(R.id.Adress));
solo.enterText((EditText) solo.getView(R.id.Adress), numberToCallToTestPSTNGateway);
solo.clickOnView(solo.getView(R.id.Call));
solo.waitForActivity("InCallActivity", 2000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
solo.sleep(2000);
try {
LinphoneCall.State state = LinphoneManager.getLcIfManagerNotDestroyedOrNull().getCalls()[0].getState();
Assert.assertTrue(state == LinphoneCall.State.OutgoingEarlyMedia || state == LinphoneCall.State.OutgoingRinging || state == LinphoneCall.State.StreamsRunning);
} catch (AssertionError ae) {
} finally {
solo.clickOnView(solo.getView(R.id.hangUp));
}
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testAOutgoingCallUsingPSTNGatewayAndFreephonieNetwork() {
configureFreephonieAccount();
goToDialerAndOutgoingCall();
deleteFreephonieAccount();
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}

View file

@ -1,385 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.R;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
public class AudioAndVideoCodecsTest extends ActivityInstrumentationTestCase2<LinphoneActivity> {
private static final String sipAdressToCall = "macmini@sip.linphone.org";
private Solo solo;
@SuppressWarnings("deprecation")
public AudioAndVideoCodecsTest() {
super("org.linphone", LinphoneActivity.class);
}
private void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
private boolean getBoolean(int key) {
return getActivity().getResources().getBoolean(key);
}
private void goToAudioCodecsSettings() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(4);
solo.clickOnText(context.getString(R.string.pref_audio));
solo.sleep(500);
}
private void goToVideoCodecsSettings() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(6);
if (solo.searchText(context.getString(R.string.pref_video), 2)) // Needed in case pref_video_enable_title contains pref_video
solo.clickOnText(context.getString(R.string.pref_video), 2);
else
solo.clickOnText(context.getString(R.string.pref_video));
solo.sleep(500);
}
private void disableAllEnabledAudioCodecs() {
Context context = getActivity();
goToAudioCodecsSettings();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(context.getString(R.string.pref_codec_speex16_key), getBoolean(R.bool.pref_codec_speex16_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_speex16));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_speex8_key), getBoolean(R.bool.pref_codec_speex8_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_speex8));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_ilbc_key), getBoolean(R.bool.pref_codec_ilbc_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_ilbc));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_amr_key), getBoolean(R.bool.pref_codec_amr_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_amr));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_amrwb_key), getBoolean(R.bool.pref_codec_amrwb_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_amrwb));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_g729_key), getBoolean(R.bool.pref_codec_g729_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_g729));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_gsm_key), getBoolean(R.bool.pref_codec_gsm_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_gsm));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_g722_key), getBoolean(R.bool.pref_codec_g722_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_g722));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_silk24_key), getBoolean(R.bool.pref_codec_silk24_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_silk24));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_silk16_key), getBoolean(R.bool.pref_codec_silk16_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_silk16));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_pcmu_key), getBoolean(R.bool.pref_codec_pcmu_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_pcmu));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_codec_pcma_key), getBoolean(R.bool.pref_codec_pcma_default))) {
solo.clickOnText(context.getString(R.string.pref_codec_pcma));
solo.sleep(500);
}
}
private void disableAllEnabledVideoCodecs() {
Context context = getActivity();
goToVideoCodecsSettings();
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(context.getString(R.string.pref_video_codec_vp8_key), getBoolean(R.bool.pref_video_codec_vp8_default))) {
solo.clickOnText(context.getString(R.string.pref_video_codec_vp8_title));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_video_codec_h264_key), getBoolean(R.bool.pref_video_codec_h264_default))) {
solo.clickOnText(context.getString(R.string.pref_video_codec_h264_title));
solo.sleep(500);
}
if (prefs.getBoolean(context.getString(R.string.pref_video_codec_mpeg4_key), getBoolean(R.bool.pref_video_codec_mpeg4_default))) {
solo.clickOnText(context.getString(R.string.pref_video_codec_mpeg4_title));
solo.sleep(500);
}
}
private void goToDialerAndOutgoingCall(String codecTextToAssert) {
Context context = getActivity();
solo.clickOnView(solo.getView(R.id.dialer));
solo.clickOnView(solo.getView(R.id.Adress));
solo.enterText((EditText) solo.getView(R.id.Adress), sipAdressToCall);
solo.clickOnView(solo.getView(R.id.Call));
boolean incompatibleMediaParams = solo.waitForText(context.getString(R.string.error_incompatible_media), 1, 1500);
if (!incompatibleMediaParams) { // There is a possiblity the callee doesn't support the codec, in which case we don't have to wait for the incall view
solo.waitForActivity("InCallActivity", 1000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
solo.clickOnView(solo.getView(R.id.status));
solo.waitForText(codecTextToAssert, 1, 6000);
Assert.assertTrue(solo.searchText(codecTextToAssert, 1));
View hangUp = solo.getView(R.id.hangUp);
if (hangUp.getVisibility() == View.VISIBLE)
solo.clickOnView(hangUp);
else { // While on video, menu can hide. Click the first time to display it back, then click again to really hang up
solo.clickOnView(hangUp);
solo.sleep(1000);
solo.clickOnView(hangUp);
}
} else {
Log.testFailure("Incompatible media parameters for codec " + codecTextToAssert);
}
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
public void testADisableVideo() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(4);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (prefs.getBoolean(context.getString(R.string.pref_video_enable_key), getBoolean(R.bool.pref_video_enable_default))) {
solo.clickOnText(context.getString(R.string.pref_video_enable_title));
solo.sleep(500);
}
}
public void testBOutgoingAudioCallPCMA() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_pcma));
solo.goBack();
goToDialerAndOutgoingCall("PCMA");
solo.sleep(1000);
}
public void testCOutgoingAudioCallPCMU() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_pcmu));
solo.goBack();
goToDialerAndOutgoingCall("PCMU");
solo.sleep(1000);
}
public void testDOutgoingAudioCallSilk16() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_silk16));
solo.goBack();
goToDialerAndOutgoingCall("SILK");
solo.sleep(1000);
}
public void testEOutgoingAudioCallSilk24() {
// Silk24 no longer available
// Context context = getActivity();
// disableAllEnabledAudioCodecs();
// solo.clickOnText(context.getString(R.string.pref_codec_silk24));
// solo.goBack();
//
// goToDialerAndOutgoingCall("SILK");
// solo.sleep(1000);
}
public void testFOutgoingAudioCallG722() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_g722));
solo.goBack();
goToDialerAndOutgoingCall("G722");
solo.sleep(1000);
}
public void testGOutgoingAudioCallGSM() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_gsm));
solo.goBack();
goToDialerAndOutgoingCall("GSM");
solo.sleep(1000);
}
public void testHOutgoingAudioCallAMR() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_amr));
solo.goBack();
goToDialerAndOutgoingCall("AMR");
solo.sleep(1000);
}
public void testIOutgoingAudioCallAMRWB() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_amrwb));
solo.goBack();
goToDialerAndOutgoingCall("AMRWB");
solo.sleep(1000);
}
public void testJOutgoingAudioCallG729() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_g729));
solo.goBack();
goToDialerAndOutgoingCall("G729");
solo.sleep(1000);
}
public void testKOutgoingAudioCallILBC() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_ilbc));
solo.goBack();
goToDialerAndOutgoingCall("iLBC");
solo.sleep(1000);
}
public void testLOutgoingAudioCallSpeex8() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_speex8));
solo.goBack();
goToDialerAndOutgoingCall("speex");
solo.sleep(1000);
}
public void testMOutgoingAudioCallSpeex16() {
Context context = getActivity();
disableAllEnabledAudioCodecs();
solo.clickOnText(context.getString(R.string.pref_codec_speex16));
solo.goBack();
goToDialerAndOutgoingCall("speex");
solo.sleep(1000);
}
public void testNEnableVideo() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
solo.sleep(500);
selectItemInListOnUIThread(4);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
if (!prefs.getBoolean(context.getString(R.string.pref_video_enable_key), getBoolean(R.bool.pref_video_enable_default))) {
solo.clickOnText(context.getString(R.string.pref_video_enable_title));
solo.sleep(500);
}
}
public void testOOutgoingVideoCallVP8() {
Context context = getActivity();
disableAllEnabledVideoCodecs();
solo.clickOnText(context.getString(R.string.pref_video_codec_vp8_title));
solo.goBack();
goToDialerAndOutgoingCall("VP8");
solo.sleep(1000);
}
public void testPOutgoingVideoCallH264() {
Context context = getActivity();
disableAllEnabledVideoCodecs();
solo.clickOnText(context.getString(R.string.pref_video_codec_h264_title));
solo.goBack();
goToDialerAndOutgoingCall("H264");
solo.sleep(1000);
}
public void testQOutgoingVideoCallMPG4() {
Context context = getActivity();
disableAllEnabledVideoCodecs();
solo.clickOnText(context.getString(R.string.pref_video_codec_mpeg4_title));
solo.goBack();
goToDialerAndOutgoingCall("MP4V-ES");
solo.sleep(1000);
}
@Override
public void tearDown() throws Exception {
if (solo.getCurrentActivity().getClass() == InCallActivity.class) {
solo.clickOnView(solo.getView(R.id.hangUp));
}
solo.finishOpenedActivities();
}
}

View file

@ -0,0 +1,50 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCore.RegistrationState;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
public class Calls extends SampleTest {
@SmallTest
@MediumTest
@LargeTest
public void testAInitLinphoneCore() {
LinphoneTestManager.createAndStart(aContext, iContext);
solo.sleep(2000);
Assert.assertEquals(RegistrationState.RegistrationOk, LinphoneTestManager.getLc().getProxyConfigList()[0].getState());
}
@SmallTest
@MediumTest
@LargeTest
public void testBSimpleCall() {
solo.enterText(0, iContext.getString(R.string.account_test_calls_login) + "@" + iContext.getString(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.StreamsRunning, LinphoneTestManager.getLc().getCalls()[0].getState());
solo.clickOnView(solo.getView(org.linphone.R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 5000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@SmallTest
@MediumTest
@LargeTest
public void testZShutDownLinphoneCore() {
LinphoneTestManager.destroy();
}
}

View file

@ -0,0 +1,95 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.LinphoneActivity;
import org.linphone.core.LinphoneChatMessage;
import org.linphone.core.LinphoneChatMessage.State;
import org.linphone.core.LinphoneChatRoom;
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;
public class Chat extends SampleTest {
@SmallTest
@MediumTest
@LargeTest
public void testAInitLinphoneCore() {
LinphoneTestManager.createAndStart(aContext, iContext);
solo.sleep(2000);
Assert.assertEquals(RegistrationState.RegistrationOk, LinphoneTestManager.getLc().getProxyConfigList()[0].getState());
}
@LargeTest
public void testBEmptyChatHistory() {
goToChat();
Assert.assertTrue(solo.searchText(aContext.getString(org.linphone.R.string.no_chat_history)));
}
@SmallTest
@MediumTest
@LargeTest
public void testCSendTextMessage() {
goToChat();
solo.enterText(0, "sip:" + iContext.getString(R.string.account_test_calls_login) + "@" + iContext.getString(R.string.account_test_calls_domain));
solo.clickOnView(solo.getView(org.linphone.R.id.newDiscussion));
solo.enterText(0, iContext.getString(R.string.chat_test_text_sent));
solo.clickOnView(solo.getView(org.linphone.R.id.sendMessage));
solo.sleep(1000);
Assert.assertTrue(solo.searchText(iContext.getString(R.string.chat_test_text_sent)));
Assert.assertEquals(iContext.getString(R.string.chat_test_text_sent), LinphoneTestManager.getInstance().lastMessageReceived);
}
@LargeTest
public void testDNotEmptyChatHistory() {
goToChat();
Assert.assertFalse(solo.searchText(aContext.getString(org.linphone.R.string.no_chat_history)));
Assert.assertTrue(solo.searchText(iContext.getString(org.linphone.test.R.string.account_test_calls_login)));
}
@SmallTest
@MediumTest
@LargeTest
public void testEReceiveTextMessage() {
goToChat();
solo.clickOnText(iContext.getString(org.linphone.test.R.string.account_test_calls_login));
LinphoneChatRoom chatRoom = LinphoneTestManager.getLc().createChatRoom("sip:" + iContext.getString(R.string.account_linphone_login) + "@" + iContext.getString(R.string.account_linphone_domain));
LinphoneChatMessage msg = chatRoom.createLinphoneChatMessage(iContext.getString(R.string.chat_test_text_received));
chatRoom.sendMessage(msg, new LinphoneChatMessage.StateListener() {
@Override
public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg,
State state) {
Log.e("Chat message state = " + state.toString());
}
});
solo.sleep(1000);
Assert.assertTrue(solo.searchText(iContext.getString(R.string.chat_test_text_received)));
}
@SmallTest
@MediumTest
@LargeTest
public void testZShutDownLinphoneCore() {
LinphoneTestManager.destroy();
}
private void goToChat() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(org.linphone.R.id.chat));
}
}

View file

@ -1,138 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.LinphoneActivity;
import org.linphone.R;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
import com.jayway.android.robotium.solo.Solo;
public class ChatTest extends ActivityInstrumentationTestCase2<LinphoneActivity> {
private static final String testTextMessage = "Test";
private Solo solo;
@SuppressWarnings("deprecation")
public ChatTest() {
super("org.linphone", LinphoneActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testADisplayEmptyChatList() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.chat));
Assert.assertTrue(solo.searchText(context.getString(R.string.no_chat_history)));
Log.testSuccess("Empty chat list displayed");
}
public void testBStartConversationAndSaveItAsDraft() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.chat));
solo.enterText((EditText) solo.getView(R.id.newFastChat), "cotcot@sip.linphone.org");
solo.clickOnText(context.getString(R.string.button_new_chat));
solo.sleep(1000);
solo.enterText((EditText) solo.getView(R.id.message), testTextMessage);
solo.goBack();
solo.sleep(1000);
Assert.assertTrue(solo.searchText(context.getString(R.string.draft)));
Log.testSuccess("Conversation created and message saved as draft");
}
public void testCUseSavedDraftMessageAndSentIt() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.chat));
solo.clickOnText(context.getString(R.string.draft));
Assert.assertTrue(solo.searchText(testTextMessage));
Log.testSuccess("Draft successfully restored");
solo.clickOnText(context.getString(R.string.button_send_message));
solo.sleep(1000);
Assert.assertTrue(solo.searchText(testTextMessage));
Log.testSuccess("Chat message sent");
solo.goBack();
solo.sleep(1000);
Assert.assertTrue(solo.searchText("cotcot"));
Assert.assertFalse(solo.searchText(context.getString(R.string.draft), true));
Log.testSuccess("Conversation created but no more saved as draft");
}
public void testDDeleteMessage() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.chat));
solo.clickOnText("cotcot");
Assert.assertTrue(solo.searchText(testTextMessage));
solo.clickLongOnText(testTextMessage);
solo.sleep(1000);
solo.clickOnText(context.getString(R.string.delete));
solo.sleep(1000);
Assert.assertFalse(solo.searchText(testTextMessage));
Log.testSuccess("Chat message successfully deleted");
}
public void testEIncomingMessageAndDeleteConversation() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.chat));
solo.enterText((EditText) solo.getView(R.id.newFastChat), "junit");
solo.clickOnText(context.getString(R.string.button_new_chat));
solo.sleep(1000);
solo.enterText((EditText) solo.getView(R.id.message), testTextMessage);
solo.clickOnText(context.getString(R.string.button_send_message));
solo.sleep(1000);
Assert.assertTrue(solo.searchText(testTextMessage, 2));
Log.testSuccess("Chat message successfully received");
solo.goBack();
Assert.assertTrue(solo.searchText("junit", 2));
solo.clickOnView(solo.getView(R.id.clearFastChatField));
EditText fastChat = (EditText) solo.getView(R.id.newFastChat);
Assert.assertEquals(fastChat.getText().toString(), "");
Log.testSuccess("Fast new chat cleaned");
solo.clickOnText(context.getString(R.string.button_edit));
solo.clickOnText("junit");
solo.clickOnText(context.getString(R.string.button_ok));
solo.sleep(1000);
Assert.assertTrue(solo.searchText(context.getString(R.string.no_chat_history)));
Log.testSuccess("Conversation successfully deleted");
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}

View file

@ -0,0 +1,29 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.LinphoneActivity;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
public class History extends SampleTest {
@SmallTest
@MediumTest
@LargeTest
public void testACheckForTestCallInHistory() {
goToHistory();
Assert.assertTrue(solo.searchText(aContext.getString(org.linphone.R.string.today)));
Assert.assertTrue(solo.searchText(iContext.getString(org.linphone.test.R.string.account_test_calls_login)));
}
private void goToHistory() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(org.linphone.R.id.history));
}
}

View file

@ -1,159 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.LinphoneManager;
import org.linphone.R;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
public class HistoryTest extends ActivityInstrumentationTestCase2<LinphoneActivity> {
private Solo solo;
@SuppressWarnings("deprecation")
public HistoryTest() {
super("org.linphone", LinphoneActivity.class);
}
private void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
//Depending on previous tests, history may not be empty
LinphoneManager.getLc().clearCallLogs();
}
public void testADisplayEmptyHistory() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
Assert.assertTrue(solo.searchText(context.getString(R.string.no_call_history)));
Log.testSuccess("Empty History displayed");
}
public void testBCallToFillHistory() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(4);
solo.clickOnText(context.getString(R.string.pref_video_enable_title));
solo.clickOnView(solo.getView(R.id.dialer));
solo.clickOnView(solo.getView(R.id.Adress));
solo.enterText((EditText) solo.getView(R.id.Adress), "cotcot@sip.linphone.org");
solo.clickOnView(solo.getView(R.id.Call));
solo.waitForActivity("InCallActivity", 2000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
Log.testSuccess("Outgoing call to cotcot successfull");
solo.clickOnView(solo.getView(R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
Assert.assertTrue(solo.searchText("cotcot"));
Log.testSuccess("Cotcot entry in history");
}
public void testCDisplayEmptyMissedCallHistory() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
solo.clickOnText(context.getString(R.string.button_missed_call));
Assert.assertTrue(solo.searchText(context.getString(R.string.no_missed_call_history)));
Log.testSuccess("Empty Missed Call History displayed");
}
public void testDCallBackFromHistoryEntry() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
solo.clickOnText(context.getString(R.string.button_all_call));
solo.sleep(500);
solo.clickOnText("cotcot");
solo.waitForActivity("InCallActivity", 2000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
Log.testSuccess("Outgoing call to cotcot from history successfull");
solo.clickOnView(solo.getView(R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 2000);
}
public void testEDisplayHistoryDetails() {
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
solo.clickOnView(solo.getView(R.id.detail));
Assert.assertTrue(solo.searchText("cotcot@sip.linphone.org"));
Log.testSuccess("Displaying history entry details");
}
public void testFDeleteHistoryEntry() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
solo.clickOnText(context.getString(R.string.button_edit));
solo.sleep(1000);
solo.clickOnText("cotcot");
solo.clickOnText(context.getString(R.string.button_ok));
Assert.assertFalse(solo.searchText("cotcot", 2));
Log.testSuccess("Clean history from one cotcot entries");
}
public void testGDeleteAllHistoryEntries() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.history));
solo.clickOnText(context.getString(R.string.button_edit));
solo.sleep(2000);
solo.clickOnText(context.getString(R.string.button_delete_all));
solo.clickOnText(context.getString(R.string.button_ok));
Assert.assertTrue(solo.searchText(context.getString(R.string.no_call_history)));
Log.testSuccess("Clean history from all entries");
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}

View file

@ -0,0 +1,528 @@
package org.linphone.test;
import java.util.Timer;
import java.util.TimerTask;
import org.linphone.LinphoneException;
import org.linphone.LinphoneManager;
import org.linphone.LinphoneManager.LinphoneConfigException;
import org.linphone.LinphoneService;
import org.linphone.R;
import org.linphone.core.LinphoneAddress;
import org.linphone.core.LinphoneAuthInfo;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State;
import org.linphone.core.LinphoneCallStats;
import org.linphone.core.LinphoneChatMessage;
import org.linphone.core.LinphoneChatRoom;
import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.EcCalibratorStatus;
import org.linphone.core.LinphoneCore.FirewallPolicy;
import org.linphone.core.LinphoneCore.GlobalState;
import org.linphone.core.LinphoneCore.MediaEncryption;
import org.linphone.core.LinphoneCore.RegistrationState;
import org.linphone.core.LinphoneCore.Transports;
import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneCoreFactory;
import org.linphone.core.LinphoneCoreListener;
import org.linphone.core.LinphoneFriend;
import org.linphone.core.LinphoneInfoMessage;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.PayloadType;
import org.linphone.mediastream.Log;
import org.linphone.mediastream.Version;
import org.linphone.mediastream.video.capture.AndroidVideoApi5JniWrapper;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration.AndroidCamera;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager.NameNotFoundException;
import android.telephony.TelephonyManager;
public class LinphoneTestManager implements LinphoneCoreListener {
private static LinphoneTestManager instance;
private Context mContext, mIContext;
private LinphoneCore mLc;
private static Transports initialTransports;
public String lastMessageReceived;
private Timer mTimer = new Timer("Linphone scheduler");
private LinphoneTestManager(Context ac, Context ic) {
mContext = ac;
mIContext = ic;
}
public static LinphoneTestManager createAndStart(Context ac, Context ic) {
if (instance != null)
throw new RuntimeException("Linphone Manager is already initialized");
instance = new LinphoneTestManager(ac, ic);
instance.startLibLinphone(ac);
TelephonyManager tm = (TelephonyManager) ac.getSystemService(Context.TELEPHONY_SERVICE);
boolean gsmIdle = tm.getCallState() == TelephonyManager.CALL_STATE_IDLE;
setGsmIdle(gsmIdle);
if (Version.isVideoCapable())
AndroidVideoApi5JniWrapper.setAndroidSdkVersion(Version.sdk());
return instance;
}
private synchronized void startLibLinphone(Context c) {
try {
LinphoneCoreFactory.instance().setDebugMode(true, "LinphoneTester");
mLc = LinphoneCoreFactory.instance().createLinphoneCore(this);
mLc.getConfig().setInt("sip", "store_auth_info", 0);
mLc.setContext(c);
try {
String versionName = c.getPackageManager().getPackageInfo(c.getPackageName(), 0).versionName;
if (versionName == null) {
versionName = String.valueOf(c.getPackageManager().getPackageInfo(c.getPackageName(), 0).versionCode);
}
mLc.setUserAgent("LinphoneAndroid", versionName);
} catch (NameNotFoundException e) {
Log.e(e, "cannot get version name");
}
mLc.enableIpv6(false);
mLc.setRing(null);
int availableCores = Runtime.getRuntime().availableProcessors();
Log.w("MediaStreamer : " + availableCores + " cores detected and configured");
mLc.setCpuCount(availableCores);
try {
initFromConf();
} catch (LinphoneException e) {
Log.w("no config ready yet");
}
TimerTask lTask = new TimerTask() {
@Override
public void run() {
mLc.iterate();
}
};
mTimer.scheduleAtFixedRate(lTask, 0, 20);
IntentFilter lFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
lFilter.addAction(Intent.ACTION_SCREEN_OFF);
resetCameraFromPreferences();
}
catch (Exception e) {
Log.e(e, "Cannot start linphone");
}
}
private void resetCameraFromPreferences() {
boolean useFrontCam = true;
int camId = 0;
AndroidCamera[] cameras = AndroidCameraConfiguration.retrieveCameras();
for (AndroidCamera androidCamera : cameras) {
if (androidCamera.frontFacing == useFrontCam)
camId = androidCamera.id;
}
LinphoneManager.getLc().setVideoDevice(camId);
}
public void initFromConf() throws LinphoneConfigException {
LinphoneCoreFactory.instance().setDebugMode(true, "LinphoneTester");
if (initialTransports == null)
initialTransports = mLc.getSignalingTransportPorts();
setSignalingTransportsFromConfiguration(initialTransports);
initMediaEncryption();
mLc.setVideoPolicy(true, true);
readAndSetAudioAndVideoPorts();
String defaultIncomingCallTimeout = mContext.getString(org.linphone.R.string.pref_incoming_call_timeout_default);
int incomingCallTimeout = tryToParseIntValue(defaultIncomingCallTimeout, defaultIncomingCallTimeout);
mLc.setIncomingTimeout(incomingCallTimeout);
try {
// Configure audio codecs
// enableDisableAudioCodec("speex", 32000, 1, R.string.pref_codec_speex32_key);
enableDisableAudioCodec("speex", 32000, 1, false);
enableDisableAudioCodec("speex", 16000, 1, R.string.pref_codec_speex16_key);
enableDisableAudioCodec("speex", 8000, 1, R.string.pref_codec_speex8_key);
enableDisableAudioCodec("iLBC", 8000, 1, R.string.pref_codec_ilbc_key);
enableDisableAudioCodec("GSM", 8000, 1, R.string.pref_codec_gsm_key);
enableDisableAudioCodec("G722", 8000, 1, R.string.pref_codec_g722_key);
enableDisableAudioCodec("G729", 8000, 1, R.string.pref_codec_g729_key);
enableDisableAudioCodec("PCMU", 8000, 1, R.string.pref_codec_pcmu_key);
enableDisableAudioCodec("PCMA", 8000, 1, R.string.pref_codec_pcma_key);
enableDisableAudioCodec("AMR", 8000, 1, R.string.pref_codec_amr_key);
enableDisableAudioCodec("AMR-WB", 16000, 1, R.string.pref_codec_amrwb_key);
//enableDisableAudioCodec("SILK", 24000, 1, R.string.pref_codec_silk24_key);
enableDisableAudioCodec("SILK", 24000, 1, false);
enableDisableAudioCodec("SILK", 16000, 1, R.string.pref_codec_silk16_key);
//enableDisableAudioCodec("SILK", 12000, 1, R.string.pref_codec_silk12_key);
enableDisableAudioCodec("SILK", 12000, 1, false);
enableDisableAudioCodec("SILK", 8000, 1, R.string.pref_codec_silk8_key);
// Configure video codecs
for (PayloadType videoCodec : mLc.getVideoCodecs()) {
enableDisableVideoCodecs(videoCodec);
}
} catch (LinphoneCoreException e) {
throw new LinphoneConfigException(mContext.getString(R.string.wrong_settings),e);
}
boolean isVideoEnabled = true;
mLc.enableVideo(isVideoEnabled, isVideoEnabled);
//stun server
String lStun = mContext.getString(R.string.default_stun);
mLc.setStunServer(lStun);
if (lStun!=null && lStun.length()>0) {
mLc.setFirewallPolicy(FirewallPolicy.UseIce);
} else {
mLc.setFirewallPolicy(FirewallPolicy.NoFirewall);
}
//accounts
try {
initAccounts();
//init network state
mLc.setNetworkReachable(true);
} catch (LinphoneCoreException e) {
throw new LinphoneConfigException(mContext.getString(R.string.wrong_settings),e);
}
}
public boolean detectVideoCodec(String mime) {
for (PayloadType videoCodec : mLc.getVideoCodecs()) {
if (mime.equals(videoCodec.getMime())) return true;
}
return false;
}
public boolean detectAudioCodec(String mime){
for (PayloadType audioCodec : mLc.getAudioCodecs()) {
if (mime.equals(audioCodec.getMime())) return true;
}
return false;
}
void initMediaEncryption(){
MediaEncryption me=MediaEncryption.None;
mLc.setMediaEncryption(me);
}
public void initAccounts() throws LinphoneCoreException {
mLc.clearAuthInfos();
mLc.clearProxyConfigs();
String username = mIContext.getString(org.linphone.test.R.string.account_test_calls_login);
String password = mIContext.getString(org.linphone.test.R.string.account_test_calls_pwd);
String domain = mIContext.getString(org.linphone.test.R.string.account_test_calls_domain);
LinphoneAuthInfo lAuthInfo = LinphoneCoreFactory.instance().createAuthInfo(username, password, null);
mLc.addAuthInfo(lAuthInfo);
String identity = "sip:" + username +"@" + domain;
String proxy = "sip:" + domain;
LinphoneProxyConfig proxycon = LinphoneCoreFactory.instance().createProxyConfig(identity, proxy, null, true);
mLc.addProxyConfig(proxycon);
mLc.setDefaultProxyConfig(proxycon);
LinphoneProxyConfig lDefaultProxyConfig = mLc.getDefaultProxyConfig();
if (lDefaultProxyConfig != null) {
//escape +
lDefaultProxyConfig.setDialEscapePlus(false);
} else if (LinphoneService.isReady()) {
LinphoneService.instance().onRegistrationStateChanged(RegistrationState.RegistrationNone, null);
}
}
private void readAndSetAudioAndVideoPorts() throws NumberFormatException {
int aPortStart, aPortEnd, vPortStart, vPortEnd;
int defaultAudioPort, defaultVideoPort;
defaultAudioPort = Integer.parseInt(mContext.getString(R.string.default_audio_port));
defaultVideoPort = Integer.parseInt(mContext.getString(R.string.default_video_port));
aPortStart = aPortEnd = defaultAudioPort;
vPortStart = vPortEnd = defaultVideoPort;
String audioPort = String.valueOf(aPortStart);
String videoPort = String.valueOf(vPortStart);
if (audioPort.contains("-")) {
// Port range
aPortStart = Integer.parseInt(audioPort.split("-")[0]);
aPortEnd = Integer.parseInt(audioPort.split("-")[1]);
} else {
try {
aPortStart = aPortEnd = Integer.parseInt(audioPort);
} catch (NumberFormatException nfe) {
aPortStart = aPortEnd = defaultAudioPort;
}
}
if (videoPort.contains("-")) {
// Port range
vPortStart = Integer.parseInt(videoPort.split("-")[0]);
vPortEnd = Integer.parseInt(videoPort.split("-")[1]);
} else {
try {
vPortStart = vPortEnd = Integer.parseInt(videoPort);
} catch (NumberFormatException nfe) {
vPortStart = vPortEnd = defaultVideoPort;
}
}
if (aPortStart >= aPortEnd) {
mLc.setAudioPort(aPortStart);
} else {
mLc.setAudioPortRange(aPortStart, aPortEnd);
}
if (vPortStart >= vPortEnd) {
mLc.setVideoPort(vPortStart);
} else {
mLc.setVideoPortRange(vPortStart, vPortEnd);
}
}
private int tryToParseIntValue(String valueToParse, String defaultValue) {
return tryToParseIntValue(valueToParse, Integer.parseInt(defaultValue));
}
private int tryToParseIntValue(String valueToParse, int defaultValue) {
try {
int returned = Integer.parseInt(valueToParse);
return returned;
} catch (NumberFormatException nfe) {
}
return defaultValue;
}
public static synchronized final LinphoneTestManager getInstance() {
return instance;
}
private void setSignalingTransportsFromConfiguration(Transports t) {
Transports ports = new Transports(t);
boolean useRandomPort = true;
int lPreviousPort = 5060;
if (lPreviousPort>0xFFFF || useRandomPort) {
lPreviousPort=(int)(Math.random() * (0xFFFF - 1024)) + 1024;
Log.w("Using random port " + lPreviousPort);
}
ports.udp = 0;
ports.tls = 0;
ports.tcp = lPreviousPort;
mLc.setSignalingTransportPorts(ports);
}
public static synchronized final LinphoneCore getLc() {
return getInstance().mLc;
}
private void enableDisableAudioCodec(String codec, int rate, int channels, int key) throws LinphoneCoreException {
PayloadType pt = mLc.findPayloadType(codec, rate, channels);
if (pt !=null) {
boolean enable = true;
mLc.enablePayloadType(pt, enable);
}
}
private void enableDisableAudioCodec(String codec, int rate, int channels, boolean enable) throws LinphoneCoreException {
PayloadType pt = mLc.findPayloadType(codec, rate, channels);
if (pt !=null) {
mLc.enablePayloadType(pt, enable);
}
}
private void enableDisableVideoCodecs(PayloadType videoCodec) throws LinphoneCoreException {
boolean enable = true;
mLc.enablePayloadType(videoCodec, enable);
}
private int savedMaxCallWhileGsmIncall;
private synchronized void preventSIPCalls() {
if (savedMaxCallWhileGsmIncall != 0) {
Log.w("SIP calls are already blocked due to GSM call running");
return;
}
savedMaxCallWhileGsmIncall = mLc.getMaxCalls();
mLc.setMaxCalls(0);
}
private synchronized void allowSIPCalls() {
if (savedMaxCallWhileGsmIncall == 0) {
Log.w("SIP calls are already allowed as no GSM call knowned to be running");
return;
}
mLc.setMaxCalls(savedMaxCallWhileGsmIncall);
savedMaxCallWhileGsmIncall = 0;
}
public static void setGsmIdle(boolean gsmIdle) {
LinphoneTestManager mThis = instance;
if (mThis == null) return;
if (gsmIdle) {
mThis.allowSIPCalls();
} else {
mThis.preventSIPCalls();
}
}
private void doDestroy() {
try {
mTimer.cancel();
mLc.destroy();
}
catch (RuntimeException e) {
e.printStackTrace();
}
finally {
mLc = null;
instance = null;
}
}
public static synchronized void destroy() {
if (instance == null) return;
instance.doDestroy();
}
@Override
public void authInfoRequested(LinphoneCore lc, String realm, String username) {
// TODO Auto-generated method stub
}
@Override
public void globalState(LinphoneCore lc, GlobalState state, String message) {
// TODO Auto-generated method stub
}
@Override
public void callState(LinphoneCore lc, LinphoneCall call, State cstate,
String message) {
// TODO Auto-generated method stub
Log.e("Call state = " + cstate.toString());
if (cstate == LinphoneCall.State.IncomingReceived) {
try {
mLc.acceptCall(call);
} catch (LinphoneCoreException e) {
e.printStackTrace();
}
}
}
@Override
public void callStatsUpdated(LinphoneCore lc, LinphoneCall call,
LinphoneCallStats stats) {
// TODO Auto-generated method stub
}
@Override
public void callEncryptionChanged(LinphoneCore lc, LinphoneCall call,
boolean encrypted, String authenticationToken) {
// TODO Auto-generated method stub
}
@Override
public void registrationState(LinphoneCore lc, LinphoneProxyConfig cfg,
RegistrationState cstate, String smessage) {
// TODO Auto-generated method stub
Log.e("Registration state = " + cstate.toString());
}
@Override
public void newSubscriptionRequest(LinphoneCore lc, LinphoneFriend lf,
String url) {
// TODO Auto-generated method stub
}
@Override
public void notifyPresenceReceived(LinphoneCore lc, LinphoneFriend lf) {
// TODO Auto-generated method stub
}
@Override
public void textReceived(LinphoneCore lc, LinphoneChatRoom cr,
LinphoneAddress from, String message) {
// TODO Auto-generated method stub
}
@Override
public void messageReceived(LinphoneCore lc, LinphoneChatRoom cr,
LinphoneChatMessage message) {
// TODO Auto-generated method stub
Log.e("Message received = " + message.getText());
lastMessageReceived = message.getText();
}
@Override
public void dtmfReceived(LinphoneCore lc, LinphoneCall call, int dtmf) {
// TODO Auto-generated method stub
}
@Override
public void ecCalibrationStatus(LinphoneCore lc, EcCalibratorStatus status,
int delay_ms, Object data) {
// TODO Auto-generated method stub
}
@Override
public void notifyReceived(LinphoneCore lc, LinphoneCall call,
LinphoneAddress from, byte[] event) {
// TODO Auto-generated method stub
}
@Override
public void show(LinphoneCore lc) {
// TODO Auto-generated method stub
}
@Override
public void displayStatus(LinphoneCore lc, String message) {
// TODO Auto-generated method stub
}
@Override
public void displayMessage(LinphoneCore lc, String message) {
// TODO Auto-generated method stub
}
@Override
public void displayWarning(LinphoneCore lc, String message) {
// TODO Auto-generated method stub
}
@Override
public void transferState(LinphoneCore lc, LinphoneCall call,
State new_call_state) {
// TODO Auto-generated method stub
}
@Override
public void infoReceived(LinphoneCore lc, LinphoneCall call,
LinphoneInfoMessage info) {
// TODO Auto-generated method stub
}
}

View file

@ -1,11 +0,0 @@
package org.linphone.test;
public class Log {
public static void testSuccess(String testName) {
android.util.Log.wtf("TEST SUCCESS", testName);
}
public static void testFailure(String testName) {
android.util.Log.wtf("TEST FAILURE", testName);
}
}

View file

@ -1,101 +0,0 @@
package org.linphone.test;
import java.util.ArrayList;
import java.util.List;
import junit.framework.Assert;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.linphone.LinphoneActivity;
import org.linphone.R;
import org.linphone.mediastream.Log;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.test.ActivityInstrumentationTestCase2;
import com.jayway.android.robotium.solo.Solo;
public class PushNotificationTest extends
ActivityInstrumentationTestCase2<LinphoneActivity> {
private Solo solo;
@SuppressWarnings("deprecation")
public PushNotificationTest() {
super("org.linphone", LinphoneActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
private HttpClient createHttpClient()
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(conMgr, params);
}
public void testIncomingPushNotification() {
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
String regId = prefs.getString(getActivity().getString(R.string.push_reg_id_key), null);
// Send a push notification
// To do the same from a terminal use: curl --header "Authorization: key=AIzaSyBJAhCVeeqIErwTfYwy-t83_EwvZlCFo9I" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send -d "{\"registration_ids\":[\"DEVICE_REG_ID\"]}"
HttpClient httpClient = createHttpClient();
HttpPost httpPost = new HttpPost("https://android.googleapis.com/gcm/send");
httpPost.setHeader("Content-type", "application/x-www-form-urlencoded;charset=UTF-8");
httpPost.setHeader("Authorization", "key=AIzaSyBJAhCVeeqIErwTfYwy-t83_EwvZlCFo9I"); // Test API
// httpPost.setHeader("Authorization", "key=AIzaSyDbCO1_KgFhkig_aaTutxx0jEHIib0i8C0");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("data.test", "TEST"));
nameValuePairs.add(new BasicNameValuePair("registration_id", regId));
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
String result = httpClient.execute(httpPost, new BasicResponseHandler());
Log.d("TEST Http POST result: " + result);
} catch (Exception e) {
e.printStackTrace();
new junit.framework.TestFailure(this, e.getCause());
}
// Can be true if a previous notification worked and log hasn't been cleared since...
Assert.assertTrue(solo.waitForLogMessage("Push notification received", 3000));
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}

View file

@ -0,0 +1,45 @@
package org.linphone.test;
import org.linphone.LinphoneLauncherActivity;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
public abstract class SampleTest extends ActivityInstrumentationTestCase2<LinphoneLauncherActivity>{
protected final int STRING_LENGTH_MAX = 20;
protected Solo solo;
protected Context aContext, iContext;
public SampleTest() {
super(LinphoneLauncherActivity.class);
}
@Override
public void setUp() throws Exception {
solo = new Solo(getInstrumentation());
aContext = getActivity();
iContext = getInstrumentation().getContext();
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
protected void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
}

View file

@ -1,120 +0,0 @@
package org.linphone.test;
import junit.framework.Assert;
import org.linphone.InCallActivity;
import org.linphone.LinphoneActivity;
import org.linphone.R;
import android.content.Context;
import android.test.ActivityInstrumentationTestCase2;
import android.widget.EditText;
import android.widget.ListView;
import com.jayway.android.robotium.solo.Solo;
public class SignalingTest extends ActivityInstrumentationTestCase2<LinphoneActivity> {
private static final String sipAdressToCall = "macmini@sip.linphone.org";
private Solo solo;
@SuppressWarnings("deprecation")
public SignalingTest() {
super("org.linphone", LinphoneActivity.class);
}
private void selectItemInListOnUIThread(final int item) {
solo.sleep(500);
getActivity().runOnUiThread(new Runnable() {
public void run() {
ListView list = (ListView) solo.getView(android.R.id.list);
list.setSelection(item);
}
});
}
private void goToNetworkSettings() {
Context context = getActivity();
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
solo.clickOnView(solo.getView(R.id.settings));
selectItemInListOnUIThread(6);
solo.clickOnText(context.getString(R.string.pref_network_title));
solo.sleep(500);
}
private void goToDialerAndOutgoingCall() {
solo.clickOnView(solo.getView(R.id.dialer));
solo.clickOnView(solo.getView(R.id.Adress));
solo.enterText((EditText) solo.getView(R.id.Adress), sipAdressToCall);
solo.clickOnView(solo.getView(R.id.Call));
solo.waitForActivity("InCallActivity", 2000);
solo.assertCurrentActivity("Expected InCall Activity", InCallActivity.class);
solo.waitForText("03", 1, 5000);
solo.clickOnView(solo.getView(R.id.hangUp));
solo.waitForActivity("LinphoneActivity", 2000);
solo.assertCurrentActivity("Expected Linphone Activity", LinphoneActivity.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
solo = new Solo(getInstrumentation(), getActivity());
}
public void testARegistrationUDP() {
Context context = getActivity();
goToNetworkSettings();
solo.clickOnText(context.getString(R.string.pref_transport));
solo.clickOnText(context.getString(R.string.pref_transport_udp));
solo.goBack();
solo.goBack();
Assert.assertTrue(solo.searchText(context.getString(R.string.status_connected, 2000)));
}
public void testBOutgoingCallUDP() {
goToDialerAndOutgoingCall();
}
public void testCRegistrationTCP() {
Context context = getActivity();
goToNetworkSettings();
solo.clickOnText(context.getString(R.string.pref_transport));
solo.clickOnText(context.getString(R.string.pref_transport_tcp));
solo.goBack();
solo.goBack();
Assert.assertTrue(solo.searchText(context.getString(R.string.status_connected, 2000)));
}
public void testDOutgoingCallTCP() {
goToDialerAndOutgoingCall();
}
public void testERegistrationTLS() {
Context context = getActivity();
goToNetworkSettings();
solo.clickOnText(context.getString(R.string.pref_transport));
solo.clickOnText(context.getString(R.string.pref_transport_tls));
solo.goBack();
solo.goBack();
Assert.assertTrue(solo.searchText(context.getString(R.string.status_connected, 2000)));
}
public void testFOutgoingCallTLS() {
goToDialerAndOutgoingCall();
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
}
}