/* * 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.base.internal.registry; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import org.apache.felix.http.base.internal.context.ExtServletContext; import org.apache.felix.http.base.internal.handler.FilterHandler; import org.apache.felix.http.base.internal.handler.HttpServiceFilterHandler; import org.apache.felix.http.base.internal.runtime.FilterInfo; import org.apache.felix.http.base.internal.runtime.dto.FailedDTOHolder; import org.junit.Test; import org.mockito.Matchers; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.osgi.service.http.runtime.dto.ServletContextDTO; import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; public class EventListenerRegistryTest { private final FilterRegistry reg = new FilterRegistry(); private void assertEmpty(final ServletContextDTO dto, final FailedDTOHolder holder) { assertNull(dto.filterDTOs); assertTrue(holder.failedFilterDTOs.isEmpty()); } private void clear(final ServletContextDTO dto, final FailedDTOHolder holder) { dto.filterDTOs = null; holder.failedFilterDTOs.clear(); } @Test public void testSingleFilter() throws InvalidSyntaxException, ServletException { final FailedDTOHolder holder = new FailedDTOHolder(); final ServletContextDTO dto = new ServletContextDTO(); // check DTO reg.getRuntimeInfo(dto, holder.failedFilterDTOs); assertEmpty(dto, holder); // register filter final FilterHandler h1 = createFilterHandler(1L, 0, "/foo"); reg.addFilter(h1); verify(h1.getFilter()).init(Matchers.any(FilterConfig.class)); // one entry in DTO clear(dto, holder); reg.getRuntimeInfo(dto, holder.failedFilterDTOs); assertTrue(holder.failedFilterDTOs.isEmpty()); assertNotNull(dto.filterDTOs); assertEquals(1, dto.filterDTOs.length); assertEquals(1, dto.filterDTOs[0].patterns.length); assertEquals("/foo", dto.filterDTOs[0].patterns[0]); // remove filter final Filter f = h1.getFilter(); reg.removeFilter(h1.getFilterInfo(), true); verify(f).destroy(); // empty again clear(dto, holder); reg.getRuntimeInfo(dto, holder.failedFilterDTOs); assertEmpty(dto, holder); } @Test public void testFilterOrdering() throws InvalidSyntaxException { final FilterHandler h1 = createFilterHandler(1L, 20, "/foo"); reg.addFilter(h1); final FilterHandler h2 = createFilterHandler(2L, 10, "/foo"); reg.addFilter(h2); final FilterHandler h3 = createFilterHandler(3L, 30, "/foo"); reg.addFilter(h3); final FilterHandler h4 = createFilterHandler(4L, 0, "/other"); reg.addFilter(h4); final FilterHandler h5 = createFilterHandler(5L, 90, "/foo"); reg.addFilter(h5); final FilterHandler[] handlers = reg.getFilterHandlers(null, DispatcherType.REQUEST, "/foo"); assertEquals(4, handlers.length); assertEquals(h5.getFilterInfo(), handlers[0].getFilterInfo()); assertEquals(h3.getFilterInfo(), handlers[1].getFilterInfo()); assertEquals(h1.getFilterInfo(), handlers[2].getFilterInfo()); assertEquals(h2.getFilterInfo(), handlers[3].getFilterInfo()); // cleanup reg.removeFilter(h1.getFilterInfo(), true); reg.removeFilter(h2.getFilterInfo(), true); reg.removeFilter(h3.getFilterInfo(), true); reg.removeFilter(h4.getFilterInfo(), true); reg.removeFilter(h5.getFilterInfo(), true); } private static FilterInfo createFilterInfo(final long id, final int ranking, final String... paths) throws InvalidSyntaxException { final BundleContext bCtx = mock(BundleContext.class); when(bCtx.createFilter(Matchers.anyString())).thenReturn(null); final Bundle bundle = mock(Bundle.class); when(bundle.getBundleContext()).thenReturn(bCtx); final ServiceReference<Filter> ref = mock(ServiceReference.class); when(ref.getBundle()).thenReturn(bundle); when(ref.getProperty(Constants.SERVICE_ID)).thenReturn(id); when(ref.getProperty(Constants.SERVICE_RANKING)).thenReturn(ranking); when(ref.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN)).thenReturn(paths); when(ref.getPropertyKeys()).thenReturn(new String[0]); final FilterInfo si = new FilterInfo(ref); return si; } private static FilterHandler createFilterHandler(final long id, final int ranking, final String... paths) throws InvalidSyntaxException { final FilterInfo si = createFilterInfo(id, ranking, paths); final ExtServletContext ctx = mock(ExtServletContext.class); final Filter filter = mock(Filter.class); return new HttpServiceFilterHandler(ctx, si, filter); } }