/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2008 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS */ package org.opends.server.admin.client.spi; import static org.testng.Assert.*; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; import java.util.SortedSet; import org.opends.server.admin.AbstractManagedObjectDefinition; import org.opends.server.admin.AdminTestCase; import org.opends.server.admin.BooleanPropertyDefinition; import org.opends.server.admin.Configuration; import org.opends.server.admin.ConfigurationClient; import org.opends.server.admin.DefaultBehaviorProvider; import org.opends.server.admin.DefinedDefaultBehaviorProvider; import org.opends.server.admin.ManagedObjectDefinition; import org.opends.server.admin.PropertyDefinition; import org.opends.server.admin.PropertyOption; import org.opends.server.admin.PropertyProvider; import org.opends.server.admin.StringPropertyDefinition; import org.opends.server.admin.TopCfgDefn; import org.opends.server.admin.client.ManagedObject; import org.opends.server.admin.server.ServerManagedObject; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; /** * PropertySet Tester. */ public class PropertySetTest extends AdminTestCase { /** Default value for boolean property. */ private static final Boolean BOOL_DEFAULT = Boolean.TRUE; /** Default value for string properties. */ private static final String STR_DEFAULT = "str def"; /** Test boolean property def. */ private BooleanPropertyDefinition testBoolPropertyDefinition; /** Test single valued string property def. */ private StringPropertyDefinition testSvStringPropertyDefinition; /** Test multi-valued string property def. */ private StringPropertyDefinition testMvStringPropertyDefinition; private PropertyProvider emptyPropertyProvider = new PropertyProvider() { @Override public Collection getPropertyValues(PropertyDefinition d) throws IllegalArgumentException { return Collections.emptySet(); } }; /** * Creates property definitions for testing. */ @BeforeClass public void setUp() { BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(TopCfgDefn.getInstance(), "test-bool-prop"); DefinedDefaultBehaviorProvider dbp = new DefinedDefaultBehaviorProvider<>(BOOL_DEFAULT.toString()); builder.setDefaultBehaviorProvider(dbp); testBoolPropertyDefinition = builder.getInstance(); StringPropertyDefinition.Builder builder2 = StringPropertyDefinition.createBuilder(TopCfgDefn.getInstance(), "test-sv-str-prop"); DefinedDefaultBehaviorProvider dbp2 = new DefinedDefaultBehaviorProvider<>(STR_DEFAULT); builder2.setDefaultBehaviorProvider(dbp2); testSvStringPropertyDefinition = builder2.getInstance(); StringPropertyDefinition.Builder builder3 = StringPropertyDefinition.createBuilder(TopCfgDefn.getInstance(), "test-mv-str-prop"); DefinedDefaultBehaviorProvider dbp3 = new DefinedDefaultBehaviorProvider<>(STR_DEFAULT); builder3.setDefaultBehaviorProvider(dbp3); builder3.setOption(PropertyOption.MULTI_VALUED); testMvStringPropertyDefinition = builder3.getInstance(); } /** * Creates data for tests requiring property definitions. * @return Object[][] or property definitions */ @DataProvider(name = "propertyDefinitionData") public Object[][] createPropertyDefinitionData() { return new Object[][] { { testBoolPropertyDefinition }, { testSvStringPropertyDefinition }, { testMvStringPropertyDefinition } }; } /** * Creates data for tests requiring property definitions * and sample data. * @return Object[][] consisting of property defs and sets * of sample data */ @DataProvider(name = "propertyDefinitionAndValuesData") public Object[][] createPropertyDefinitionAndValuesData() { Set sb = new HashSet<>(); sb.add(Boolean.TRUE); Set ss1 = new HashSet<>(); ss1.add("v"); Set ss2 = new HashSet<>(); ss2.add("v1"); ss2.add("v2"); return new Object[][] { { testBoolPropertyDefinition, sb }, { testSvStringPropertyDefinition, ss1 }, { testMvStringPropertyDefinition, ss2 } }; } /** * Test basic property set creation. */ @Test public void testCreate() { PropertySet ps = createTestPropertySet(); assertNotNull(ps); } /** * Tests setting and getting property values. * @param pd PropertyDefinition for which values are set and gotten * @param values property values to test */ @Test(dataProvider = "propertyDefinitionAndValuesData") public void testSetGetPropertyValue(PropertyDefinition pd, Collection values) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); assertFalse(p.isModified()); ps.setPropertyValues(pd, values); p = ps.getProperty(pd); assertTrue(p.isModified()); SortedSet vs = p.getPendingValues(); assertEquals(values.size(), vs.size()); for (T value : values) { assertTrue(vs.contains(value)); } } /** * Tests toString(). * @param pd PropertyDefinition for testing */ @Test(dataProvider = "propertyDefinitionData") public void testToString(PropertyDefinition pd) { PropertySet ps = createTestPropertySet(); ps.toString(); } /** * Tests the active values property. * @param pd PropertyDefinition for testing * @param values for testing */ @Test(dataProvider = "propertyDefinitionAndValuesData") public void testGetActiveValues(final PropertyDefinition pd, final Collection values) { PropertyProvider pp = new TestPropertyProvider<>(pd, values); PropertySet ps = createTestPropertySet(pp); Property p = ps.getProperty(pd); SortedSet ss = p.getActiveValues(); assertEquals(ss.size(), values.size()); for (T v : values) { assertTrue(ss.contains(v)); } } /** * Creates data for default test. * @return Object[][] data for test */ @DataProvider(name = "defaultData") public Object[][] createDefaultData() { Set sb = new HashSet<>(); sb.add(BOOL_DEFAULT); Set ss1 = new HashSet<>(); ss1.add(STR_DEFAULT); Set ss2 = new HashSet<>(); ss2.add(STR_DEFAULT); return new Object[][] { { testBoolPropertyDefinition, sb }, { testSvStringPropertyDefinition, ss1 }, { testMvStringPropertyDefinition, ss2 } }; } /** * Tests default values property. * @param pd PropertyDefinition to test * @param expected default values */ @Test(dataProvider = "defaultData") public void testGetDefaultValues(PropertyDefinition pd, Set expected) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); SortedSet ss = p.getDefaultValues(); assertEquals(ss.size(), expected.size()); for (T v : expected) { assertTrue(ss.contains(v), "does not contain " + v); } } /** * Creates data for effective test. * @return Object[][] data for test */ @DataProvider(name = "effectiveData") public Object[][] createEffectiveData() { Set nvb = new HashSet<>(); nvb.add(Boolean.FALSE); Set edb = new HashSet<>(); edb.add(BOOL_DEFAULT); Set nvss1 = new HashSet<>(); nvss1.add("new value"); Set edss1 = new HashSet<>(); edss1.add(STR_DEFAULT); Set nvss2 = new HashSet<>(); nvss2.add("new value 1"); nvss2.add("new value 2"); Set edss2 = new HashSet<>(); edss2.add(STR_DEFAULT); return new Object[][] { { testBoolPropertyDefinition, nvb, edb }, { testSvStringPropertyDefinition, nvss1, edss1 }, { testMvStringPropertyDefinition, nvss2, edss2 } }; } /** * Tests effective values property. * @param pd PropertyDefinition * @param newValues to apply * @param expectedDefaults for test comparison */ @Test(dataProvider = "effectiveData") public void testGetEffectiveValues(PropertyDefinition pd, Set newValues, Set expectedDefaults) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); // before setting any values, the effective data // is supposed to just be the defaults Set ev1 = p.getEffectiveValues(); assertEquals(ev1.size(), expectedDefaults.size()); for(T v : ev1) { assertTrue(expectedDefaults.contains(v), "does not contain " + v); } // now set some data and make sure the effective // values now reflect the pending values ps.setPropertyValues(pd, newValues); Set ev2 = p.getEffectiveValues(); assertEquals(ev2.size(), newValues.size()); for(T v : ev2) { assertTrue(newValues.contains(v), "does not contain " + v); } } /** * Tests pending values property. * @param pd PropertyDefinition * @param newValues set of new values to apply * @param ignore parameter */ @Test(dataProvider = "effectiveData") public void testGetPendingValues(PropertyDefinition pd, Set newValues, Set ignore) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); // now set some data and make sure the effective // values now reflect the pending values ps.setPropertyValues(pd, newValues); Set ev2 = p.getEffectiveValues(); assertEquals(ev2.size(), newValues.size()); for(T v : ev2) { assertTrue(newValues.contains(v)); } } /** * Tests getPropertyDefinition(). * @param pd property definition to test */ @Test(dataProvider = "propertyDefinitionData") public void testGetPropertyDefinition(PropertyDefinition pd) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); PropertyDefinition pd2 = p.getPropertyDefinition(); assertEquals(pd, pd2); } /** * Tests isEmpty property. * @param pd PropertyDefinition * @param newValues set of new values to apply * @param ignore parameter */ @Test(dataProvider = "effectiveData") public void testIsEmpty(PropertyDefinition pd, Set newValues, Set ignore) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); assertTrue(p.isEmpty()); ps.setPropertyValues(pd, newValues); assertFalse(p.isEmpty()); } /** * Tests isEmpty property. * @param pd PropertyDefinition * @param newValues set of new values to apply * @param ignore parameter */ @Test(dataProvider = "effectiveData") public void testIsModified(PropertyDefinition pd, Set newValues, Set ignore) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); assertFalse(p.isModified()); ps.setPropertyValues(pd, newValues); p = ps.getProperty(pd); assertTrue(p.isModified()); } /** * Tests wasEmpty property. * @param pd property def to test */ @Test(dataProvider = "propertyDefinitionData") public void testWasEmpty(PropertyDefinition pd) { PropertySet ps = createTestPropertySet(emptyPropertyProvider); Property p = ps.getProperty(pd); assertTrue(p.wasEmpty()); } /** * Tests property toString(). * @param pd definition of property to test */ @Test(dataProvider = "propertyDefinitionData") public void testToString1(PropertyDefinition pd) { PropertySet ps = createTestPropertySet(); Property p = ps.getProperty(pd); p.toString(); } private PropertySet createTestPropertySet(PropertyProvider pp) { ManagedObjectDefinition d = new TestManagedObjectDefinition<>("test-mod", null); PropertySet ps = new PropertySet(); for (PropertyDefinition pd : d.getPropertyDefinitions()) { addProperty(ps, pd, pp); } return ps; } private void addProperty(PropertySet ps, PropertyDefinition pd, PropertyProvider pp) { Collection defaultValues = new LinkedList<>(); DefaultBehaviorProvider dbp = pd.getDefaultBehaviorProvider(); if (dbp instanceof DefinedDefaultBehaviorProvider) { DefinedDefaultBehaviorProvider ddbp = (DefinedDefaultBehaviorProvider) dbp; Collection stringValues = ddbp.getDefaultValues(); for (String sv : stringValues) { defaultValues.add(pd.decodeValue(sv)); } } Collection activeValues = pp.getPropertyValues(pd); ps.addProperty(pd, defaultValues, activeValues); } private class TestManagedObjectDefinition extends ManagedObjectDefinition { /** * Create a new managed object definition. * * @param name The name of the definition. * @param parent The parent definition, or null if there * is no parent. */ protected TestManagedObjectDefinition(String name, AbstractManagedObjectDefinition parent) { super(name, parent); registerPropertyDefinition(testBoolPropertyDefinition); registerPropertyDefinition(testSvStringPropertyDefinition); registerPropertyDefinition(testMvStringPropertyDefinition); } /** {@inheritDoc} */ @Override public C createClientConfiguration(ManagedObject managedObject) { System.out.println("createClientConfiguration mo=" + managedObject); return null; } /** {@inheritDoc} */ @Override public S createServerConfiguration(ServerManagedObject serverManagedObject) { System.out.println("createServerConfiguration smo=" + serverManagedObject); return null; } /** {@inheritDoc} */ @Override public Class getServerConfigurationClass() { System.out.println("getServerConfigurationClass"); return null; } } private class TestPropertyProvider implements PropertyProvider { PropertyDefinition pd; Collection values; public TestPropertyProvider(PropertyDefinition pd, Collection values) { this.pd = pd; this.values = values; } @Override @SuppressWarnings("unchecked") public Collection getPropertyValues(PropertyDefinition d) throws IllegalArgumentException { if (d.equals(pd)) { return (Collection) values; } else { return Collections.emptySet(); } } } private PropertySet createTestPropertySet() { return createTestPropertySet(PropertyProvider.DEFAULT_PROVIDER); } }