1####################################################################################################################################
2# Tests for expire command
3####################################################################################################################################
4package pgBackRestTest::Module::Mock::MockExpireTest;
5use parent 'pgBackRestTest::Env::HostEnvTest';
6
7####################################################################################################################################
8# Perl includes
9####################################################################################################################################
10use strict;
11use warnings FATAL => qw(all);
12use Carp qw(confess);
13
14use File::Basename qw(dirname);
15use Storable qw(dclone);
16
17use pgBackRestDoc::Common::Exception;
18use pgBackRestDoc::Common::Ini;
19use pgBackRestDoc::Common::Log;
20
21use pgBackRestTest::Env::ArchiveInfo;
22use pgBackRestTest::Env::BackupInfo;
23use pgBackRestTest::Env::ExpireEnvTest;
24use pgBackRestTest::Env::Host::HostBackupTest;
25use pgBackRestTest::Env::Host::HostS3Test;
26use pgBackRestTest::Env::HostEnvTest;
27use pgBackRestTest::Env::Manifest;
28use pgBackRestTest::Common::DbVersion;
29use pgBackRestTest::Common::ExecuteTest;
30use pgBackRestTest::Common::RunTest;
31use pgBackRestTest::Common::StorageRepo;
32use pgBackRestTest::Common::VmTest;
33use pgBackRestTest::Common::Wait;
34
35####################################################################################################################################
36# run
37####################################################################################################################################
38sub run
39{
40    my $self = shift;
41
42    use constant SECONDS_PER_DAY => 86400;
43    my $lBaseTime = time() - (SECONDS_PER_DAY * 56);
44    my $strDescription;
45
46    foreach my $rhRun
47    (
48        {vm => VM2, storage =>    S3, encrypt =>  true},
49        {vm => VM3, storage => POSIX, encrypt => false},
50        {vm => VM4, storage => AZURE, encrypt =>  true},
51    )
52    {
53        # Only run tests for this vm
54        next if ($rhRun->{vm} ne vmTest($self->vm()));
55
56        # Increment the run, log, and decide whether this unit test should be run
57        my $strStorage = $rhRun->{storage};
58        my $bEncrypt = $rhRun->{encrypt};
59
60        if ($strStorage ne POSIX && ($self->vm() eq VM3))
61        {
62            confess &log("cannot configure non-posix storage for expect log tests");
63        }
64
65        ############################################################################################################################
66        if ($self->begin("simple, enc ${bEncrypt}, storage ${strStorage}"))
67        {
68            # Create hosts, file object, and config
69            my ($oHostDbPrimary, $oHostDbStandby, $oHostBackup) = $self->setup(
70                true, $self->expect(), {strStorage => $strStorage, bRepoEncrypt => $bEncrypt});
71
72            # Create the test object
73            my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest(
74                $oHostBackup, $self->backrestExe(), storageRepo(), $oHostDbPrimary->dbPath(), $self->expect(), $self);
75
76            $oExpireTest->stanzaCreate($self->stanza(), PG_VERSION_92);
77
78            #-----------------------------------------------------------------------------------------------------------------------
79            $strDescription = 'Nothing to expire';
80
81            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
82            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246);
83
84            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription);
85
86            #-----------------------------------------------------------------------------------------------------------------------
87            $strDescription = 'Expire oldest full backup, archive expire falls on segment major boundary';
88
89            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
90            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription);
91
92            #-----------------------------------------------------------------------------------------------------------------------
93            $strDescription = 'Expire oldest full backup';
94
95            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
96            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, 256);
97            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription);
98
99            #-----------------------------------------------------------------------------------------------------------------------
100            $strDescription = 'Expire oldest diff backup, archive expire does not fall on major segment boundary';
101
102            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
103            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY, undef, 0);
104            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, undef, 0);
105            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription);
106
107            #-----------------------------------------------------------------------------------------------------------------------
108            $strDescription = 'Expire oldest diff backup (cascade to incr)';
109
110            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
111            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription);
112
113            #-----------------------------------------------------------------------------------------------------------------------
114            $strDescription = 'Expire archive based on newest incr backup';
115
116            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY);
117            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, 1, $strDescription);
118
119            #-----------------------------------------------------------------------------------------------------------------------
120            $strDescription = 'Expire diff treating full as diff';
121
122            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
123            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
124            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
125            $oExpireTest->process($self->stanza(), 2, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription);
126
127            #-----------------------------------------------------------------------------------------------------------------------
128            $strDescription = 'Expire diff with repo-retention-archive with warning repo-retention-diff not set';
129
130            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
131            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
132            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
133            $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription);
134
135            #-----------------------------------------------------------------------------------------------------------------------
136            $strDescription = 'Expire full with repo-retention-archive with warning repo-retention-full not set';
137
138            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
139            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
140            $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_FULL, 1, $strDescription);
141
142            #-----------------------------------------------------------------------------------------------------------------------
143            $strDescription = 'Expire no archive with warning since repo-retention-archive not set for INCR';
144
145            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY);
146            $oExpireTest->process($self->stanza(), 1, 1, CFGOPTVAL_BACKUP_TYPE_INCR, undef, $strDescription);
147
148            #-----------------------------------------------------------------------------------------------------------------------
149            $strDescription = 'Expire no archive with warning since neither repo-retention-archive nor repo-retention-diff is set';
150
151            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
152            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
153            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
154            $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription);
155        }
156
157        ############################################################################################################################
158        if ($self->begin("stanzaUpgrade, enc ${bEncrypt}, storage ${strStorage}"))
159        {
160            # Create hosts, file object, and config
161            my ($oHostDbPrimary, $oHostDbStandby, $oHostBackup) = $self->setup(
162                true, $self->expect(), {strStorage => $strStorage, bRepoEncrypt => $bEncrypt});
163
164            # Create the test object
165            my $oExpireTest = new pgBackRestTest::Env::ExpireEnvTest(
166                $oHostBackup, $self->backrestExe(), storageRepo(), $oHostDbPrimary->dbPath(), $self->expect(), $self);
167
168            $oExpireTest->stanzaCreate($self->stanza(), PG_VERSION_92);
169
170            #-----------------------------------------------------------------------------------------------------------------------
171            $strDescription = 'Create backups in current db version';
172
173            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
174            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY);
175            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
176            $oExpireTest->process($self->stanza(), undef, undef, CFGOPTVAL_BACKUP_TYPE_DIFF, undef, $strDescription);
177
178            #-----------------------------------------------------------------------------------------------------------------------
179            $strDescription = 'Upgrade stanza and expire only earliest db backup and archive';
180
181            $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_93);
182            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
183            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_INCR, $lBaseTime += SECONDS_PER_DAY, 246);
184            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
185            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_DIFF, $lBaseTime += SECONDS_PER_DAY);
186            $oExpireTest->process($self->stanza(), 3, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription);
187
188            #-----------------------------------------------------------------------------------------------------------------------
189            $strDescription = 'Upgrade the stanza, create full back - earliest db orphaned archive removed and earliest full backup ' .
190                'and archive in previous db version removed';
191
192            $oExpireTest->stanzaUpgrade($self->stanza(), PG_VERSION_10);
193            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
194            $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription);
195
196            #-----------------------------------------------------------------------------------------------------------------------
197            $strDescription = 'Expire all archive last full backup through pitr';
198
199            $oExpireTest->backupCreate($self->stanza(), CFGOPTVAL_BACKUP_TYPE_FULL, $lBaseTime += SECONDS_PER_DAY);
200            $oExpireTest->process($self->stanza(), 3, 1, CFGOPTVAL_BACKUP_TYPE_DIFF, 1, $strDescription);
201
202            #-----------------------------------------------------------------------------------------------------------------------
203            $strDescription = 'Expire all archive except for the current database';
204
205            $oExpireTest->process($self->stanza(), 2, undef, CFGOPTVAL_BACKUP_TYPE_FULL, undef, $strDescription);
206        }
207    }
208}
209
2101;
211