mourningdove/t/uniqcookie.t
2026-05-24 01:03:05 +00:00

208 lines
5.9 KiB
Perl

# t/uniqcookie.t
#
# Test LJ::UniqCookie.
#
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
use strict;
use warnings;
use Test::More tests => 48;
BEGIN { $LJ::_T_CONFIG = 1; require "$ENV{LJHOME}/cgi-bin/ljlib.pl"; }
use LJ::Test qw(temp_user memcache_stress);
use LJ::UniqCookie;
sub run_tests {
my $class = "LJ::UniqCookie";
my $get_uniq = sub {
$class->generate_uniq_ident;
};
# tell LJ::UniqCookie how to generate unixtimes for uniqmap rows
my $time_ct = time() - 30;
$LJ::_T_UNIQCOOKIE_MODTIME_CB = sub {
return $time_ct++;
};
# don't lazy clean until we're ready to explicitly test it
$LJ::_T_UNIQCOOKIE_LAZY_CLEAN_PCT = -1;
{ # one uniq, one user
my $u = temp_user();
my $uniq = $get_uniq->();
ok( $class->save_mapping( $uniq => $u ), "saved mapping" );
my $uid = $class->load_mapping( uniq => $uniq );
ok( $uid == $u->id, "loaded by uniq" );
my $new_uniq = $class->load_mapping( user => $u );
ok( $new_uniq eq $uniq, "loaded by u ser" );
$LJ::_T_UNIQCOOKIE_CURRENT_UNIQ = $uniq;
my $g_remote = $class->guess_remote;
ok( $u->equals($g_remote), "guessed correct remote" );
}
{ # multiple uniqs, same user
my $u = temp_user();
my @added_uniqs;
foreach ( 1 .. 5 ) {
my $uniq = $get_uniq->();
$class->save_mapping( $uniq => $u );
push @added_uniqs, $uniq;
}
my @got_uniqs = $class->load_mapping( user => $u );
ok( eq_set( \@added_uniqs, \@got_uniqs ), "got multiple uniqs for a user" );
}
{ # multiple users, same uniq
my $uniq = $get_uniq->();
my @userids;
foreach ( 1 .. 5 ) {
my $u = temp_user();
$class->save_mapping( $uniq => $u );
push @userids, $u->id;
}
my @got_userids = $class->load_mapping( uniq => $uniq );
ok( eq_set( \@got_userids, \@userids ), "got multiple users for a uniq" );
}
{ # multiple uniqs, multiple users
my $u = temp_user();
my $u2 = temp_user();
my @uniq_added;
my @uniq_added_u2;
foreach ( 1 .. 5 ) {
my $uniq = $get_uniq->();
$class->save_mapping( $uniq => $u );
push @uniq_added, $uniq;
if ( rand() > 0.5 ) {
$class->save_mapping( $uniq => $u2 );
push @uniq_added_u2, $uniq;
}
}
my @uniq_list = $class->load_mapping( user => $u );
ok( eq_set( \@uniq_added, \@uniq_list ), "saved some uniqs, got the same back" );
my @uniq_list2 = $class->load_mapping( user => $u2 );
ok( eq_set( \@uniq_added, \@uniq_list ), "saved uniqs to another user, got the same back" );
}
# set up a delete callback which will tell us the number
# of rows deleted in the last cleaning operation
my $last_delete_ct = 0;
$LJ::_T_UNIQCOOKIE_DELETE_CB = sub {
my ( $type, $ct ) = @_;
$last_delete_ct = $ct;
};
{ # cleaning per-user
my $u = temp_user();
my @added_uniqs;
foreach ( 1 .. 25 ) {
my $uniq = $get_uniq->();
$class->save_mapping( $uniq => $u );
push @added_uniqs, $uniq;
}
my @got_uniqs = $class->load_mapping( user => $u );
my @added_trim = ( reverse @added_uniqs )[ 0 .. 9 ];
ok( eq_set( \@added_trim, \@got_uniqs ), "cleaned multiple uniqs for a user" );
ok( $last_delete_ct == 15, "deleted correct number of rows by user" );
# shouldn't clean this time around
LJ::DB::no_cache(
sub {
$class->clear_request_cache;
$class->load_mapping( user => $u );
}
);
ok( $last_delete_ct == 0, "loaded by user without redundant cleaning" );
}
{ # cleaning per-uniq
my $uniq = $get_uniq->();
my @userids;
foreach ( 1 .. 25 ) {
my $u = temp_user();
$class->save_mapping( $uniq => $u );
push @userids, $u->id;
}
my @got_userids = $class->load_mapping( uniq => $uniq );
my @userids_trim = ( reverse @userids )[ 0 .. 9 ];
ok( eq_set( \@userids_trim, \@got_userids ), "cleaned multiple users for a uniq" );
ok( $last_delete_ct == 15, "deleted correct number of rows by uniq" );
# shouldn't clean this time around
LJ::DB::no_cache(
sub {
$class->clear_request_cache;
$class->load_mapping( uniq => $uniq );
}
);
ok( $last_delete_ct == 0, "loaded by uniq without redundant cleaning" );
}
{ # lazy cleaning
my $u = temp_user();
my $dirty = 0;
$last_delete_ct = 0; # reset this
foreach ( 1 .. 25 ) {
my $uniq = $get_uniq->();
$class->save_mapping( $uniq, $u );
# ... but there should be 0 rows deleted
$dirty = 1 if $last_delete_ct > 0;
}
ok( !$dirty, "lazy cleaning rand-false case works" );
# ready to test this, let's set it on now
$LJ::_T_UNIQCOOKIE_LAZY_CLEAN_PCT = 1.00;
my $uniq = $get_uniq->();
$class->save_mapping( $uniq, $u );
ok( $last_delete_ct > 0, "lazy cleaning rand-true case works" );
}
}
memcache_stress {
run_tests();
};