/*
* Copyright (C) 2005-2008 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.openfire.sip.tester.stack;
import org.jivesoftware.openfire.sip.tester.comm.CommunicationsListener;
import org.jivesoftware.openfire.sip.tester.comm.CommunicationsException;
import org.jivesoftware.openfire.sip.tester.Log;
import org.jivesoftware.openfire.sip.sipaccount.SipAccount;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
/**
* Title: SIP Register Tester
*
* @author Thiago Rocha Camargo (thiago@jivesoftware.com)
*/
public class SIPTest implements CommunicationsListener {
private SipAccount sipAccount;
//private InetAddress localAddress;
private Result result = null;
private SipManager sipManager = null;
private List<TestListener> listeners = new ArrayList<TestListener>();
public enum Result {
Successfully, WrongUser, WrongPass, NetworkError, Trying, Timeout, Forbidden, WrongAuthUser
}
;
public SIPTest(InetAddress localAddress, SipAccount sipAccount) {
this.sipAccount = sipAccount;
//this.localAddress = localAddress;
sipManager = new SipManager(localAddress);
}
public Result getResult() {
return result;
}
private void setResult(Result result) {
if (!result.equals(this.result)) fireResultChanged(this.result, result);
this.result = result;
}
public void test(int timeout) {
test(timeout, 1);
}
public void test(int timeout, int tries) {
for (int i = 0; i < tries && (getResult() == null || Result.Timeout.equals(getResult())); i++) {
if (sipManager.isStarted()) try {
sipManager.stop();
} catch (CommunicationsException e) {
e.printStackTrace();
}
setResult(Result.Trying);
SIPConfig.setRegistrarAddress(sipAccount.getServer());
SIPConfig.setAuthenticationRealm(sipAccount.getServer());
SIPConfig.setDefaultDomain(sipAccount.getServer());
try {
sipManager.start();
sipManager.addCommunicationsListener(this);
try {
sipManager.startRegisterProcess(sipAccount.getSipUsername(), sipAccount.getAuthUsername(), sipAccount.getPassword());
} catch (CommunicationsException e) {
setResult(Result.NetworkError);
Log.error(e.getMessage(), e);
}
try {
Thread.sleep(timeout);
} catch (InterruptedException e) {
Log.error(e.getMessage(), e);
}
if (getResult().equals(Result.Trying)) setResult(Result.Timeout);
} catch (CommunicationsException e) {
setResult(Result.NetworkError);
Log.error(e.getMessage(), e);
} finally {
try {
sipManager.stop();
} catch (CommunicationsException e) {
Log.error(e.getMessage(), e);
}
}
}
}
public void fireResultChanged(Result old, Result current) {
for (TestListener listener : listeners)
listener.resultChanged(old, current);
}
public void addListener(TestListener listener) {
listeners.add(listener);
}
public void removeListener(TestListener listener) {
listeners.remove(listener);
}
public void registered(RegistrationEvent evt) {
setResult(Result.Successfully);
try {
sipManager.unregister();
} catch (CommunicationsException e) {
Log.error(e.getMessage(), e);
}
}
public void registering(RegistrationEvent evt) {
}
public void registrationFailed(RegistrationEvent evt) {
if (evt.getType().equals(RegistrationEvent.Type.NotFound))
setResult(Result.WrongUser);
else if (evt.getType().equals(RegistrationEvent.Type.WrongPass))
setResult(Result.WrongPass);
else if (evt.getType().equals(RegistrationEvent.Type.Forbidden))
setResult(Result.Forbidden);
else if (evt.getType().equals(RegistrationEvent.Type.WrongAuthUser))
setResult(Result.WrongAuthUser);
}
public void unregistering(RegistrationEvent evt) {
}
public void unregistered(RegistrationEvent evt) {
try {
sipManager.stop();
Log.debug("Stopped");
} catch (CommunicationsException e) {
Log.error(e.getMessage(), e);
}
}
public static void main(String args[]) {
try {
InetAddress localAddress = InetAddress.getLocalHost();
SipAccount sipAccount = new SipAccount("", "", "", "", "", "", "", false);
SIPTest sipTest = new SIPTest(localAddress, sipAccount);
sipTest.test(3000, 2);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}