from zfs_autobackup.CmdPipe import CmdPipe from basetest import * import time from zfs_autobackup.LogConsole import LogConsole class TestZfsAutobackup(unittest2.TestCase): def setUp(self): prepare_zpools() self.longMessage=True def test_invalidpars(self): self.assertEqual(ZfsAutobackup("test test_target1 --no-progress --keep-source -1".split(" ")).run(), 255) with OutputIO() as buf: with redirect_stdout(buf): self.assertEqual(ZfsAutobackup("test test_target1 --no-progress --resume --verbose --no-snapshot".split(" ")).run(), 0) print(buf.getvalue()) self.assertIn("The --resume", buf.getvalue()) with OutputIO() as buf: with redirect_stderr(buf): self.assertEqual(ZfsAutobackup("test test_target_nonexisting --no-progress".split(" ")).run(), 255) print(buf.getvalue()) # correct message? self.assertIn("Please create this dataset", buf.getvalue()) def test_snapshotmode(self): """test snapshot tool mode""" with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test --no-progress --verbose".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 """) def test_defaults(self): self.maxDiff=2000 with self.subTest("no datasets selected"): with OutputIO() as buf: with redirect_stderr(buf): with mocktime("20101111000000"): self.assertTrue(ZfsAutobackup("nonexisting test_target1 --verbose --debug --no-progress".split(" ")).run()) print(buf.getvalue()) #correct message? self.assertIn("No source filesystems selected", buf.getvalue()) with self.subTest("defaults with full verbose and debug"): with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --verbose --debug --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1@test-20101111000000 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20101111000000 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20101111000000 """) with self.subTest("bare defaults, allow empty"): with mocktime("20101111000001"): self.assertFalse(ZfsAutobackup("test test_target1 --allow-empty --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20101111000000 test_source1/fs1@test-20101111000001 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source1/fs1/sub@test-20101111000001 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs2/sub@test-20101111000001 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1@test-20101111000000 test_target1/test_source1/fs1@test-20101111000001 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20101111000000 test_target1/test_source1/fs1/sub@test-20101111000001 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20101111000000 test_target1/test_source2/fs2/sub@test-20101111000001 """) with self.subTest("verify holds"): r=shelltest("zfs get -r userrefs test_source1 test_source2 test_target1") self.assertMultiLineEqual(r,""" NAME PROPERTY VALUE SOURCE test_source1 userrefs - - test_source1/fs1 userrefs - - test_source1/fs1@test-20101111000000 userrefs 0 - test_source1/fs1@test-20101111000001 userrefs 1 - test_source1/fs1/sub userrefs - - test_source1/fs1/sub@test-20101111000000 userrefs 0 - test_source1/fs1/sub@test-20101111000001 userrefs 1 - test_source2 userrefs - - test_source2/fs2 userrefs - - test_source2/fs2/sub userrefs - - test_source2/fs2/sub@test-20101111000000 userrefs 0 - test_source2/fs2/sub@test-20101111000001 userrefs 1 - test_source2/fs3 userrefs - - test_source2/fs3/sub userrefs - - test_target1 userrefs - - test_target1/test_source1 userrefs - - test_target1/test_source1/fs1 userrefs - - test_target1/test_source1/fs1@test-20101111000000 userrefs 0 - test_target1/test_source1/fs1@test-20101111000001 userrefs 1 - test_target1/test_source1/fs1/sub userrefs - - test_target1/test_source1/fs1/sub@test-20101111000000 userrefs 0 - test_target1/test_source1/fs1/sub@test-20101111000001 userrefs 1 - test_target1/test_source2 userrefs - - test_target1/test_source2/fs2 userrefs - - test_target1/test_source2/fs2/sub userrefs - - test_target1/test_source2/fs2/sub@test-20101111000000 userrefs 0 - test_target1/test_source2/fs2/sub@test-20101111000001 userrefs 1 - """) #make sure time handling is correctly. try to make snapshots a year appart and verify that only snapshots mostly 1y old are kept #So in this case we only want to see 2 snapshots of 2011, and none of the 2010's anymore. with self.subTest("test time checking"): with mocktime("20111211000000"): self.assertFalse(ZfsAutobackup("test test_target1 --allow-empty --verbose --no-progress".split(" ")).run()) with mocktime("20111211000001"): self.assertFalse(ZfsAutobackup("test test_target1 --allow-empty --verbose --keep-source 1y1y --keep-target 1d1y --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20111211000000 test_source1/fs1@test-20111211000001 test_source1/fs1/sub test_source1/fs1/sub@test-20111211000000 test_source1/fs1/sub@test-20111211000001 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20111211000000 test_source2/fs2/sub@test-20111211000001 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1@test-20111211000000 test_target1/test_source1/fs1@test-20111211000001 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20111211000000 test_target1/test_source1/fs1/sub@test-20111211000001 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20111211000000 test_target1/test_source2/fs2/sub@test-20111211000001 """) def test_ignore_othersnaphots(self): r=shelltest("zfs snapshot test_source1/fs1@othersimple") r=shelltest("zfs snapshot test_source1/fs1@otherdate-20001111000000") with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@othersimple test_source1/fs1@otherdate-20001111000000 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1@test-20101111000000 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20101111000000 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20101111000000 """) def test_othersnaphots(self): r=shelltest("zfs snapshot test_source1/fs1@othersimple") r=shelltest("zfs snapshot test_source1/fs1@otherdate-20001111000000") with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --other-snapshots".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@othersimple test_source1/fs1@otherdate-20001111000000 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1@othersimple test_target1/test_source1/fs1@otherdate-20001111000000 test_target1/test_source1/fs1@test-20101111000000 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20101111000000 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20101111000000 """) def test_nosnapshot(self): with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --verbose --no-snapshot --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) #(only parents are created ) #TODO: it probably shouldn't create these self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1/sub test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source2 test_target1/test_source2/fs2 """) def test_nosend(self): with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --verbose --no-send --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 """) def test_ignorereplicated(self): r=shelltest("zfs snapshot test_source1/fs1@otherreplication") with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --no-progress --verbose --ignore-replicated".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@otherreplication test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/test_source1 test_target1/test_source1/fs1 test_target1/test_source1/fs1/sub test_target1/test_source1/fs1/sub@test-20101111000000 test_target1/test_source2 test_target1/test_source2/fs2 test_target1/test_source2/fs2/sub test_target1/test_source2/fs2/sub@test-20101111000000 """) def test_noholds(self): with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --verbose --no-holds --no-progress".split(" ")).run()) r=shelltest("zfs get -r userrefs test_source1 test_source2 test_target1") self.assertMultiLineEqual(r,""" NAME PROPERTY VALUE SOURCE test_source1 userrefs - - test_source1/fs1 userrefs - - test_source1/fs1@test-20101111000000 userrefs 0 - test_source1/fs1/sub userrefs - - test_source1/fs1/sub@test-20101111000000 userrefs 0 - test_source2 userrefs - - test_source2/fs2 userrefs - - test_source2/fs2/sub userrefs - - test_source2/fs2/sub@test-20101111000000 userrefs 0 - test_source2/fs3 userrefs - - test_source2/fs3/sub userrefs - - test_target1 userrefs - - test_target1/test_source1 userrefs - - test_target1/test_source1/fs1 userrefs - - test_target1/test_source1/fs1@test-20101111000000 userrefs 0 - test_target1/test_source1/fs1/sub userrefs - - test_target1/test_source1/fs1/sub@test-20101111000000 userrefs 0 - test_target1/test_source2 userrefs - - test_target1/test_source2/fs2 userrefs - - test_target1/test_source2/fs2/sub userrefs - - test_target1/test_source2/fs2/sub@test-20101111000000 userrefs 0 - """) def test_strippath(self): with mocktime("20101111000000"): self.assertFalse(ZfsAutobackup("test test_target1 --verbose --strip-path=1 --no-progress".split(" ")).run()) r=shelltest("zfs list -H -o name -r -t all "+TEST_POOLS) self.assertMultiLineEqual(r,""" test_source1 test_source1/fs1 test_source1/fs1@test-20101111000000 test_source1/fs1/sub test_source1/fs1/sub@test-20101111000000 test_source2 test_source2/fs2 test_source2/fs2/sub test_source2/fs2/sub@test-20101111000000 test_source2/fs3 test_source2/fs3/sub test_target1 test_target1/fs1 test_target1/fs1@test-20101111000000 test_target1/fs1/sub test_target1/fs1/sub@test-20101111000000 test_target1/fs2 test_target1/fs2/sub test_target1/fs2/sub@test-20101111000000 """) def test_strippath_collision(self): with self.assertRaisesRegexp(Exception,"collision"): ZfsAutobackup("test test_target1 --verbose --strip-path=2 --no-progress --debug".split(" ")).run() def test_strippath_toomuch(self): with self.assertRaisesRegexp(Exception,"too much"): ZfsAutobackup("test test_target1 --verbose --strip-path=3 --no-progress --debug".split(" ")).run() def test_clearrefres(self): #on zfs utils 0.6.x -x isnt supported r=shelltest("zfs recv -x bla test >/dev/null /dev/null >> .*minutes left.*")