#!/bin/sh
+#
+# Copyright (C) 2000-2015 Kern Sibbald
+# License: BSD 2-Clause; see file LICENSE-FOSS
+#
+
#
#
TestName="duplicate-job-test"
scripts/cleanup
scripts/copy-test-confs
-echo "${cwd}/build/technotes" >${cwd}/tmp/file-list
+echo "${cwd}/build/ChangeLog" >${cwd}/tmp/file-list
+
+# increase the maximum concurrent jobs for FD, SD and DIR
+perl -Mscripts::functions -e 'set_maximum_concurrent_jobs("$conf/bacula-dir.conf",100)'
+perl -Mscripts::functions -e 'set_maximum_concurrent_jobs("$conf/bacula-sd.conf",100)'
+perl -Mscripts::functions -e 'set_maximum_concurrent_jobs("$conf/bacula-fd.conf",100)'
+
# extract a Job and add a runscript on it
perl -Mscripts::functions \
-e "extract_resource('$conf/bacula-dir.conf', 'Job', 'CompressedTest')" \
- | sed 's%Standard%Standard; ClientRunBeforeJob="sleep 10"%' > $tmp/1
+ | sed 's%Standard%Standard; ClientRunBeforeJob="sleep 6"%' > $tmp/1
outf="$tmp/sed_tmp"
echo 's%Backup%Backup; AllowDuplicateJobs = no;CancelLowerLevelDuplicates=no;CancelQueuedDuplicates=no; CancelRunningDuplicates=no%' >> $outf
sed -f $outf $tmp/1 >> $conf/bacula-dir.conf
-when=`perl -MPOSIX -e "print strftime('%F %T', localtime(time+300))"`
+when=`perl -Mscripts::functions -e "get_time(300)"`
start_test
cat <<END_OF_DATA >${cwd}/tmp/bconcmds
-@$out /dev/null
+@output /dev/null
messages
@$out ${cwd}/tmp/log1.out
messages
-label storage=File volume=TestVolume001
+label storage=File volume=TestVolume001 slot=1 drive=0
+@#setdebug level=100 storage=File
+@##############################################
+@# AllowDuplicates = Yes, both jobs should work
+@##############################################
run comment="Should work" level=Full job=AllowDuplicateYes yes
@sleep 2
run comment="Should work" level=Full job=AllowDuplicateYes yes
wait
messages
@$out $tmp/log3.out
+@###############################################################
+@# Run two jobs with the same level and see wich one is canceled
+@###############################################################
run comment="Should work" level=Full job=CancelLowerLevelDuplicatesYes yes
@sleep 2
run comment="Should fail" level=Full job=CancelLowerLevelDuplicatesYes yes
wait
messages
+@####################################################################
+@# Run two jobs with the different level and see wich one is canceled
+@####################################################################
run comment="Should fail" level=Incremental job=CancelLowerLevelDuplicatesYes yes
@sleep 2
run comment="Should work" level=Full job=CancelLowerLevelDuplicatesYes yes
wait
messages
+run comment="Should fail" level=Differential job=CancelLowerLevelDuplicatesYes yes
+@sleep 2
+run comment="Should work" level=Full job=CancelLowerLevelDuplicatesYes yes
+wait
+messages
+run comment="Should work" level=Differential job=CancelLowerLevelDuplicatesYes yes
+@sleep 2
+run comment="Should fail" level=Incremental job=CancelLowerLevelDuplicatesYes yes
+wait
+messages
+@#####################################################################################
+@# Run two jobs with the different level and see wich one is canceled (reversed order)
+@#####################################################################################
run comment="Should work" level=Full job=CancelLowerLevelDuplicatesYes yes
@sleep 2
run comment="Should fail" level=Incremental job=CancelLowerLevelDuplicatesYes yes
wait
messages
@$out $tmp/log4.out
+@####################################################################
+@# Run two jobs, the second one can't cancel the 1st, and should fail
+@####################################################################
run comment="Should work" level=Full job=CancelQueueDuplicatesYes yes
@sleep 2
run comment="Should fail" level=Full job=CancelQueueDuplicatesYes yes
wait
messages
+@#################################################################
+@# The first job should stay queued, the second one will cancel it
+@#################################################################
run comment="Should fail" level=Full job=CancelQueueDuplicatesYes when="$when" yes
@sleep 2
run comment="Should work" level=Full job=CancelQueueDuplicatesYes yes
wait
messages
@$out $tmp/log5.out
-run comment="Should work" level=Full job=CancelRunningDuplicatesYes yes
-@sleep 2
+@########################################
+@# The second job will kill the first one
+@########################################
run comment="Should fail" level=Full job=CancelRunningDuplicatesYes yes
+@sleep 2
+run comment="Should work" level=Full job=CancelRunningDuplicatesYes yes
wait
messages
@$out $tmp/log6.out
+@##########################
+@# The second job won't run
+@##########################
run comment="Should work" level=Full job=CancelRunningDuplicatesNo yes
@sleep 2
run comment="Should fail" level=Full job=CancelRunningDuplicatesNo yes
wait
messages
-@$out $tmp/log2.out
+@$out $tmp/log7.out
sql
SELECT JobId, Name, Level, Comment, JobStatus from Job
-WHERE Comment='Should fail' and JobStatus='T';
+WHERE Comment='Should fail' and JobStatus='T' ORDER By JobId;
+@$out $tmp/log8.out
sql
-SELECT JobId, Name, Level, Comment, JobStatus from Job order by JobId
-WHERE Comment="Should work' and JobStatus != 'T';
+SELECT JobId, Name, Level, Comment, JobStatus from Job
+WHERE Comment='Should work' and JobStatus != 'T' ORDER By JobId;
+@$out $tmp/log9.out
sql
SELECT JobId, Name, Level, Comment, JobStatus from Job order by JobId;
check_for_zombie_jobs storage=File
stop_bacula
+touch $tmp/log2.out
check_two_logs
-check_restore_diff
+
+grep '^| *[0-9]' $tmp/log7.out > /dev/null
+if [ $? = 0 ]; then
+ print_debug "ERROR: Found errors in $tmp/log7.out"
+ print_debug `cat $tmp/log7.out`
+ estat=1
+fi
+
+grep '^| *[0-9]' $tmp/log8.out > /dev/null
+if [ $? = 0 ]; then
+ print_debug "ERROR: Found errors in $tmp/log8.out"
+ print_debug `cat $tmp/log8.out`
+ estat=1
+fi
+
+nb=`grep '^| *[0-9]' $tmp/log9.out | wc -l`
+if [ $nb -lt 10 ]; then
+ print_debug "ERROR: less than 10 lines of SQL output in $tmp/log9.out"
+ print_debug `cat $tmp/log9.out`
+ estat=1
+fi
+
end_test