| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.vysper.xmpp.modules.extension.xep0045_muc.inttest; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.ServerSocket; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.vysper.mina.C2SEndpoint; |
| import org.apache.vysper.mina.TCPEndpoint; |
| import org.apache.vysper.storage.StorageProviderRegistry; |
| import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry; |
| import org.apache.vysper.xmpp.addressing.EntityImpl; |
| import org.apache.vysper.xmpp.authentication.AccountManagement; |
| import org.apache.vysper.xmpp.server.XMPPServer; |
| import org.jivesoftware.smack.ConnectionConfiguration; |
| import org.jivesoftware.smack.PacketCollector; |
| import org.jivesoftware.smack.SmackConfiguration; |
| import org.jivesoftware.smack.XMPPConnection; |
| import org.jivesoftware.smack.filter.PacketIDFilter; |
| import org.jivesoftware.smack.packet.Packet; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| /** |
| */ |
| public abstract class AbstractIntegrationTestCase extends TestCase { |
| |
| private final Logger logger = LoggerFactory.getLogger(AbstractIntegrationTestCase.class); |
| |
| protected static final String TLS_CERTIFICATE_PATH = "src/main/config/bogus_mina_tls.cert"; |
| |
| protected static final String TLS_CERTIFICATE_PASSWORD = "boguspw"; |
| |
| protected static final String SERVER_DOMAIN = "vysper.org"; |
| |
| protected static final String TEST_USERNAME1 = "test1@vysper.org"; |
| |
| protected static final String TEST_PASSWORD1 = "password"; |
| |
| protected static final String TEST_USERNAME2 = "test2@vysper.org"; |
| |
| protected static final String TEST_PASSWORD2 = "password"; |
| |
| private static final int DEFAULT_SERVER_PORT = 25222; |
| |
| protected XMPPConnection client; |
| |
| private XMPPServer server; |
| |
| protected int port; |
| |
| protected void addModules(XMPPServer server) { |
| // default, do nothing |
| } |
| |
| @Override |
| protected void setUp() throws Exception { |
| // make sure Smack times out after 5 seconds |
| SmackConfiguration.setPacketReplyTimeout(5000); |
| |
| port = findFreePort(); |
| |
| startServer(port); |
| |
| client = connectClient(port, TEST_USERNAME1, TEST_PASSWORD1); |
| } |
| |
| private void startServer(int port) throws Exception { |
| StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry(); |
| |
| AccountManagement accountManagement = (AccountManagement) providerRegistry.retrieve(AccountManagement.class); |
| accountManagement.addUser(EntityImpl.parseUnchecked(TEST_USERNAME1), TEST_PASSWORD1); |
| accountManagement.addUser(EntityImpl.parseUnchecked(TEST_USERNAME2), TEST_PASSWORD2); |
| |
| server = new XMPPServer(SERVER_DOMAIN); |
| |
| TCPEndpoint endpoint = new C2SEndpoint(); |
| endpoint.setPort(port); |
| server.addEndpoint(endpoint); |
| server.setStorageProviderRegistry(providerRegistry); |
| |
| server.setTLSCertificateInfo(new File(TLS_CERTIFICATE_PATH), TLS_CERTIFICATE_PASSWORD); |
| |
| server.start(); |
| |
| addModules(server); |
| |
| // allow for the server to bootstrap |
| Thread.sleep(200); |
| } |
| |
| protected XMPPConnection connectClient(int port, String username, String password) throws Exception { |
| ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost", port); |
| connectionConfiguration.setCompressionEnabled(false); |
| connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required); |
| connectionConfiguration.setSASLAuthenticationEnabled(true); |
| connectionConfiguration.setDebuggerEnabled(false); |
| connectionConfiguration.setKeystorePath(TLS_CERTIFICATE_PATH); |
| connectionConfiguration.setTruststorePath(TLS_CERTIFICATE_PATH); |
| connectionConfiguration.setTruststorePassword(TLS_CERTIFICATE_PASSWORD); |
| |
| XMPPConnection.DEBUG_ENABLED = true; |
| XMPPConnection client = new XMPPConnection(connectionConfiguration); |
| |
| client.connect(); |
| |
| client.login(username, password); |
| return client; |
| } |
| |
| protected Packet sendSync(XMPPConnection client, Packet request) { |
| // Create a packet collector to listen for a response. |
| PacketCollector collector = client.createPacketCollector(new PacketIDFilter(request.getPacketID())); |
| |
| client.sendPacket(request); |
| |
| // Wait up to 5 seconds for a result. |
| return collector.nextResult(5000); |
| } |
| |
| private int findFreePort() { |
| ServerSocket ss = null; |
| |
| // try using a predefined default port |
| // makes netstat -a debugging easier |
| try { |
| ss = new ServerSocket(DEFAULT_SERVER_PORT); |
| ss.setReuseAddress(true); |
| |
| // succeeded, return the default port |
| logger.info("Test is using the default test port {}", DEFAULT_SERVER_PORT); |
| return DEFAULT_SERVER_PORT; |
| } catch (IOException e) { |
| try { |
| ss = new ServerSocket(0); |
| ss.setReuseAddress(true); |
| int port = ss.getLocalPort(); |
| logger.info("Failed to use default test port ({}), using {} instead", DEFAULT_SERVER_PORT, port); |
| return port; |
| } catch (IOException ee) { |
| // we could not even open a random port so |
| // the test will probably fail, anyways |
| // return the default port |
| return DEFAULT_SERVER_PORT; |
| } |
| } finally { |
| if (ss != null) { |
| try { |
| ss.close(); |
| } catch (IOException ignored) { |
| ; |
| } |
| } |
| } |
| } |
| |
| @Override |
| protected void tearDown() throws Exception { |
| try { |
| client.disconnect(); |
| } catch (Exception ignored) { |
| ; |
| } |
| |
| try { |
| System.out.println("Test teardown, stopping server"); |
| server.stop(); |
| } catch (Exception ignored) { |
| ; |
| } |
| } |
| |
| } |