Revision 229 (by dpavlin, 2008/06/27 19:31:49) A3C::LDAP::Server now function as full-featured LDAP relay server

- move code from bin/ldap-server.pl to A3C::LDAP::Server
- save cache of ldap searches (currently for debugging only,
but I can envision falling back to cache if upstream
server is unavailable)
- added ability to fork server in background (used in tests)
#!/usr/bin/env perl
use warnings;
use strict;

=head1 DESCRIPTION

test LDAP server

=cut

use Jifty::Test tests => 18;
use Data::Dump qw/dump/;

use_ok('A3C::LDAP::Server');

my $port = 1024 + int(rand(1024));

diag "using port $port";

ok( my $pid = A3C::LDAP::Server->run({ port => $port, fork => 1 }), "run( port => $port )" );

diag "got pid: $pid";

#isa_ok( $pid, 'A3C::LDAP::Server' );

cmp_ok( $A3C::LDAP::Server::pids->{$port}, '==', $pid, 'pids' );

ok( my $ldap = Net::LDAP->new( "localhost:$port" ), 'connect to server' );

ok( my $c = Jifty->config->app('LDAP'), 'ldap config' );

ok( $ldap->bind( $c->{dn}, password => $c->{password} ), 'bind' );

ok( my $msg = $ldap->search(
	base => $c->{base},
	attrs => [
		"uid",
		"cn",
		"hrEduPersonUniqueID",
		"mail",
		"sn",
		"givenName",
		"hrEduPersonUniqueNumber",
		"hrEduPersonExpireDate",
		"wtAdminType",
		"hrEduPersonHomeOrg",
		"uidNumber",
	],
	filter => bless {
		equalityMatch => {
			assertionValue => "dobrica.pavlinusic2\@os-test0802f1-zg.skole.hr",
			attributeDesc  => "hrEduPersonUniqueID",
		},
	}, 'Net::LDAP::Filter',
), 'search hrEduPersonUniqueID' );

ok( my @entries = $msg->entries, 'entries' );
is( scalar @entries, 1, 'got 1 entry' );

diag dump( @entries );

is_deeply( shift @entries, bless({
  asn => {
        attributes => [
                        { type => "hrEduPersonUniqueNumber", vals => ["JMBG: 0000000000000"] },
                        { type => "sn", vals => ["Pavlinu\xC5\xA1i\xC4\x87"] },
                        { type => "hrEduPersonHomeOrg", vals => ["os-test0802f1-zg"] },
                        { type => "cn", vals => ["Dobrica Pavlinu\xC5\xA1i\xC4\x87"] },
                        { type => "hrEduPersonExpireDate", vals => [20100901] },
                        { type => "uid", vals => ["dobrica.pavlinusic2"] },
                        {
                          type => "hrEduPersonUniqueID",
                          vals => ["dobrica.pavlinusic2\@os-test0802f1-zg.skole.hr"],
                        },
                        { type => "wtAdminType", vals => ["AS"] },
                        { type => "uidNumber", vals => [339069] },
                        {
                          type => "mail",
                          vals => [
                                    "dobrica.pavlinusic2\@skole.hr",
                                    "dobrica.pavlinusic2\@os-test0802f1-zg.skole.hr",
                                  ],
                        },
                        { type => "givenName", vals => ["Dobrica"] },
                      ],
        objectName => "uid=dobrica.pavlinusic2,dc=os-test0802f1-zg,dc=skole,dc=hr",
      },
  changes => [],
  changetype => "modify",
}, "Net::LDAP::Entry"),
'entry' );

ok( $msg = $ldap->search(
	base => $c->{base},
	attrs => [
		"dn",
	],
	filter => bless {
		equalityMatch => { assertionValue => "dobrica.pavlinusic2", attributeDesc => "uid" },
	}, 'Net::LDAP::Filter',
), 'search uid' );

ok( @entries = $msg->entries, 'entries' );
is( scalar @entries, 1, 'got 1 entry' );

diag dump( @entries );

is_deeply( shift @entries,
	bless({
	  asn => {
			attributes => [],
			objectName => "uid=dobrica.pavlinusic2,dc=os-test0802f1-zg,dc=skole,dc=hr",
		  },
	  changes => [],
	  changetype => "modify",
	}, "Net::LDAP::Entry")
, 'entry' );

ok( $msg = $ldap->search(
	base => $c->{base},
	attrs => [
		"dn",
	],
	filter => bless {
		equalityMatch => { assertionValue => "non-existant", attributeDesc => "uid" },
	}, 'Net::LDAP::Filter',
), 'search non-existant' );

cmp_ok( $msg->entries, '==', 0, 'no results' );

ok( A3C::LDAP::Server->stop, 'stop' );

ok( ! kill(9,$pid), "$pid gone" );