/* * The contents of this file are subject to the terms of the Common Development and * Distribution License (the License). You may not use this file except in compliance with the * License. * * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the * specific language governing permission and limitations under the License. * * When distributing Covered Software, include this CDDL Header Notice in each file and include * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL * Header, with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyright [year] [name of copyright owner]". * * Copyright 2016 ForgeRock AS. */ package org.opends.server.api; import static org.opends.server.schema.SchemaConstants.*; import static org.testng.Assert.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import org.assertj.core.api.Assertions; import org.forgerock.i18n.LocalizableMessageBuilder; import org.forgerock.opendj.ldap.ByteString; import org.forgerock.opendj.ldap.DN; import org.forgerock.opendj.ldap.schema.AttributeType; import org.forgerock.opendj.ldap.schema.Syntax; import org.opends.server.TestCaseUtils; import org.opends.server.types.Attribute; import org.opends.server.types.DirectoryException; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** Tests for {@link MonitorData} class. */ @SuppressWarnings("javadoc") public class MonitorDataTestCase extends APITestCase { @BeforeClass public void setUp() throws Exception { TestCaseUtils.startFakeServer(); } @AfterClass public void tearDown() throws DirectoryException { TestCaseUtils.shutdownFakeServer(); } @Test public void verifyInferredAttributeSyntaxes() throws Exception { final MonitorData attrs = new MonitorData(); attrs.add("string", "this is a string"); attrs.add("bytestring", ByteString.valueOfUtf8("this is a string")); attrs.add("int", 1); attrs.add("long", 1L); attrs.add("float", 1f); attrs.add("double", 1d); attrs.add("boolean", true); attrs.add("dn", DN.valueOf("cn=test")); attrs.add("uuid", DN.valueOf("cn=test").toUUID()); attrs.add("date", new Date()); attrs.add("calender", Calendar.getInstance()); attrs.add("other", 'a'); assertSyntaxes(attrs); assertEquals(attrs.size(), 12); } private void assertSyntaxes(final MonitorData attrs) { for (Attribute attr : attrs) { final AttributeType attrType = attr.getAttributeDescription().getAttributeType(); final Syntax syntax = attrType.getSyntax(); switch (attrType.getNameOrOID()) { case "int": case "long": assertSyntax(attr, syntax, SYNTAX_INTEGER_OID); continue; case "string": case "bytestring": case "float": case "double": case "other": assertSyntax(attr, syntax, SYNTAX_DIRECTORY_STRING_OID); continue; case "boolean": assertSyntax(attr, syntax, SYNTAX_BOOLEAN_OID); continue; case "dn": assertSyntax(attr, syntax, SYNTAX_DN_OID); continue; case "date": case "calender": assertSyntax(attr, syntax, SYNTAX_GENERALIZED_TIME_OID); continue; case "uuid": assertSyntax(attr, syntax, SYNTAX_UUID_OID); continue; default: fail("Untested type: \"" + attrType.getNameOrOID() + "\""); } } } private void assertSyntax(Attribute attr, final Syntax syntax, String syntaxOid) { assertEquals(syntax.getOID(), syntaxOid, "For attribute: " + attr); final LocalizableMessageBuilder invalidReason = new LocalizableMessageBuilder(); final ByteString firstAttrValue = attr.iterator().next(); final boolean result = syntax.valueIsAcceptable(firstAttrValue, invalidReason); assertTrue(result, "For attribute: " + attr + " expected value to be acceptable, but got:" + invalidReason); } @Test public void addBean() throws Exception { class MyBean { // converted to attributes public int getint() { return 1; } public long getlong() { return 1; } public String getstring() { return "this is a test"; } public boolean isboolean() { return true; } // not converted to attributes public DN getAnother() { return DN.valueOf("cn=test"); } public DN isAnother() { return getAnother(); } } final MonitorData attrs = new MonitorData(); attrs.addBean(new MyBean(), ""); assertSyntaxes(attrs); List names = new ArrayList<>(); for (Attribute attr : attrs) { names.add(attr.getAttributeDescription().getAttributeType().getNameOrOID()); } Assertions.assertThat(names).containsOnly("int", "long", "string", "boolean"); assertEquals(attrs.size(), names.size()); } @Test public void addCollectionOfValues() throws Exception { final MonitorData attrs = new MonitorData(); attrs.add("string", Arrays.asList("this", "is", "a", "test")); final Iterator it = attrs.iterator(); assertTrue(it.hasNext()); final Attribute attr = it.next(); assertEquals(attr.getAttributeDescription().getAttributeType().getNameOrOID(), "string"); Assertions.assertThat(attr).containsExactly(bs("this"), bs("is"), bs("a"), bs("test")); assertFalse(it.hasNext()); } private ByteString bs(String s) { return ByteString.valueOfUtf8(s); } @Test public void addIfNotNull() throws Exception { final MonitorData attrs = new MonitorData(); attrs.addIfNotNull("string", null); assertEquals(attrs.size(), 0); final Iterator it1 = attrs.iterator(); assertFalse(it1.hasNext()); attrs.addIfNotNull("string", "this is a test"); assertEquals(attrs.size(), 1); final Iterator it2 = attrs.iterator(); assertTrue(it2.hasNext()); final Attribute attr = it2.next(); assertEquals(attr.getAttributeDescription().getAttributeType().getNameOrOID(), "string"); Assertions.assertThat(attr).containsExactly(bs("this is a test")); assertFalse(it2.hasNext()); } }