diff options
author | Tobi Oetiker <tobi@oetiker.ch> | 2007-11-14 18:33:19 +0100 |
---|---|---|
committer | Tobi Oetiker <tobi@oetiker.ch> | 2007-11-14 18:33:19 +0100 |
commit | ff7b9de82908baf1d5f9af71e35dad2369bfdc2f (patch) | |
tree | 1f9821bf2323786cbe68b4d3b0964ca449332766 /qooxdoo/source/perl/CGI/Session/Test/Default.pm | |
parent | d546419d19b89633f8ac3c461eb900f4c4f29b90 (diff) | |
download | smokeping-ff7b9de82908baf1d5f9af71e35dad2369bfdc2f.tar.gz smokeping-ff7b9de82908baf1d5f9af71e35dad2369bfdc2f.tar.xz |
initial qooxdoo drop for smokeping
Diffstat (limited to 'qooxdoo/source/perl/CGI/Session/Test/Default.pm')
-rw-r--r-- | qooxdoo/source/perl/CGI/Session/Test/Default.pm | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/qooxdoo/source/perl/CGI/Session/Test/Default.pm b/qooxdoo/source/perl/CGI/Session/Test/Default.pm new file mode 100644 index 0000000..5eca1a3 --- /dev/null +++ b/qooxdoo/source/perl/CGI/Session/Test/Default.pm @@ -0,0 +1,426 @@ +package CGI::Session::Test::Default; + +use strict; +use Carp; +use Test::More (); +use Data::Dumper; +use Scalar::Util "refaddr"; + +our $AUTOLOAD; +our $CURRENT; +sub ok_later (&;$); + + +$CGI::Session::Test::Default::VERSION = '4.20'; + +=head1 CGI::Session::Test::Default + +Run a suite of tests for a given CGI::Session::Driver + +=head2 new() + + my $t = CGI::Session::Test::Default->new( + # These are all optional, with default as follows + dsn => "driver:file", + args => undef, + tests => 77, + ); + +Create a new test object, possibly overriding some defaults. + +=cut + +sub new { + my $class = shift; + my $self = bless { + dsn => "driver:file", + args => undef, + tests => 101, + test_number => 0, + @_ + }, $class; + + if($self->{skip}) { + $self->{_skip} = { map { $_ => $_ } @{$self->{skip}} }; + } else { + $self->{_skip} = {}; + } + + return $self; +} + +=head2 number_of_tests() + + my $new_num = $t->number_of_tests($new_num); + +A setter/accessor method to affect the number of tests to run, +after C<new()> has been called and before C<run()>. + +=cut + +sub number_of_tests { + my $self = shift; + + if ( @_ ) { + $self->{tests} = $_[0]; + } + + return $self->{tests}; +} + +=head2 run() + + $t->run(); + +Run the test suite. See C<new()> for setting related options. + +=cut + +sub run { + my $self = shift; + + $CURRENT = $self; + use_ok("CGI::Session", "CGI::Session loaded successfully!"); + + my $sid = undef; + FIRST: { + ok(1, "=== 1 ==="); + my $session = CGI::Session->load() or die CGI::Session->errstr; + ok($session, "empty session should be created"); + ok(!$session->id); + ok($session->is_empty); + ok(!$session->is_expired); + + undef $session; + + $session = CGI::Session->new($self->{dsn}, '_DOESN\'T EXIST_', $self->{args}) or die CGI::Session->errstr; + ok( $session, "Session created successfully!"); + + # + # checking if the driver object created is really the driver requested: + # + my $dsn = $session->parse_dsn( $self->{dsn} ); + ok( ref $session->_driver eq "CGI::Session::Driver::" . $dsn->{driver}, ref $dsn->{Driver} ); + + ok( $session->ctime && $session->atime, "ctime & atime are set"); + ok( $session->atime == $session->ctime, "ctime == atime"); + ok( !$session->etime, "etime not set yet"); + + ok( $session->id, "session id is " . $session->id); + + $session->param('author', "Sherzod Ruzmetov"); + $session->param(-name=>'emails', -value=>['sherzodr@cpan.org', 'sherzodr@handalak.com']); + $session->param('blogs', { + './lost+found' => 'http://author.handalak.com/', + 'Yigitlik sarguzashtlari' => 'http://author.handalak.com/uz/' + }); + + ok( ($session->param) == 3, "session holds 3 params" . scalar $session->param ); + ok( $session->param('author') eq "Sherzod Ruzmetov", "My name's correct!"); + + ok( ref ($session->param('emails')) eq 'ARRAY', "'emails' holds list of values" ); + ok( @{ $session->param('emails') } == 2, "'emails' holds list of two values"); + ok( $session->param('emails')->[0] eq 'sherzodr@cpan.org', "first value of 'emails' is correct!"); + ok( $session->param('emails')->[1] eq 'sherzodr@handalak.com', "second value of 'emails' is correct!"); + + ok( ref( $session->param('blogs') ) eq 'HASH', "'blogs' holds a hash"); + ok( $session->param('blogs')->{'./lost+found'} eq 'http://author.handalak.com/', "first blog is correct"); + ok( $session->param('blogs')->{'Yigitlik sarguzashtlari'} eq 'http://author.handalak.com/uz/', "second blog is correct"); + + $sid = $session->id; + $session->flush(); + } + + sleep(1); + + SECOND: { + SKIP: { + ok(1, "=== 2 ==="); + my $session; + eval { $session = CGI::Session->load($self->{dsn}, $sid, $self->{args}) }; + + if ($@ || CGI::Session->errstr) { + Test::More::skip("couldn't load session, bailing out: SQLite/Storable support is TODO", 56); + } + + is($@.CGI::Session->errstr,'','survived eval without error.'); + ok($session, "Session was retrieved successfully"); + ok(!$session->is_expired, "session isn't expired yet"); + + is($session->id,$sid, "session IDs are consistent"); + ok($session->atime > $session->ctime, "ctime should be older than atime"); + ok(!$session->etime, "etime shouldn't be set yet"); + + ok( ($session->param) == 3, "session should hold params" ); + ok( $session->param('author') eq "Sherzod Ruzmetov", "my name's correct"); + + ok( ref ($session->param('emails')) eq 'ARRAY', "'emails' should hold list of values" ); + ok( @{ $session->param('emails') } == 2, "'emails' should hold list of two values"); + ok( $session->param('emails')->[0] eq 'sherzodr@cpan.org', "first value is correct!"); + ok( $session->param('emails')->[1] eq 'sherzodr@handalak.com', "second value is correct!"); + + ok( ref( $session->param('blogs') ) eq 'HASH', "'blogs' holds a hash"); + ok( $session->param('blogs')->{'./lost+found'} eq 'http://author.handalak.com/', "first blog is correct!"); + ok( $session->param('blogs')->{'Yigitlik sarguzashtlari'} eq 'http://author.handalak.com/uz/', "second blog is correct!"); + + # TODO: test many any other variations of expire() syntax + $session->expire('+1s'); + ok($session->etime == 1, "etime set to 1 second"); + + $session->expire("+1m"); + ok($session->etime == 60, "etime set to one minute"); + + $session->expires("2h"); + ok($session->etime == 7200, "etime set to two hours"); + + $session->expires("5d"); + ok($session->etime == 432000, "etime set to 5 days"); + + $session->expires("-10s"); + ok($session->etime == -10, "etime set to 10 seconds in the past"); + + # + # Setting the expiration time back to 1s, so that subsequent tests + # relying on this value pass + # + $session->expire("1s"); + ok($session->etime == 1, "etime set back to one second"); + eval { $session->close(); }; + is($@, '', 'calling close method survives eval'); + } + } + + sleep(1); # <-- letting the time tick + + my $driver; + THREE: { + ok(1, "=== 3 ==="); + my $session = CGI::Session->load($self->{dsn}, $sid, $self->{args}) or die CGI::Session->errstr; + ok($session, "Session instance loaded "); + ok(!$session->id, "session doesn't have ID"); + ok($session->is_empty, "session is empty, which is the same as above"); + #print $session->dump; + ok($session->is_expired, "session was expired"); + ok(!$session->param('author'), "session data cleared"); + + sleep(1); + + $session = $session->new() or die CGI::Session->errstr; + #print $session->dump(); + ok($session, "new session created"); + ok($session->id, "session has id :" . $session->id ); + ok(!$session->is_expired, "session isn't expired"); + ok(!$session->is_empty, "session isn't empty"); + ok($session->atime == $session->ctime, "access and creation times are same"); + + ok($session->id ne $sid, "it's a completely different session than above"); + + $driver = $session->_driver(); + $sid = $session->id; + } + + + + FOUR: { + # We are intentionally removing the session stored in the datastore and will be requesting + # re-initialization of that id. This test is necessary since I noticed weird behaviors in + # some of my web applications that kept creating new sessions when the object requested + # wasn't in the datastore. + ok(1, "=== 4 ==="); + + ok($driver->remove( $sid ), "Session '$sid' removed from datastore successfully"); + + my $session = CGI::Session->new($self->{dsn}, $sid, $self->{args} ) or die CGI::Session->errstr; + ok($session, "session object created successfully"); + ok($session->id ne $sid, "claimed ID ($sid) couldn't be recovered. New ID is: " . $session->id); + $sid = $session->id; + } + + + + FIVE: { + ok(1, "=== 5 ==="); + my $session = CGI::Session->new($self->{dsn}, $sid, $self->{args}) or die CGI::Session->errstr; + ok($session, "Session object created successfully"); + ok($session->id eq $sid, "claimed id ($sid) was recovered successfully!"); + + # Remove the object, finally! + $session->delete(); + } + + + SIX: { + ok(1, "=== 6 ==="); + my $session = CGI::Session->new($self->{dsn}, $sid, $self->{args}) or die CGI::Session->errstr; + ok($session, "Session object created successfully"); + ok($session->id ne $sid, "New object created, because previous object was deleted"); + $sid = $session->id; + + # + # creating a simple object to be stored into session + my $simple_class = SimpleObjectClass->new(); + ok($simple_class, "SimpleObjectClass created successfully"); + + $simple_class->name("Sherzod Ruzmetov"); + $simple_class->emails(0, 'sherzodr@handalak.com'); + $simple_class->emails(1, 'sherzodr@cpan.org'); + $simple_class->blogs('lost+found', 'http://author.handalak.com/'); + $simple_class->blogs('yigitlik', 'http://author.handalak.com/uz/'); + $session->param('simple_object', $simple_class); + + ok($session->param('simple_object')->name eq "Sherzod Ruzmetov"); + ok($session->param('simple_object')->emails(1) eq 'sherzodr@cpan.org'); + ok($session->param('simple_object')->blogs('yigitlik') eq 'http://author.handalak.com/uz/'); + + # + # creating an overloaded object to be stored into session + my $overloaded_class = OverloadedObjectClass->new("ABCDEFG"); + ok($overloaded_class, "OverloadedObjectClass created successfully"); + ok(overload::Overloaded($overloaded_class) , "OverloadedObjectClass is properly overloaded"); + ok(ref ($overloaded_class) eq "OverloadedObjectClass", "OverloadedObjectClass is an object"); + $session->param("overloaded_object", $overloaded_class); + + ok($session->param("overloaded_object") eq "ABCDEFG"); + + my $simple_class2 = SimpleObjectClass->new(); + ok($simple_class2, "SimpleObjectClass created successfully"); + + $simple_class2->name("Sherzod Ruzmetov"); + $simple_class2->emails(0, 'sherzodr@handalak.com'); + $simple_class2->emails(1, 'sherzodr@cpan.org'); + $simple_class2->blogs('lost+found', 'http://author.handalak.com/'); + $simple_class2->blogs('yigitlik', 'http://author.handalak.com/uz/'); + my $embedded = OverloadedObjectClass->new("Embedded"); + $session->param("embedded_simple_and_overloaded",[ undef, $simple_class2, $embedded, $embedded ]); + + ok(!defined($session->param("embedded_simple_and_overloaded")->[0]),"First element of anonymous array undef"); + + ok($session->param("embedded_simple_and_overloaded")->[1]->name eq "Sherzod Ruzmetov"); + ok($session->param("embedded_simple_and_overloaded")->[1]->emails(1) eq 'sherzodr@cpan.org'); + ok($session->param("embedded_simple_and_overloaded")->[1]->blogs('yigitlik') eq 'http://author.handalak.com/uz/'); + + ok($session->param("embedded_simple_and_overloaded")->[2] eq "Embedded"); + + ok(refaddr($session->param("embedded_simple_and_overloaded")->[2]) == refaddr($session->param("embedded_simple_and_overloaded")->[3] ), + "Overloaded objects have matching addresses"); + } + + + SEVEN: { + ok(1, "=== 7 ==="); + my $session = CGI::Session->new($self->{dsn}, $sid, $self->{args}) or die CGI::Session->errstr; + ok($session, "Session object created successfully"); + ok($session->id eq $sid, "Previously stored object loaded successfully"); + + + my $simple_object = $session->param("simple_object"); + ok(ref $simple_object eq "SimpleObjectClass", "SimpleObjectClass loaded successfully"); + + my $dsn = CGI::Session->parse_dsn($self->{dsn}); + ok_later { $simple_object->name eq "Sherzod Ruzmetov" }; + ok_later { $simple_object->emails(1) eq 'sherzodr@cpan.org' }; + ok_later { $simple_object->emails(0) eq 'sherzodr@handalak.com' }; + ok_later { $simple_object->blogs('lost+found') eq 'http://author.handalak.com/' }; + ok(ref $session->param("overloaded_object") ); + ok($session->param("overloaded_object") eq "ABCDEFG", "Object is still overloaded"); + ok(overload::Overloaded($session->param("overloaded_object")), "Object is really overloaded"); + + ok(!defined($session->param("embedded_simple_and_overloaded")->[0]),"First element of anonymous array undef"); + + my $simple_object2 = $session->param("embedded_simple_and_overloaded")->[1]; + ok(ref $simple_object2 eq "SimpleObjectClass", "SimpleObjectClass loaded successfully"); + + ok_later { $simple_object2->name eq "Sherzod Ruzmetov" }; + ok_later { $simple_object2->emails(1) eq 'sherzodr@cpan.org' }; + ok_later { $simple_object2->emails(0) eq 'sherzodr@handalak.com' }; + ok_later { $simple_object2->blogs('lost+found') eq 'http://author.handalak.com/' }; + + + ok($session->param("embedded_simple_and_overloaded")->[2] eq "Embedded"); + ok(overload::Overloaded($session->param("embedded_simple_and_overloaded")->[2]), "Object is really overloaded"); + + ok(refaddr($session->param("embedded_simple_and_overloaded")->[2]) == refaddr($session->param("embedded_simple_and_overloaded")->[3]), + "Overloaded objects have matching addresses"); + $session->delete(); + } + + $CURRENT = undef; + $self->{test_number} = 0; +} + +sub skip_or_run { + my $test = shift; + + $CURRENT->{test_number} ++; + + SKIP: { + if($CURRENT->{_skip}->{$CURRENT->{test_number}}) { + Test::More::skip("Test does not apply to this setup.", 1); + } + + no strict 'refs'; + &{"Test::More::$test"}(@_); + } +} + +sub ok { skip_or_run("ok", @_); } +sub use_ok { skip_or_run("use_ok", @_); } +sub is { skip_or_run("is", @_); } + +sub ok_later (&;$) { + my($code, $name) = @_; + + $CURRENT->{test_number} ++; + $name = '' unless $name; + + SKIP: { + if($CURRENT->{_skip}->{$CURRENT->{test_number}}) { + Test::More::skip("Test does not apply to this setup.", 1); + fail($name); + } else { + Test::More::ok($code->(), $name); + } + } +} + +sub DESTROY { 1; } + + +package SimpleObjectClass; +use strict; +use Class::Struct; + +struct ( + name => '$', + emails => '@', + blogs => '%' +); + + + +package OverloadedObjectClass; + +use strict; +use overload ( + '""' => \&as_string, + 'eq' => \&equals +); + +sub new { + return bless { + str_value => $_[1] + }, $_[0]; +} + + +sub as_string { + return $_[0]->{str_value}; +} + +sub equals { + my ($self, $arg) = @_; + + return ($self->as_string eq $arg); +} + +1; |