/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* 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.onebusaway.federations.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.Context;
import org.mortbay.jetty.servlet.ServletHolder;
import org.onebusaway.federations.FederatedService;
import org.onebusaway.federations.SimpleFederatedService;
import org.onebusaway.geospatial.model.CoordinateBounds;
import com.caucho.hessian.server.HessianServlet;
public class DynamicFederatedServiceCollectionImplTest {
private static final int TIMEOUT = 10000;
private static final int PORT = 9999;
private FederatedServiceRegistryImpl _registry;
private DynamicFederatedServiceCollectionImpl _collection;
private Server _server;
@Before
public void start() throws Exception {
_server = new Server(PORT);
addServiceServlet(_server, "A", new CoordinateBounds(0, 0, 10, 10));
addServiceServlet(_server, "B", new CoordinateBounds(20, 20, 30, 30));
Map<String, List<CoordinateBounds>> agenciesB = new HashMap<String, List<CoordinateBounds>>();
agenciesB.put("B", Arrays.asList(new CoordinateBounds(30, 30, 40, 40)));
_server.start();
_registry = new FederatedServiceRegistryImpl();
_collection = new DynamicFederatedServiceCollectionImpl();
_collection.setRegistry(_registry);
_collection.setUpdateFrequency(1);
_collection.setServiceInterface(SimpleFederatedService.class);
_collection.start();
}
@After
public void stop() throws Exception {
_collection.stop();
if (_server != null)
_server.stop();
}
@Test
public void test() throws Exception {
Set<FederatedService> services = _collection.getAllServices();
assertTrue(services.isEmpty());
_registry.addService("http://localhost:" + PORT + "/service-A/service",
SimpleFederatedService.class.getName(), new HashMap<String, String>());
Thread.sleep(TIMEOUT);
services = _collection.getAllServices();
assertEquals(1, services.size());
SimpleFederatedService service = (SimpleFederatedService) _collection.getServiceForAgencyId("A");
assertEquals("A", service.getValueForId(""));
_registry.addService("http://localhost:" + PORT + "/service-B/service",
SimpleFederatedService.class.getName(), new HashMap<String, String>());
Thread.sleep(TIMEOUT);
services = _collection.getAllServices();
assertEquals(2, services.size());
service = (SimpleFederatedService) _collection.getServiceForAgencyId("A");
assertEquals("A", service.getValueForId(""));
service = (SimpleFederatedService) _collection.getServiceForAgencyId("B");
assertEquals("B", service.getValueForId(""));
// Simulate a server crash
_server.stop();
_server = null;
Thread.sleep(TIMEOUT);
services = _collection.getAllServices();
assertTrue(services.isEmpty());
}
private SimpleFederatedServiceImpl addServiceServlet(Server server,
String agencyId, CoordinateBounds bounds) {
Map<String, List<CoordinateBounds>> agenciesA = new HashMap<String, List<CoordinateBounds>>();
agenciesA.put(agencyId, Arrays.asList(bounds));
SimpleFederatedServiceImpl serviceA = new SimpleFederatedServiceImpl(
agenciesA, agencyId);
HessianServlet servletA = new HessianServlet();
servletA.setHome(serviceA);
servletA.setHomeAPI(SimpleFederatedService.class);
Context contextA = new Context(server, "/service-" + agencyId,
Context.SESSIONS);
contextA.addServlet(new ServletHolder(servletA), "/*");
return serviceA;
}
}