You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
5.2 KiB
161 lines
5.2 KiB
#!/usr/bin/env perl -I pl/lib
|
|
|
|
use Test::More;
|
|
use JSON::MaybeXS;
|
|
use strict;
|
|
use Lemonldap::NG::Common::Session;
|
|
|
|
eval { mkdir 't/sessions' };
|
|
`rm -rf t/sessions/*`;
|
|
require 't/test-lib.pm';
|
|
|
|
sub newSession {
|
|
my ( $uid, $ip ) = splice @_;
|
|
my $tmp;
|
|
ok(
|
|
$tmp = Lemonldap::NG::Common::Session->new(
|
|
{
|
|
storageModule => 'Apache::Session::File',
|
|
storageModuleOptions => {
|
|
Directory => 't/sessions',
|
|
generateModule =>
|
|
'Lemonldap::NG::Common::Apache::Session::Generate::SHA256',
|
|
},
|
|
}
|
|
),
|
|
'Sessions module'
|
|
);
|
|
count(1);
|
|
$tmp->update(
|
|
{ ipAddr => $ip, _whatToTrace => $uid, uid => $uid, _utime => time } );
|
|
return $tmp->{id};
|
|
}
|
|
|
|
# Single session access
|
|
my @ids;
|
|
$ids[0] = newSession( 'dwho', '127.10.0.1' );
|
|
$ids[1] = newSession( 'dwho2', '127.2.0.2' );
|
|
my $res = &client->jsonResponse("/sessions/global/$ids[0]");
|
|
ok( ( $res->{uid} and $res->{uid} eq 'dwho' ), 'Uid found' );
|
|
ok( ( $res->{ipAddr} and $res->{ipAddr} eq '127.10.0.1' ), 'IP found' );
|
|
count(2);
|
|
|
|
# "All" query
|
|
$res = &client->jsonResponse("/sessions/global/");
|
|
ok( $res->{result} == 1, 'Result code = 1' );
|
|
ok( $res->{count} == 2, 'Found 2 sessions' );
|
|
ok( @{ $res->{values} } == 2, 'List 2 sessions' );
|
|
ok( $res->{values}->[$_]->{session} =~ /^(?:$ids[0]|$ids[1])$/,
|
|
'Good session id' )
|
|
foreach ( 0 .. 1 );
|
|
count(5);
|
|
|
|
# GroupBy query
|
|
$res = &client->jsonResponse( '/sessions/global', 'groupBy=substr(uid,1)' );
|
|
ok( $res->{result} == 1, 'Result code = 1' );
|
|
ok( $res->{count} == 1, 'Found 1 entry' );
|
|
ok( $res->{values}->[0]->{value} && $res->{values}->[0]->{value} eq 'd',
|
|
'Result match "uid=d"' )
|
|
or print STDERR Dumper($res);
|
|
ok( $res->{values}->[0]->{count} == 2, 'Found 2 sessions starting with "d"' );
|
|
count(4);
|
|
|
|
$ids[2] = newSession( 'foo', '127.3.0.3' );
|
|
$res = &client->jsonResponse( '/sessions/global', 'groupBy=substr(uid,1)' );
|
|
ok( $res->{count} == 2, 'Found 2 entries' );
|
|
count(1);
|
|
|
|
# Filtered queries
|
|
$res = &client->jsonResponse( '/sessions/global', 'uid=d*' );
|
|
ok( $res->{count} == 2, 'Found 2 sessions' );
|
|
ok( $res->{values}->[$_]->{session} =~ /^(?:$ids[0]|$ids[1])$/,
|
|
'Good session id' )
|
|
foreach ( 0 .. 1 );
|
|
count(3);
|
|
$res = &client->jsonResponse( '/sessions/global', 'uid=f*' );
|
|
ok( $res->{count} == 1, 'Found 1 sessions' );
|
|
ok( $res->{values}->[0]->{session} eq $ids[2], 'Good session id' );
|
|
count(2);
|
|
|
|
# DoubleIp
|
|
$ids[3] = newSession( 'foo', '127.3.0.4' );
|
|
$res = &client->jsonResponse( '/sessions/global', 'doubleIp' );
|
|
ok( $res->{count} == 1, 'Found 1 user' );
|
|
ok( $res->{values}->[0]->{value} eq 'foo', 'User is foo' );
|
|
ok(
|
|
$res->{values}->[0]->{sessions}->[$_]->{session} =~ /^(?:$ids[2]|$ids[3])$/,
|
|
'Good session id'
|
|
) foreach ( 0 .. 1 );
|
|
count(4);
|
|
|
|
# New GroupBy query test with 4 sessions
|
|
$res = &client->jsonResponse( '/sessions/global', 'groupBy=uid' );
|
|
ok(
|
|
(
|
|
$res->{values}->[0]->{value} eq 'dwho'
|
|
and $res->{values}->[0]->{count} == 1
|
|
),
|
|
'1st user is dwho'
|
|
) or print STDERR Dumper($res);
|
|
ok(
|
|
(
|
|
$res->{values}->[1]->{value} eq 'dwho2'
|
|
and $res->{values}->[1]->{count} == 1
|
|
),
|
|
'2nd user is dwho2'
|
|
) or print STDERR Dumper($res);
|
|
ok(
|
|
(
|
|
$res->{values}->[2]->{value} eq 'foo'
|
|
and $res->{values}->[2]->{count} == 2
|
|
),
|
|
'3rd user is foo with 2 sessions'
|
|
) or print STDERR Dumper($res);
|
|
count(3);
|
|
|
|
# Ordered queries
|
|
$res = &client->jsonResponse( '/sessions/global', 'orderBy=uid' );
|
|
ok( $res->{values}->[0]->{uid} eq 'dwho', '1st user is dwho' );
|
|
ok( $res->{values}->[1]->{uid} eq 'dwho2', '2nd user is dwho2' );
|
|
ok( $res->{values}->[2]->{uid} eq 'foo', '3rd user is foo' );
|
|
ok( $res->{values}->[3]->{uid} eq 'foo', '4rd user is foo' );
|
|
count(4);
|
|
|
|
# IPv4 networks
|
|
$res = &client->jsonResponse( '/sessions/global', 'groupBy=net4(ipAddr,1)' );
|
|
ok( $res->{count} == 1, 'One A subnet' );
|
|
ok( $res->{values}->[0]->{count} == 4, 'All sessions found' );
|
|
$res = &client->jsonResponse( '/sessions/global', 'groupBy=net4(ipAddr,2)' );
|
|
ok( $res->{count} == 3, 'Three B subnet' );
|
|
ok( $res->{values}->[2]->{count} == 2, 'All sessions found' );
|
|
count(4);
|
|
|
|
$res = &client->jsonResponse( '/sessions/global', 'orderBy=net4(ipAddr)' );
|
|
ok( $res->{count} == 4, '4 sessions ordered' );
|
|
ok( $res->{values}->[0]->{session} eq $ids[1], '1st is id[1]' );
|
|
ok( $res->{values}->[1]->{session} eq $ids[2], '2nd is id[2]' );
|
|
ok( $res->{values}->[2]->{session} eq $ids[3], '3rd is id[3]' );
|
|
ok( $res->{values}->[3]->{session} eq $ids[0], '4rd is id[0]' );
|
|
count(5);
|
|
|
|
#print STDERR Dumper($res);
|
|
|
|
# Delete sessions
|
|
foreach (@ids) {
|
|
my $res;
|
|
ok( $res = &client->del("/sessions/global/$_"), "Delete $_" );
|
|
ok( $res->[0] == 200, 'Result code is 200' );
|
|
ok( decode_json( $res->[2]->[0] )->{result} == 1,
|
|
'Body is JSON and result==1' );
|
|
count(3);
|
|
}
|
|
|
|
opendir D, 't/sessions' or die 'Unknown dir';
|
|
my @files = grep { not /^\./ } readdir D;
|
|
ok( @files == 0, "Session directory is empty" );
|
|
count(1);
|
|
|
|
done_testing( count() );
|
|
|
|
# Remove sessions directory
|
|
`rm -rf t/sessions`;
|
|
|