/* * 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.felix.http.whiteboard.internal.manager; import static org.mockito.Mockito.when; import java.util.Dictionary; import javax.servlet.Filter; import javax.servlet.Servlet; import junit.framework.TestCase; import org.apache.commons.collections.BidiMap; import org.apache.commons.collections.bidimap.DualHashBidiMap; import org.apache.felix.http.api.ExtHttpService; import org.apache.felix.http.whiteboard.HttpWhiteboardConstants; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.osgi.framework.Bundle; import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; import org.osgi.service.http.HttpContext; @RunWith(MockitoJUnitRunner.class) public class ExtenderManagerTest { private static final String SAMPLE_CONTEXT_ID = "some.context.id"; private static final long BUNDLE_1_ID = 1L; private static final long BUNDLE_2_ID = 2L; private static final String SERVLET_1_ALIAS = "/servet1"; private static final String SERVLET_1_1_ALIAS = "/servet1_1"; private static final String SERVLET_2_ALIAS = "/servet2"; private MockExtHttpService httpService; @Mock private HttpContext sampleContext; @Mock private Bundle bundle1; @Mock private Bundle bundle2; @Mock private ExtServlet servlet1; @Mock private ExtServlet servlet1_1; @Mock private ExtServlet servlet2; @Mock private ExtFilter filter1; @Mock private ExtFilter filter1_1; @Mock private ExtFilter filter2; @Mock private ServiceReference servlet1Reference; @Mock private ServiceReference servlet1_1Reference; @Mock private ServiceReference servlet2Reference; @Mock private ServiceReference filter1Reference; @Mock private ServiceReference filter1_1Reference; @Mock private ServiceReference filter2Reference; @Mock private ServiceReference filterAndServletReference; @Mock private ServiceReference httpContextReference; @Before public void setup() { when(bundle1.getBundleId()).thenReturn(BUNDLE_1_ID); when(bundle2.getBundleId()).thenReturn(BUNDLE_2_ID); when(httpContextReference.getBundle()).thenReturn(bundle1); when(servlet1Reference.getBundle()).thenReturn(bundle1); when(servlet1Reference.getPropertyKeys()).thenReturn(new String[0]); when(servlet1Reference.getProperty(HttpWhiteboardConstants.ALIAS)).thenReturn(SERVLET_1_ALIAS); when(servlet1Reference.getProperty(Constants.SERVICE_ID)).thenReturn(1L); when(servlet1_1Reference.getBundle()).thenReturn(bundle1); when(servlet1_1Reference.getPropertyKeys()).thenReturn(new String[0]); when(servlet1_1Reference.getProperty(HttpWhiteboardConstants.ALIAS)).thenReturn(SERVLET_1_1_ALIAS); when(servlet1_1Reference.getProperty(Constants.SERVICE_ID)).thenReturn(2L); when(servlet2Reference.getBundle()).thenReturn(bundle2); when(servlet2Reference.getPropertyKeys()).thenReturn(new String[0]); when(servlet2Reference.getProperty(HttpWhiteboardConstants.ALIAS)).thenReturn(SERVLET_2_ALIAS); when(servlet2Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(servlet2Reference.getProperty(Constants.SERVICE_ID)).thenReturn(3L); when(filter1Reference.getBundle()).thenReturn(bundle1); when(filter1Reference.getPropertyKeys()).thenReturn(new String[0]); when(filter1Reference.getProperty(HttpWhiteboardConstants.PATTERN)).thenReturn(SERVLET_1_ALIAS); when(filter1Reference.getProperty(Constants.SERVICE_ID)).thenReturn(4L); when(filter1_1Reference.getBundle()).thenReturn(bundle1); when(filter1_1Reference.getPropertyKeys()).thenReturn(new String[0]); when(filter1_1Reference.getProperty(HttpWhiteboardConstants.PATTERN)).thenReturn(SERVLET_1_1_ALIAS); when(filter1_1Reference.getProperty(Constants.SERVICE_ID)).thenReturn(5L); when(filter2Reference.getBundle()).thenReturn(bundle2); when(filter2Reference.getPropertyKeys()).thenReturn(new String[0]); when(filter2Reference.getProperty(HttpWhiteboardConstants.PATTERN)).thenReturn(SERVLET_2_ALIAS); when(filter2Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(filter2Reference.getProperty(Constants.SERVICE_ID)).thenReturn(6L); when(filterAndServletReference.getBundle()).thenReturn(bundle1); when(filterAndServletReference.getPropertyKeys()).thenReturn(new String[0]); when(filterAndServletReference.getProperty(HttpWhiteboardConstants.PATTERN)).thenReturn(SERVLET_2_ALIAS); when(filterAndServletReference.getProperty(HttpWhiteboardConstants.ALIAS)).thenReturn(SERVLET_2_ALIAS); when(filterAndServletReference.getProperty(Constants.SERVICE_ID)).thenReturn(7L); this.httpService = new MockExtHttpService(); } @After public void tearDown() { this.httpService = null; } @Test public void test_no_servlets_no_filters() { ExtenderManager em = new ExtenderManager(); em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); em.setHttpService(null); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertTrue(em.getMappings().isEmpty()); } @Test public void test_servlet_per_bundle() { ExtenderManager em = new ExtenderManager(); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // setup a context without context ID em.add(sampleContext, httpContextReference); TestCase.assertTrue(em.getHttpContexts().isEmpty()); em.remove(sampleContext); // set up a context with context ID and not shared final String id = HttpContextManagerTest.createId(bundle1, SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // register servlet1 from bundle1 when(servlet1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(servlet1, servlet1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, servlet1.getHttpContext()); // register servlet2 from bundle2 em.add(servlet2, servlet2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(servlet2, getServletMapping(em, servlet2Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertNull(this.httpService.getServlets().get(SERVLET_2_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getServletMapping(em, servlet2Reference))); // unregister servlet2 em.removeServlet(servlet2Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister servlet1 em.removeServlet(servlet1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().get(id).getMappings().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister context em.remove(sampleContext); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_servlet_shared() { ExtenderManager em = new ExtenderManager(); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // set up a context with context ID and shared final String id = HttpContextManagerTest.createId(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_SHARED)).thenReturn("true"); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // register servlet1 from bundle1 when(servlet1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(servlet1, servlet1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, servlet1.getHttpContext()); // register servlet2 from bundle2 em.add(servlet2, servlet2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(servlet2, getServletMapping(em, servlet2Reference).getServlet()); TestCase.assertEquals(2, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(2, this.httpService.getServlets().size()); TestCase.assertSame(servlet2, this.httpService.getServlets().get(SERVLET_2_ALIAS)); TestCase.assertEquals(0, em.getOrphanMappings().size()); TestCase.assertSame(sampleContext, servlet2.getHttpContext()); // unregister servlet2 em.removeServlet(servlet2Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister servlet1 em.removeServlet(servlet1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().get(id).getMappings().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister context em.remove(sampleContext); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_servlet_no_context_id() { ExtenderManager em = new ExtenderManager(); final String id1 = HttpContextManagerTest.createId(bundle1, null); final String id2 = HttpContextManagerTest.createId(bundle2, null); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); TestCase.assertEquals(0, em.getHttpContexts().size()); // register servlet1 from bundle1 em.add(servlet1, servlet1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id1).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, servlet1.getHttpContext().getClass()); // register servlet2 from bundle2 when(servlet2Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(""); em.add(servlet2, servlet2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(servlet2, getServletMapping(em, servlet2Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id2).getMappings().size()); TestCase.assertEquals(2, this.httpService.getServlets().size()); TestCase.assertSame(servlet2, this.httpService.getServlets().get(SERVLET_2_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, servlet2.getHttpContext().getClass()); // different HttpContext instances per servlet/per bundle TestCase.assertNotSame(servlet1.getHttpContext(), servlet2.getHttpContext()); // register servlet 1_1 from bundle 1 em.add(servlet1_1, servlet1_1Reference); TestCase.assertEquals(3, em.getMappings().size()); TestCase.assertSame(servlet1_1, getServletMapping(em, servlet1_1Reference).getServlet()); TestCase.assertEquals(2, em.getHttpContexts().get(id1).getMappings().size()); TestCase.assertEquals(3, this.httpService.getServlets().size()); TestCase.assertSame(servlet1_1, this.httpService.getServlets().get(SERVLET_1_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, servlet1_1.getHttpContext().getClass()); // same HttpContext instances per servlet in same bundle TestCase.assertSame(servlet1.getHttpContext(), servlet1_1.getHttpContext()); } @Test public void test_servlet_before_context_per_bundle() { ExtenderManager em = new ExtenderManager(); final String id = HttpContextManagerTest.createId(bundle1, SAMPLE_CONTEXT_ID); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // register servlet1 from bundle1 when(servlet1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(servlet1, servlet1Reference); // servlet not registered with HttpService yet TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertNull(this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getServletMapping(em, servlet1Reference))); // set up a context with context ID and not shared when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // servlet registered with HttpService TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, servlet1.getHttpContext()); // unregister context em.remove(sampleContext); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertNull(this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getServletMapping(em, servlet1Reference))); // unregister servlet1 em.removeServlet(servlet1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_servlet_before_context_shared() { ExtenderManager em = new ExtenderManager(); final String id = HttpContextManagerTest.createId(SAMPLE_CONTEXT_ID); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // register servlet1 from bundle1 when(servlet1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(servlet1, servlet1Reference); // servlet not registered with HttpService yet TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertNull(this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getServletMapping(em, servlet1Reference))); // set up a context with context ID and not shared when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_SHARED)).thenReturn(true); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // servlet registered with HttpService TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertSame(servlet1, this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, servlet1.getHttpContext()); // unregister context em.remove(sampleContext); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(servlet1, getServletMapping(em, servlet1Reference).getServlet()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertNull(this.httpService.getServlets().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getServletMapping(em, servlet1Reference))); // unregister servlet1 em.removeServlet(servlet1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_filter_per_bundle() { ExtenderManager em = new ExtenderManager(); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // setup a context without context ID em.add(sampleContext, httpContextReference); TestCase.assertTrue(em.getHttpContexts().isEmpty()); em.remove(sampleContext); // set up a context with context ID and not shared final String id = HttpContextManagerTest.createId(bundle1, SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // register filter1 from bundle1 when(filter1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(filter1, filter1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, filter1.getHttpContext()); // register filter2 from bundle2 em.add(filter2, filter2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(filter2, getFilterMapping(em, filter2Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertNull(this.httpService.getFilters().get(SERVLET_2_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getFilterMapping(em, filter2Reference))); // unregister filter2 em.removeFilter(filter2Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister filter1 em.removeFilter(filter1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().get(id).getMappings().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister context em.remove(sampleContext); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_filter_shared() { ExtenderManager em = new ExtenderManager(); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // set up a context with context ID and shared final String id = HttpContextManagerTest.createId(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_SHARED)).thenReturn("true"); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // register filter1 from bundle1 when(filter1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(filter1, filter1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, filter1.getHttpContext()); // register filter2 from bundle2 em.add(filter2, filter2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(filter2, getFilterMapping(em, filter2Reference).getFilter()); TestCase.assertEquals(2, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(2, this.httpService.getFilters().size()); TestCase.assertSame(filter2, this.httpService.getFilters().get(SERVLET_2_ALIAS)); TestCase.assertEquals(0, em.getOrphanMappings().size()); TestCase.assertSame(sampleContext, filter2.getHttpContext()); // unregister filter2 em.removeFilter(filter2Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister filter1 em.removeFilter(filter1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().get(id).getMappings().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); // unregister context em.remove(sampleContext); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_filter_no_context_id() { ExtenderManager em = new ExtenderManager(); final String id1 = HttpContextManagerTest.createId(bundle1, null); final String id2 = HttpContextManagerTest.createId(bundle2, null); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); TestCase.assertEquals(0, em.getHttpContexts().size()); // register filter1 from bundle1 em.add(filter1, filter1Reference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id1).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, filter1.getHttpContext().getClass()); // register filter2 from bundle2 when(filter2Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(""); em.add(filter2, filter2Reference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertSame(filter2, getFilterMapping(em, filter2Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id2).getMappings().size()); TestCase.assertEquals(2, this.httpService.getFilters().size()); TestCase.assertSame(filter2, this.httpService.getFilters().get(SERVLET_2_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, filter2.getHttpContext().getClass()); // different HttpContext instances per servlet/per bundle TestCase.assertNotSame(filter1.getHttpContext(), filter2.getHttpContext()); // register servlet 1_1 from bundle 1 em.add(filter1_1, filter1_1Reference); TestCase.assertEquals(3, em.getMappings().size()); TestCase.assertSame(filter1_1, getFilterMapping(em, filter1_1Reference).getFilter()); TestCase.assertEquals(2, em.getHttpContexts().get(id1).getMappings().size()); TestCase.assertEquals(3, this.httpService.getFilters().size()); TestCase.assertSame(filter1_1, this.httpService.getFilters().get(SERVLET_1_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(DefaultHttpContext.class, filter1_1.getHttpContext().getClass()); // same HttpContext instances per servlet in same bundle TestCase.assertSame(filter1.getHttpContext(), filter1_1.getHttpContext()); } @Test public void test_filter_before_context_per_bundle() { ExtenderManager em = new ExtenderManager(); final String id = HttpContextManagerTest.createId(bundle1, SAMPLE_CONTEXT_ID); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // register filter1 from bundle1 when(filter1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(filter1, filter1Reference); // servlet not registered with HttpService yet TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getFilterMapping(em, filter1Reference))); // set up a context with context ID and not shared when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // servlet registered with HttpService TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, filter1.getHttpContext()); // unregister context em.remove(sampleContext); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getFilterMapping(em, filter1Reference))); // unregister filter1 em.removeFilter(filter1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_filter_before_context_shared() { ExtenderManager em = new ExtenderManager(); final String id = HttpContextManagerTest.createId(SAMPLE_CONTEXT_ID); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // register filter1 from bundle1 when(filter1Reference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); em.add(filter1, filter1Reference); // servlet not registered with HttpService yet TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getFilterMapping(em, filter1Reference))); // set up a context with context ID and not shared when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_ID)).thenReturn(SAMPLE_CONTEXT_ID); when(httpContextReference.getProperty(HttpWhiteboardConstants.CONTEXT_SHARED)).thenReturn(true); em.add(sampleContext, httpContextReference); TestCase.assertEquals(1, em.getHttpContexts().size()); // servlet registered with HttpService TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(1, em.getHttpContexts().get(id).getMappings().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); TestCase.assertSame(sampleContext, filter1.getHttpContext()); // unregister context em.remove(sampleContext); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertSame(filter1, getFilterMapping(em, filter1Reference).getFilter()); TestCase.assertEquals(0, em.getHttpContexts().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(this.httpService.getFilters().get(SERVLET_1_ALIAS)); TestCase.assertEquals(1, em.getOrphanMappings().size()); TestCase.assertEquals(1, em.getOrphanMappings().get(SAMPLE_CONTEXT_ID).size()); TestCase.assertTrue(em.getOrphanMappings().get(SAMPLE_CONTEXT_ID) .contains(getFilterMapping(em, filter1Reference))); // unregister filter1 em.removeFilter(filter1Reference); TestCase.assertTrue(em.getMappings().isEmpty()); TestCase.assertTrue(em.getHttpContexts().isEmpty()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertTrue(em.getOrphanMappings().isEmpty()); } @Test public void test_filter_and_servlet_in_one_service() { ExtenderManager em = new ExtenderManager(); // prepare with http service em.setHttpService(this.httpService); TestCase.assertTrue(this.httpService.getServlets().isEmpty()); TestCase.assertTrue(this.httpService.getFilters().isEmpty()); // register filter1 from bundle1 em.add(filter1, filterAndServletReference); em.add(servlet1, filterAndServletReference); TestCase.assertEquals(2, em.getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertEquals(1, this.httpService.getFilters().size()); TestCase.assertSame(filter1, getFilterMapping(em, filterAndServletReference).getFilter()); TestCase.assertSame(servlet1, getServletMapping(em, filterAndServletReference).getServlet()); em.removeFilter(filterAndServletReference); TestCase.assertEquals(1, em.getMappings().size()); TestCase.assertEquals(1, this.httpService.getServlets().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(getFilterMapping(em, filterAndServletReference)); TestCase.assertSame(servlet1, getServletMapping(em, filterAndServletReference).getServlet()); em.removeServlet(filterAndServletReference); TestCase.assertEquals(0, em.getMappings().size()); TestCase.assertEquals(0, this.httpService.getServlets().size()); TestCase.assertEquals(0, this.httpService.getFilters().size()); TestCase.assertNull(getFilterMapping(em, filterAndServletReference)); TestCase.assertNull(getServletMapping(em, filterAndServletReference)); } private FilterMapping getFilterMapping(final ExtenderManager em, final ServiceReference ref) { return (FilterMapping) em.getMappings().get(ref.getProperty(Constants.SERVICE_ID).toString() + ExtenderManager.TYPE_FILTER); } private ServletMapping getServletMapping(final ExtenderManager em, final ServiceReference ref) { return (ServletMapping) em.getMappings().get(ref.getProperty(Constants.SERVICE_ID).toString() + ExtenderManager.TYPE_SERVLET); } static interface ExtFilter extends Filter { HttpContext getHttpContext(); } static interface ExtServlet extends Servlet { HttpContext getHttpContext(); } static final class MockExtHttpService implements ExtHttpService { private final BidiMap /* <String, Servlet> */servlets = new DualHashBidiMap(); private final BidiMap /* <String, Filter> */filters = new DualHashBidiMap(); /** * @return BidiMap<String, Servlet> */ public BidiMap getServlets() { return servlets; } /** * @return BidiMap<String, Filter> */ public BidiMap getFilters() { return filters; } public void registerServlet(String alias, Servlet servlet, @SuppressWarnings("rawtypes") Dictionary initparams, HttpContext context) { // always expect a non-null HttpContext here !! TestCase.assertNotNull(context); this.servlets.put(alias, servlet); // make HttpContext available when(((ExtServlet) servlet).getHttpContext()).thenReturn(context); } public void registerResources(String alias, String name, HttpContext context) { // not used here } public void unregister(String alias) { Object servlet = this.servlets.remove(alias); if (servlet instanceof ExtServlet) { when(((ExtServlet) servlet).getHttpContext()).thenReturn(null); } } public HttpContext createDefaultHttpContext() { // not used here return null; } public void registerFilter(Filter filter, String pattern, @SuppressWarnings("rawtypes") Dictionary initParams, int ranking, HttpContext context) { // always expect a non-null HttpContext here !! TestCase.assertNotNull(context); this.filters.put(pattern, filter); // make HttpContext available when(((ExtFilter) filter).getHttpContext()).thenReturn(context); } public void unregisterFilter(Filter filter) { this.filters.removeValue(filter); when(((ExtFilter) filter).getHttpContext()).thenReturn(null); } public void unregisterServlet(Servlet servlet) { this.servlets.removeValue(servlet); when(((ExtServlet) servlet).getHttpContext()).thenReturn(null); } } }