145 lines
4.8 KiB
Perl
145 lines
4.8 KiB
Perl
|
|
use FindBin;
|
|
use strict;
|
|
use lib "$FindBin::Bin/../../lib";
|
|
#use DB;
|
|
|
|
use WebGUI::Test;
|
|
use WebGUI::PassiveAnalytics::Rule;
|
|
|
|
use Test::More;
|
|
use Test::Deep;
|
|
use Data::Dumper;
|
|
|
|
plan tests => 2; # increment this value for each test you create
|
|
|
|
my $session = WebGUI::Test->session;
|
|
$session->user({userId => 3});
|
|
|
|
WebGUI::Test->addToCleanup(SQL => 'delete from passiveLog');
|
|
WebGUI::Test->addToCleanup(SQL => 'delete from deltaLog');
|
|
WebGUI::Test->addToCleanup(SQL => 'delete from bucketLog');
|
|
WebGUI::Test->addToCleanup(SQL => 'delete from analyticRule');
|
|
WebGUI::Test->addToCleanup(SQL => 'delete from PA_lastLog');
|
|
|
|
my $workflow = WebGUI::Workflow->new($session, 'PassiveAnalytics000001');
|
|
my $activities = $workflow->getActivities();
|
|
##Note, they're in order, and the order is known.
|
|
$activities->[0]->set('deltaInterval', 100);
|
|
$activities->[1]->set('userId', 0); ##To disable sending emails
|
|
|
|
my $instance = WebGUI::Workflow::Instance->create($session,
|
|
{
|
|
workflowId => $workflow->getId,
|
|
skipSpectreNotification => 1,
|
|
priority => 1,
|
|
}
|
|
);
|
|
WebGUI::Test->addToCleanup($instance);
|
|
##Rule label, url, and regexp
|
|
my @ruleSets = (
|
|
['home', '/home', '^\/home' ],
|
|
['one', '/one', '^\/one$' ],
|
|
['two', '/two', '^\/two$' ],
|
|
['three', '/three', '^\/three$' ],
|
|
['end', '/blah/blah/end', 'end$' ],
|
|
['casa', '/home/casa', 'casa$' ],
|
|
['uno', '/one/uno', 'uno$' ],
|
|
['dos', '/two/dos', 'dos$' ],
|
|
['tres', '/three/tres', 'tres$' ],
|
|
['alpha', '/alpha/aee', '.alpha.aee' ],
|
|
['beta', '/beta/bee', '.beta.bee' ],
|
|
['gamma', '/gamma/cee', '.gamma.cee' ],
|
|
['delta', '/delta/dee', '.delta.dee' ],
|
|
['eee', '/epsilon/eee', 'eee$' ],
|
|
['thingy1', '/thingy?thingId=1', '^.thingy\?thingId=1' ],
|
|
['rogerRoger', '/roger/roger', '(?:\/roger){2}' ],
|
|
['roger', '/roger', '^\/roger' ],
|
|
['thingy2', '/thingy?thingId=2', '^.thingy\?thingId=2' ],
|
|
['beet', '/beta/beet', '.beta.beet' ],
|
|
['zero', '/yelnats', 'yelnats' ],
|
|
);
|
|
|
|
my @url2 = @ruleSets;
|
|
while (my $spec = shift @url2) {
|
|
my ($bucket, undef, $regexp) = @{ $spec };
|
|
WebGUI::PassiveAnalytics::Rule->create($session, { bucketName => $bucket, regexp => $regexp });
|
|
}
|
|
|
|
my @urls = map {$_->[1]} @ruleSets;
|
|
#loadLogData($session, @urls);
|
|
repeatableLogData($session, 'passiveAnalyticsLog');
|
|
|
|
##Build rulesets
|
|
|
|
##Now, run it and wait for it to finish
|
|
my $counter = 0;
|
|
#DB::enable_profile();
|
|
PAUSE: while (my $retval = $instance->run()) {
|
|
last PAUSE if $retval eq 'done';
|
|
last PAUSE if $counter++ >= 16;
|
|
}
|
|
#DB::disable_profile();
|
|
|
|
cmp_ok $counter, '<', 16, 'Successful completion of PA';
|
|
|
|
my $get_line = $session->db->read('select userId, Bucket, duration from bucketLog');
|
|
|
|
my @database_dump = ();
|
|
ROW: while ( 1 ) {
|
|
my @datum = $get_line->array();
|
|
last ROW unless @datum;
|
|
push @database_dump, [ @datum ];
|
|
}
|
|
|
|
cmp_bag(
|
|
[ @database_dump ],
|
|
[
|
|
['user1', 'one', 10],
|
|
['user1', 'two', 15],
|
|
['user2', 'zero', 2],
|
|
['user2', 'uno', 3],
|
|
['user2', 'Other', 5],
|
|
],
|
|
'PA analysis completed, and calculated correctly'
|
|
) or diag Dumper(\@database_dump);
|
|
|
|
sub loadLogData {
|
|
my ($session, @urls) = @_;
|
|
$session->db->write('delete from passiveLog');
|
|
my $insert = $session->db->prepare(
|
|
q!insert into passiveLog (userId, sessionId, timeStamp, url, assetId) VALUES (?,?,?,?,'assetId')!
|
|
);
|
|
my $logCount = 15000;
|
|
my $counter;
|
|
my $startTime = 1000;
|
|
my $numUrls = scalar @urls;
|
|
while ($counter++ < $logCount) {
|
|
my $index = int rand($numUrls);
|
|
my $url = $urls[$index];
|
|
$insert->execute([2, 25, $startTime, $url]);
|
|
$startTime += int(rand(10))+1;
|
|
}
|
|
}
|
|
|
|
sub repeatableLogData {
|
|
my ($session, $dataLogName) = @_;
|
|
$session->db->write('delete from passiveLog');
|
|
my $insert = $session->db->prepare(
|
|
q!insert into passiveLog (userId, sessionId, timeStamp, url, assetId) VALUES (?,?,?,?,'assetId')!
|
|
);
|
|
my $data_name = WebGUI::Test::collateral('passiveAnalyticsLog');
|
|
open my $log_data, '<', $data_name or
|
|
die "Unable to open $data_name for reading: $!";
|
|
local $_;
|
|
while (<$log_data>) {
|
|
next if /^\s*#/;
|
|
s/#\.*$//;
|
|
chomp;
|
|
my @data = split;
|
|
$insert->execute([@data]);
|
|
}
|
|
$insert->finish;
|
|
}
|
|
|
|
#vim:ft=perl
|