/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Unit test for {@link DnParser}.
*
* @author Middleware Services
*/
public class DnParserTest
{
/**
* DN test data.
*
* @return test data
*/
@DataProvider(name = "DNs")
public Object[][] createDNs()
{
return
new Object[][] {
/* single value DN */
new Object[] {
"UID=jsmith",
"uid",
"jsmith",
},
/* multi value DN */
new Object[] {
"UID=jsmith,DC=ldaptive,DC=org",
"uid",
"jsmith",
},
/* whitespace */
new Object[] {
" UID = jsmith ,DC=ldaptive,DC=org",
"Uid",
"jsmith",
},
/* case sensitivity */
new Object[] {
"CN=Jim Smith,UID=jsmith,DC=ldaptive,DC=org",
"UId",
"jsmith",
},
/* multi value RDN */
new Object[] {
"OU=Sales+CN=J. Smith,DC=ldaptive,DC=org",
"ou",
"Sales",
},
new Object[] {
"OU=Sales+CN=J. Smith,DC=ldaptive,DC=org",
"cn",
"J. Smith",
},
/* escaped data */
new Object[] {
"CN=James \"Jim\" Smith\\, III,DC=ldaptive,DC=org",
"CN",
"James \"Jim\" Smith, III",
},
new Object[] {
"OU=Sales\\; Data\\+Algorithms,DC=ldaptive,DC=org",
"OU",
"Sales; Data+Algorithms",
},
/* encoded data */
new Object[] {
"CN=\\23John Smith\\20,DC=ldaptive,DC=org",
"CN",
"#John Smith ",
},
new Object[] {
"CN=Lu\\C4\\8Di\\C4\\87",
"cn",
"Lučić",
},
new Object[] {
"CN=Lu\\C4\\8D\\C4\\8Di\\C4\\87",
"cn",
"Luččić",
},
new Object[] {
"CN=Lu\\C4\\8D\\C4\\8Di\\C4\\87o",
"cn",
"Luččićo",
},
new Object[] {
"CN=\\C4\\87Lu\\C4\\8D\\C4\\8Di\\C4\\87o",
"cn",
"ćLuččićo",
},
new Object[] {
"1.3.6.1.4.1.1466.0=#04024869,DC=ldaptive,DC=org",
"1.3.6.1.4.1.1466.0",
"Hi",
},
new Object[] {
"0.9.2342.19200300.100.1.1=#04066A736D697468,DC=ldaptive,DC=org",
"0.9.2342.19200300.100.1.1",
"jsmith",
},
/* invalid DNs, but can be parsed */
new Object[] {
"UID=jsmith,,DC=ldaptive,DC=org",
",dc",
"ldaptive",
},
new Object[] {
"UID=john\\?smith",
"uid",
"john?smith",
},
new Object[] {
"UID=john\\GGsmith",
"uid",
"johnGGsmith",
},
new Object[] {
"UID=john\\",
"uid",
"john",
},
};
}
/**
* DN test data.
*
* @return test data
*/
@DataProvider(name = "invalidDNs")
public Object[][] createInvalidDNs()
{
return
new Object[][] {
/* invalid hex */
new Object[] {"1.1.1=#GG", },
new Object[] {"1.1.1=#000", },
new Object[] {"1.1.1=#F", },
new Object[] {"1.1.1=#", },
/* unescaped characters*/
new Object[] {"UID=john,smith", },
new Object[] {"UID=john+smith", },
new Object[] {"UID=john\\Fsmith", },
/* missing equals */
new Object[] {"UID", },
new Object[] {"UID:jsmith", },
/* missing value */
new Object[] {"UID=", },
new Object[] {"UID = ", },
};
}
/**
* @param dn to parse
* @param name of an attribute to test
* @param value of an attribute to test
*
* @throws Exception On test failure.
*/
@Test(groups = {"dnParser"}, dataProvider = "DNs")
public void testParsing(final String dn, final String name, final String value)
throws Exception
{
Assert.assertEquals(DnParser.getValue(dn, name), value);
}
/**
* @param dn to parse
*
* @throws Exception On test failure.
*/
@Test(groups = {"dnParser"}, dataProvider = "invalidDNs")
public void testInvalidParsing(final String dn)
throws Exception
{
try {
DnParser.getValue(dn, "");
Assert.fail("Should have thrown IllegalArgumentException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IllegalArgumentException.class);
}
}
/** @throws Exception On test failure. */
@Test(groups = {"dnParser"})
public void testSubstring()
throws Exception
{
final String dn = "CN=Jim Smith,UID=jsmith,DC=ldaptive,DC=org";
try {
DnParser.substring(dn, -1);
Assert.fail("Should have thrown IndexOutOfBoundsException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IndexOutOfBoundsException.class);
}
Assert.assertEquals(DnParser.substring(dn, 0), "CN=Jim Smith,UID=jsmith,DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 1), "UID=jsmith,DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 2), "DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 3), "DC=org");
try {
DnParser.substring(dn, 4);
Assert.fail("Should have thrown IndexOutOfBoundsException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IndexOutOfBoundsException.class);
}
}
/** @throws Exception On test failure. */
@Test(groups = {"dnParser"})
public void testSubstringEndIndex()
throws Exception
{
final String dn = "CN=Jim Smith,UID=jsmith,DC=ldaptive,DC=org";
try {
DnParser.substring(dn, -1, 0);
Assert.fail("Should have thrown IndexOutOfBoundsException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IndexOutOfBoundsException.class);
}
try {
DnParser.substring(dn, 2, 1);
Assert.fail("Should have thrown IndexOutOfBoundsException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IndexOutOfBoundsException.class);
}
Assert.assertEquals(DnParser.substring(dn, 0, 4), "CN=Jim Smith,UID=jsmith,DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 1, 4), "UID=jsmith,DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 2, 4), "DC=ldaptive,DC=org");
Assert.assertEquals(DnParser.substring(dn, 3, 4), "DC=org");
Assert.assertEquals(DnParser.substring(dn, 0, 1), "CN=Jim Smith");
Assert.assertEquals(DnParser.substring(dn, 1, 2), "UID=jsmith");
Assert.assertEquals(DnParser.substring(dn, 2, 3), "DC=ldaptive");
Assert.assertEquals(DnParser.substring(dn, 3, 4), "DC=org");
Assert.assertEquals(DnParser.substring(dn, 0, 2), "CN=Jim Smith,UID=jsmith");
Assert.assertEquals(DnParser.substring(dn, 2, 4), "DC=ldaptive,DC=org");
try {
DnParser.substring(dn, 1, 5);
Assert.fail("Should have thrown IndexOutOfBoundsException");
} catch (Exception e) {
Assert.assertEquals(e.getClass(), IndexOutOfBoundsException.class);
}
}
}