5
0
mirror of git://git.proxmox.com/git/pve-common.git synced 2024-12-22 21:33:47 +03:00
pve-common/test/calendar_event_test.pl
Dominik Csapak 9572e1046b CalendarEvent: use rust implementation
by replacing the parsing code and 'compute_next_event' by their
PVE::RS::CalendarEvent equivalent

adapt the tests, since we do not have access to the internal structure
(and even if we had, it would be different) and the error messages
are different

the 'compute_next_event' and parsing tests still pass though

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
2022-01-13 14:50:47 +01:00

237 lines
4.4 KiB
Perl
Executable File

#!/usr/bin/perl
use lib '../src';
use strict;
use warnings;
use POSIX ();
use Data::Dumper;
use Time::Local;
use Test::More;
use PVE::CalendarEvent;
# Time tests should run in a controlled setting
$ENV{TZ} = 'UTC';
POSIX::tzset();
my $alldays = [0,1,2,3,4,5,6];
my $tests = [
[
'*',
undef,
[
[0, 60],
[30, 60],
[59, 60],
[60, 120],
]
],
[
'*/10',
undef,
[
[0, 600],
[599, 600],
[600, 1200],
[50*60, 60*60]
]
],
[
'*/12:0' ,
undef,
[
[ 10, 43200],
[ 13*3600, 24*3600],
]
],
[
'1/12:0/15' ,
undef,
[
[0, 3600],
[3600, 3600+15*60],
[3600+16*60, 3600+30*60 ],
[3600+30*60, 3600+45*60 ],
[3600+45*60, 3600+12*3600],
[13*3600 + 1, 13*3600+15*60],
[13*3600 + 15*60, 13*3600+30*60],
[13*3600 + 30*60, 13*3600+45*60],
[13*3600 + 45*60, 25*3600],
],
],
[
'1,4,6',
undef,
[
[0, 60],
[60, 4*60],
[4*60+60, 6*60],
[6*60, 3600+60],
]
],
[
'0..3',
undef,
],
[
'23..23:0..3',
undef,
],
[
'Mon',
undef,
[
[0, 4*86400], # Note: Epoch 0 is Thursday, 1. January 1970
[4*86400, 11*86400],
[11*86400, 18*86400],
],
],
[
'sat..sun',
undef,
[
[0, 2*86400],
[2*86400, 3*86400],
[3*86400, 9*86400],
]
],
[
'sun..sat',
undef,
],
[
'Fri..Mon',
{ error => "wrong order in range 'Fri..Mon'" },
],
[
'wed,mon..tue,fri',
undef,
],
[
'mon */15',
undef,
],
[
'22/1:0',
undef,
[
[0, 22*60*60],
[22*60*60, 23*60*60],
[22*60*60 + 59*60, 23*60*60]
],
],
[
'*/2:*',
undef,
[
[0, 60],
[60*60, 2*60*60],
[2*60*60, 2*60*60 + 60]
]
],
[
'20..22:*/30',
undef,
[
[0, 20*60*60],
[20*60*60, 20*60*60 + 30*60],
[22*60*60 + 30*60, 44*60*60]
]
],
[
'61',
{ error => "value '61' out of range" },
],
[
'*/61',
{ error => "repetition '61' out of range" },
],
[
'0..80',
{ error => "range end '80' out of range" },
],
[
' mon 0 0 0',
{ error => "unable to parse calendar event - unused parts" },
],
[
'',
{ error => "unable to parse calendar event - event is empty" },
],
[
' mon 0 0',
{ error => "unable to parse calendar event - unused parts" },
],
[
'0,1,3..5',
undef,
[
[0, 60],
[60, 3*60],
[5*60, 60*60]
]
],
[
'2,4:0,1,3..5',
undef,
[
[0, 2*60*60],
[2*60*60 + 60, 2*60*60 + 3*60],
[2*60*60 + 5*60, 4*60*60]
]
],
];
foreach my $test (@$tests) {
my ($t, $expect, $nextsync) = @$test;
$expect //= {};
my $timespec;
eval { $timespec = PVE::CalendarEvent::parse_calendar_event($t); };
my $err = $@;
if ($expect->{error}) {
chomp $err if $err;
ok(defined($err) == defined($expect->{error}), "parsing '$t' failed expectedly");
die "unable to execute nextsync tests" if $nextsync;
}
next if !$nextsync;
foreach my $nt (@$nextsync) {
my ($last, $expect_next) = @$nt;
my $msg = "next event '$t' $last => ${expect_next}";
$timespec->{utc} = 1;
my $next = PVE::CalendarEvent::compute_next_event($timespec, $last);
is($next, $expect_next, $msg);
}
};
sub tztest {
my ($calspec, $last) = @_;
my $spec = PVE::CalendarEvent::parse_calendar_event($calspec);
return PVE::CalendarEvent::compute_next_event($spec, $last);
}
# Test loop termination at CEST/CET switch (cannot happen here in UTC)
is(tztest('mon..fri', timelocal(0, 0, 0, 28, 9, 2018)),
timelocal(0, 0, 0, 29, 9, 2018));
is(tztest('mon..fri UTC', timelocal(0, 0, 0, 28, 9, 2018)),
timelocal(0, 0, 0, 29, 9, 2018));
# Now in the affected time zone
$ENV{TZ} = ':Europe/Vienna';
POSIX::tzset();
is(tztest('mon..fri', timelocal(0, 0, 0, 28, 9, 2018)),
timelocal(0, 0, 0, 29, 9, 2018));
# Specifically requesting UTC in the calendar spec means the resulting output
# time as seen locally (timelocal() as opposed to timegm()) is shifted by 1
# hour.
is(tztest('mon..fri UTC', timelocal(0, 0, 0, 28, 9, 2018)),
timelocal(0, 0, 1, 29, 9, 2018));
$ENV{TZ} = 'UTC';
POSIX::tzset();
done_testing();