package pl.radical.open.gg; import static pl.radical.open.gg.AlljGGapiTest.loginContext1; import static pl.radical.open.gg.AlljGGapiTest.loginContext2; import static pl.radical.open.gg.AlljGGapiTest.session1; import static pl.radical.open.gg.AlljGGapiTest.session2; import pl.radical.open.gg.event.ConnectionListener; import pl.radical.open.gg.event.LoginFailedEvent; import pl.radical.open.gg.event.LoginListener; import java.util.Random; import java.util.concurrent.CountDownLatch; import org.junit.Ignore; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author <a href="mailto:lukasz.rzanek@radical.com.pl>Łukasz Rżanek</a> */ public class ConnectionTest { private static final Logger LOG = LoggerFactory.getLogger(ConnectionTest.class); static final CountDownLatch CONNECT_LATCH = new CountDownLatch(2); static final CountDownLatch COMMUNICATION_LATCH = new CountDownLatch(2); @Test @Ignore public final void badConnectionTest() { final int uin = new Random().nextInt(15000000) + 5000000; final LoginContext loginContextBad = new LoginContext(uin, "pass"); final ConnectUser cu = new ConnectUser(loginContextBad); final Thread badConnectT = new Thread(cu); badConnectT.run(); final Thread badLoginT = new Thread(new LoginUser(cu.getSession(), loginContextBad)); badLoginT.run(); } @Test(timeout = 1000 * 30) public final void connectionTest() throws InterruptedException { LOG.info("Executing connectionTest() method"); ConnectUser cu; cu = new ConnectUser(loginContext1); final Thread t1 = new Thread(cu); t1.run(); session1 = cu.getSession(); Thread.sleep(1000); cu = new ConnectUser(loginContext2); final Thread t2 = new Thread(cu); t2.run(); session2 = cu.getSession(); } private class ConnectUser implements Runnable { private ISession session; private final LoginContext loginContext; public ConnectUser(final LoginContext loginContext) { this.loginContext = loginContext; } @Override public void run() { try { session = SessionFactory.createSession(); session.getConnectionService().addConnectionListener(new ConnectionListener.Stub() { @Override public void connectionEstablished() throws GGException { LOG.info("Connection established for user [{}].", loginContext.getUin()); CONNECT_LATCH.countDown(); super.connectionEstablished(); } @Override public void connectionClosed() throws GGException { LOG.info("Connection closed for user [{}].", loginContext.getUin()); super.connectionClosed(); } @Override public void connectionError(final Exception ex) throws GGException { LOG.error("Connection error", ex); super.connectionError(ex); } }); final IConnectionService connectionService = session.getConnectionService(); final IServer[] server = connectionService.lookupServer(loginContext.getUin()); LOG.info("Connecting user: {}", loginContext.getUin()); connectionService.connect(server); } catch (final GGException e) { LOG.error("Connection failed", e); } } public ISession getSession() { return session; } } @Test(timeout = 1000 * 30) public final void loginTest() throws GGException, InterruptedException { LOG.info("Executing loginTest() method"); final Thread t1 = new Thread(new LoginUser(session1, loginContext1)); t1.run(); final Thread t2 = new Thread(new LoginUser(session2, loginContext2)); t2.run(); } private class LoginUser implements Runnable { private ILoginService loginService; private final LoginContext loginContext; private final ISession session; public LoginUser(final ISession session, final LoginContext loginContext) { this.session = session; this.loginContext = loginContext; } @Override public void run() { try { CONNECT_LATCH.await(); loginService = session.getLoginService(); loginService.addLoginListener(new LoginListener.Stub() { @Override public void loginOK() throws GGException { LOG.info("Login for user {} OK", loginContext.getUin()); COMMUNICATION_LATCH.countDown(); } @Override public void loginFailed(final LoginFailedEvent loginFailedEvent) { LOG.error("Login failed!"); System.exit(15); } }); LOG.debug("Loging in user: {}", loginContext.getUin()); loginService.login(loginContext); } catch (final Exception e) { LOG.error("Cannot login the user", e); } } } }