/*
* 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.ambari.server.state.quicklinksprofile;
import static org.apache.ambari.server.state.quicklinksprofile.Filter.acceptAllFilter;
import static org.apache.ambari.server.state.quicklinksprofile.Filter.linkAttributeFilter;
import static org.apache.ambari.server.state.quicklinksprofile.Filter.linkNameFilter;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.apache.ambari.server.state.quicklinks.Link;
import org.junit.Test;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class FilterEvaluatorTest {
static final String NAMENODE = "NAMENODE";
static final String NAMENODE_UI = "namenode_ui";
static final String AUTHENTICATED = "authenticated";
static final String NAMENODE_JMX = "namenode_jmx";
static final String SSO = "sso";
private Link namenodeUi;
private Link nameNodeJmx;
public FilterEvaluatorTest() {
namenodeUi = new Link();
namenodeUi.setComponentName(NAMENODE);
namenodeUi.setName(NAMENODE_UI);
namenodeUi.setAttributes(ImmutableList.of(AUTHENTICATED));
// this is a "legacy" link with no attributes defined
nameNodeJmx = new Link();
nameNodeJmx.setComponentName(NAMENODE);
nameNodeJmx.setName(NAMENODE_JMX);
}
/**
* Evaluators should work when initialized with {@code null} or an empty list of filters.
*/
@Test
public void testWithEmptyFilters() throws Exception {
FilterEvaluator evaluator = new FilterEvaluator(new ArrayList<Filter>());
assertEquals(Optional.absent(), evaluator.isVisible(namenodeUi));
FilterEvaluator evaluator2 = new FilterEvaluator(null);
assertEquals(Optional.absent(), evaluator2.isVisible(namenodeUi));
}
/**
* FilterEvaluator should return {@link Optional#absent()} when the link doesn't match any filters
*/
@Test
public void testNoMatchingFilter() throws Exception {
List<Filter> filters = Lists.newArrayList(
linkNameFilter(NAMENODE_JMX, true),
linkAttributeFilter(SSO, false));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.absent(), evaluator.isVisible(namenodeUi));
}
/**
* Link name filters should be evaluated first
*/
@Test
public void testLinkNameFiltersEvaluatedFirst() throws Exception {
List<Filter> filters = Lists.newArrayList(
acceptAllFilter(false),
linkNameFilter(NAMENODE_UI, true),
linkNameFilter(NAMENODE_JMX, false),
linkAttributeFilter(AUTHENTICATED, false),
linkAttributeFilter(SSO, false));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.of(true), evaluator.isVisible(namenodeUi));
}
/**
* Link attribute filters should be evaluated only if the link does not match any link name filters.
*/
@Test
public void testLinkAttributeFiltersEvaluatedSecondly() throws Exception {
List<Filter> filters = Lists.newArrayList(
acceptAllFilter(false),
linkNameFilter(NAMENODE_JMX, false),
linkAttributeFilter(AUTHENTICATED, true),
linkAttributeFilter(SSO, true));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.of(true), evaluator.isVisible(namenodeUi));
}
/**
* Link attribute filters work with links with null attributes. (No NPE is thrown)
*/
@Test
public void testLinkAttributeFiltersWorkWithNullAttributes() throws Exception {
List<Filter> filters = Lists.newArrayList(
acceptAllFilter(true),
linkAttributeFilter(AUTHENTICATED, false),
linkAttributeFilter(SSO, false));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.of(true), evaluator.isVisible(nameNodeJmx));
}
/**
* If the link matches both a show and hide type link attribute filter, then it will be evaluated as hidden.
*/
@Test
public void testHideFilterTakesPrecedence() throws Exception {
List<Filter> filters = Lists.<Filter>newArrayList(
linkAttributeFilter(AUTHENTICATED, false),
linkAttributeFilter(SSO, true));
FilterEvaluator evaluator = new FilterEvaluator(filters);
namenodeUi.setAttributes(ImmutableList.of(AUTHENTICATED, SSO));
assertEquals(Optional.of(false), evaluator.isVisible(namenodeUi));
}
/**
* Accept-all filters are only evaluated if the link does not match any link name or link attribute filters.
*/
@Test
public void acceptAllFilterEvaluatedLast() throws Exception {
List<Filter> filters = Lists.newArrayList(
acceptAllFilter(false),
linkNameFilter(NAMENODE_JMX, true),
linkAttributeFilter(SSO, true));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.of(false), evaluator.isVisible(namenodeUi));
}
/**
* Contradicting link name filters should result in {@link QuickLinksProfileEvaluationException}.
*/
@Test(expected = QuickLinksProfileEvaluationException.class)
public void contradictingLinkNameFiltersRejected() throws Exception {
List<Filter> filters = Lists.newArrayList(
linkNameFilter(NAMENODE_JMX, true),
linkNameFilter(NAMENODE_JMX, false),
linkAttributeFilter(SSO, true));
new FilterEvaluator(filters);
}
/**
* Contradicting property filters should result in {@link QuickLinksProfileEvaluationException}.
* @throws Exception
*/
@Test(expected = QuickLinksProfileEvaluationException.class)
public void contradictingPropertyFiltersRejected() throws Exception {
List<Filter> filters = Lists.<Filter>newArrayList(
linkAttributeFilter(SSO, true),
linkAttributeFilter(SSO, false));
new FilterEvaluator(filters);
}
/**
* Contradicting link attribute filters should result in {@link QuickLinksProfileEvaluationException}.
*/
@Test(expected = QuickLinksProfileEvaluationException.class)
public void contradictingLinkAttributeFiltersRejected() throws Exception {
List<Filter> filters = Lists.<Filter>newArrayList(
linkAttributeFilter(SSO, true),
linkAttributeFilter(SSO, false));
new FilterEvaluator(filters);
}
/**
* Contradicting accept-all filters should result in {@link QuickLinksProfileEvaluationException}.
*/
@Test(expected = QuickLinksProfileEvaluationException.class)
public void contradictingAcceptAllFiltersRejected() throws Exception {
List<Filter> filters = Lists.newArrayList(
linkNameFilter(NAMENODE_JMX, true),
linkAttributeFilter(SSO, true),
acceptAllFilter(true),
acceptAllFilter(false));
new FilterEvaluator(filters);
}
/**
* Duplicate filter declarations are ok if their visibility rule is the same
*/
@Test
public void duplicateFiltersAreOkIfDoNotContradict() throws Exception {
List<Filter> filters = Lists.newArrayList(
acceptAllFilter(true),
acceptAllFilter(true),
linkNameFilter(NAMENODE_JMX, false),
linkNameFilter(NAMENODE_JMX, false),
linkAttributeFilter(SSO, false),
linkAttributeFilter(SSO, false));
FilterEvaluator evaluator = new FilterEvaluator(filters);
assertEquals(Optional.of(true), evaluator.isVisible(namenodeUi));
}
}