The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use Test::More tests => 16;

use No::Worries::DN qw(dn_parse dn_string);

our(%DN, $dn, $format, $string);

$DN{No::Worries::DN::FORMAT_RFC2253()} = "CN=John Doe,O=Acme Corporation,C=US";
$DN{No::Worries::DN::FORMAT_JAVA()}    = "CN=John Doe, O=Acme Corporation, C=US";
$DN{No::Worries::DN::FORMAT_OPENSSL()} = "/C=US/O=Acme Corporation/CN=John Doe";

foreach $format (keys(%DN)) {
    $dn = dn_parse($DN{$format});
    ok($dn, "dn_parse($DN{$format})");
    $string = dn_string($dn, $format);
    is($DN{$format}, $string, "dn_string($DN{$format}, $format)");
}

# more complex valid DNs
foreach $string (
    "/O=grid/O=users/O=somewhere/CN=Peter Doe",
    "/DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=admin/CN=159427/CN=Robot: FOOBAR Admin/Email=foobar-admin\@cern.ch",
    "C=AT, O=AustrianGrid, OU=OEAWX, OU=oeawx-vienna, CN=host/wlcg321.oeawx.ac.at",
    "CN=host/wlcg123.sinp.msu.ru, OU=sinp.msu.ru, OU=hosts, O=RDIG, C=RU",
    "emailAddress=foo.support\@rl.ac.uk, CN=lnx123.pp.rl.ac.uk, L=RAL, OU=CLRC, O=eScience, C=UK",
) {
    $@ = "";
    eval { dn_parse($string) };
    is($@, "", "dn_parse($string) -> success");
}

# invalid DNs
foreach $string (
    "",
    "/abc=123",
    "C=IT/O=Vatican/OU=Host/L=Roma/CN=lx123.roma.it",
) {
    $@ = "";
    eval { dn_parse($string) };
    ok($@, "dn_parse($string) -> error");
}

# API errors
$@ = "";
eval { dn_parse([ 1, 2 ]) };
ok($@, "dn_parse([]) -> error");
$@ = "";
eval { dn_string("foo", "x") };
ok($@, "dn_string(foo, x) -> error");