/*
* 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.shiro.web.filter.mgt;
import org.apache.shiro.util.CollectionUtils;
import org.apache.shiro.web.filter.authc.UserFilter;
import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;
import org.apache.shiro.web.filter.authz.PortFilter;
import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
import org.apache.shiro.web.filter.authz.SslFilter;
import org.junit.Test;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import java.util.*;
import static org.easymock.EasyMock.createNiceMock;
import static org.junit.Assert.*;
/**
* Test case for the {@link SimpleNamedFilterList} implementation.
*
* @since 1.0
*/
public class SimpleNamedFilterListTest {
@Test
public void testNewInstance() {
@SuppressWarnings({"MismatchedQueryAndUpdateOfCollection"})
SimpleNamedFilterList list = new SimpleNamedFilterList("test");
assertNotNull(list.getName());
assertEquals("test", list.getName());
}
@Test(expected = IllegalArgumentException.class)
public void testNewInstanceNameless() {
new SimpleNamedFilterList(null);
}
@Test
public void testNewInstanceBackingList() {
new SimpleNamedFilterList("test", new ArrayList<Filter>());
}
@Test(expected = NullPointerException.class)
public void testNewInstanceNullBackingList() {
new SimpleNamedFilterList("test", null);
}
/**
* Exists mainly to increase code coverage as the SimpleNamedFilterList
* implementation is a direct pass through.
*/
@Test
public void testListMethods() {
FilterChain mock = createNiceMock(FilterChain.class);
Filter filter = createNiceMock(Filter.class);
NamedFilterList list = new SimpleNamedFilterList("test");
list.add(filter);
FilterChain chain = list.proxy(mock);
assertNotNull(chain);
assertNotSame(mock, chain);
Filter singleFilter = new SslFilter();
List<? extends Filter> multipleFilters = CollectionUtils.asList(new PortFilter(), new UserFilter());
list.add(0, singleFilter);
assertEquals(2, list.size());
assertTrue(list.get(0) instanceof SslFilter);
assertTrue(Arrays.equals(list.toArray(), new Object[]{singleFilter, filter}));
list.addAll(multipleFilters);
assertEquals(4, list.size());
assertTrue(list.get(2) instanceof PortFilter);
assertTrue(list.get(3) instanceof UserFilter);
list.addAll(0, CollectionUtils.asList(new PermissionsAuthorizationFilter(), new RolesAuthorizationFilter()));
assertEquals(6, list.size());
assertTrue(list.get(0) instanceof PermissionsAuthorizationFilter);
assertTrue(list.get(1) instanceof RolesAuthorizationFilter);
assertEquals(2, list.indexOf(singleFilter));
assertEquals(multipleFilters, list.subList(4, list.size()));
assertTrue(list.contains(singleFilter));
assertTrue(list.containsAll(multipleFilters));
assertFalse(list.isEmpty());
list.clear();
assertTrue(list.isEmpty());
list.add(singleFilter);
Iterator i = list.iterator();
assertTrue(i.hasNext());
assertEquals(i.next(), singleFilter);
ListIterator li = list.listIterator();
assertTrue(li.hasNext());
assertEquals(li.next(), singleFilter);
li = list.listIterator(0);
assertTrue(li.hasNext());
assertEquals(li.next(), singleFilter);
list.set(0, singleFilter);
assertEquals(list.get(0), singleFilter);
Filter[] filters = new Filter[list.size()];
filters = list.toArray(filters);
assertEquals(1, filters.length);
assertEquals(filters[0], singleFilter);
assertEquals(0, list.lastIndexOf(singleFilter));
list.remove(singleFilter);
assertTrue(list.isEmpty());
list.add(singleFilter);
list.remove(0);
assertTrue(list.isEmpty());
list.add(singleFilter);
list.addAll(multipleFilters);
assertEquals(3, list.size());
list.removeAll(multipleFilters);
assertEquals(1, list.size());
assertEquals(list.get(0), singleFilter);
list.addAll(multipleFilters);
assertEquals(3, list.size());
list.retainAll(multipleFilters);
assertEquals(2, list.size());
//noinspection unchecked
assertEquals(new ArrayList(list), multipleFilters);
}
}