/************************************************************************* * Copyright 2009-2012 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ package com.eucalyptus.auth.policy.condition; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.annotation.Nullable; import org.junit.Test; import com.eucalyptus.system.Ats; import com.eucalyptus.util.Exceptions; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; public class ConditionOpTest { private static final List<Class<? extends ConditionOp>> conditionOps = ImmutableList.<Class<? extends ConditionOp>>builder() .add(IpAddress.class) .add(NotIpAddress.class) .add(Bool.class) .add(DateEquals.class) .add(DateGreaterThan.class) .add(DateGreaterThanEquals.class) .add(DateLessThan.class) .add(DateLessThanEquals.class) .add(DateNotEquals.class) .add(NumericEquals.class) .add(NumericGreaterThan.class) .add(NumericGreaterThanEquals.class) .add(NumericLessThan.class) .add(NumericLessThanEquals.class) .add(NumericNotEquals.class) .add(StringEquals.class) .add(StringEqualsIgnoreCase.class) .add(StringLike.class) .add(StringNotEquals.class) .add(StringNotEqualsIgnoreCase.class) .add( StringNotLike.class ) .build(); /** * Verifies no duplicate condition names (see PolicyCondition annotation) */ @Test public void testPolicyConditionAnnotations() { final ImmutableList<String> conditions = ImmutableList.copyOf(Iterables.concat(Iterables.transform(conditionOps, ToConditions.INSTANCE))); assertTrue( "No duplicate conditions", Iterables.all( conditions, Predicates.not( duplicatedIn( conditions ) ) ) ); } @Test public void instantiationTest() { Iterables.transform( conditionOps, ToInstance.INSTANCE ); } /** * Verifies conditions evaluate to false for empty arguments */ @Test public void emptyArgumentsTest() { final Iterable<ConditionOp> conditionOperations = Iterables.transform( Iterables.filter( conditionOps, Predicates.not(Predicates.or( Predicates.<Class<? extends ConditionOp>>equalTo(Bool.class), Predicates.<Class<? extends ConditionOp>>equalTo(StringEquals.class), Predicates.<Class<? extends ConditionOp>>equalTo(StringEqualsIgnoreCase.class), Predicates.<Class<? extends ConditionOp>>equalTo(StringLike.class)) ) ), ToInstance.INSTANCE); assertTrue( "Empty is false", Iterables.all( conditionOperations, apply( "", "" ) ) ); } private static Predicate<Object> duplicatedIn( final List<?> objects ) { return new Predicate<Object>( ) { @Override public boolean apply( final Object o ) { return Iterables.filter( objects, Predicates.and( Predicates.equalTo(o), Predicates.not(isSameObject(o)) )).iterator().hasNext(); } }; } private static Predicate<ConditionOp> apply( final String key, final String value ) { return new Predicate<ConditionOp>() { @Override public boolean apply( final ConditionOp conditionOp ) { System.out.println( conditionOp ); return !conditionOp.check( key, value ); } }; } private static Predicate<Object> isSameObject( final Object o1 ) { return new Predicate<Object>() { @Override public boolean apply( final Object o2 ) { return o1 == o2; } }; } enum ToConditions implements Function<Class<?>,Iterable<String>> { INSTANCE; @Override public Iterable<String> apply(final Class<?> aClass) { final PolicyCondition condition = Ats.from(aClass).get( PolicyCondition.class ); return condition == null ? Collections.<String>emptyList() : Arrays.asList( condition.value() ); } } enum ToInstance implements Function<Class<? extends ConditionOp>,ConditionOp> { INSTANCE; @Override public ConditionOp apply( final Class<? extends ConditionOp> aClass) { try { return aClass.newInstance(); } catch (Exception e) { throw Exceptions.toUndeclared(e); } } } }