# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4; encoding:utf-8 -*-
#
# Copyright 2002 Ben Escoto <ben@emerose.org>
# Copyright 2007 Kenneth Loafman <kenneth@loafman.com>
#
# This file is part of duplicity.
#
# Duplicity is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# Duplicity is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with duplicity; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
from __future__ import print_function
from future import standard_library
standard_library.install_aliases()
import unittest
from . import UnitTestCase
from duplicity import path
from duplicity.statistics import * # pylint: disable=redefined-builtin, unused-wildcard-import
from testing import _runtest_dir
[docs]class StatsObjTest(UnitTestCase):
u"""Test StatsObj class"""
[docs] def setUp(self):
super(StatsObjTest, self).setUp()
self.unpack_testfiles()
[docs] def set_obj(self, s):
u"""Set values of s's statistics"""
s.SourceFiles = 1
s.SourceFileSize = 2
s.NewFiles = 3
s.NewFileSize = 4
s.DeletedFiles = 5
s.ChangedFiles = 7
s.ChangedFileSize = 8
s.ChangedDeltaSize = 9
s.DeltaEntries = 10
s.RawDeltaSize = 11
s.TotalDestinationSizeChange = 12
s.StartTime = 13
s.EndTime = 14
[docs] def test_get_stats(self):
u"""Test reading and writing stat objects"""
s = StatsObj()
assert s.get_stat(u'SourceFiles') is None
self.set_obj(s)
assert s.get_stat(u'SourceFiles') == 1
s1 = StatsDeltaProcess()
assert s1.get_stat(u'SourceFiles') == 0
[docs] def test_get_stats_string(self):
u"""Test conversion of stat object into string"""
s = StatsObj()
stats_string = s.get_stats_string()
assert stats_string == u"", stats_string
self.set_obj(s)
stats_string = s.get_stats_string()
assert stats_string == u"""\
StartTime 13.00 (Wed Dec 31 18:00:13 1969)
EndTime 14.00 (Wed Dec 31 18:00:14 1969)
ElapsedTime 1.00 (1 second)
SourceFiles 1
SourceFileSize 2 (2 bytes)
NewFiles 3
NewFileSize 4 (4 bytes)
DeletedFiles 5
ChangedFiles 7
ChangedFileSize 8 (8 bytes)
ChangedDeltaSize 9 (9 bytes)
DeltaEntries 10
RawDeltaSize 11 (11 bytes)
TotalDestinationSizeChange 12 (12 bytes)
""", u"'%s'" % stats_string
[docs] def test_line_string(self):
u"""Test conversion to a single line"""
s = StatsObj()
self.set_obj(s)
statline = s.get_stats_line((u"sample", u"index", u"w", u"new\nline"))
assert statline == u"sample/index/w/new\\nline 1 2 3 4 5 7 8 9 10 11", \
repr(statline)
statline = s.get_stats_line(())
assert statline == u". 1 2 3 4 5 7 8 9 10 11"
statline = s.get_stats_line((u"file name with spaces",))
assert statline == (u"file\\x20name\\x20with\\x20spaces "
u"1 2 3 4 5 7 8 9 10 11"), repr(statline)
[docs] def test_byte_summary(self):
u"""Test conversion of bytes to strings like 7.23MB"""
s = StatsObj()
f = s.get_byte_summary_string
assert f(1) == u"1 byte"
assert f(234.34) == u"234 bytes"
assert f(2048) == u"2.00 KB"
assert f(3502243) == u"3.34 MB"
assert f(314992230) == u"300 MB"
assert f(36874871216) == u"34.3 GB", f(36874871216)
assert f(3775986812573450) == u"3434 TB"
[docs] def test_init_stats(self):
u"""Test setting stat object from string"""
s = StatsObj()
s.set_stats_from_string(u"NewFiles 3 hello there")
for attr in s.stat_attrs:
if attr == u'NewFiles':
assert s.get_stat(attr) == 3
else:
assert s.get_stat(attr) is None, (attr, s.__dict__[attr])
s1 = StatsObj()
self.set_obj(s1)
assert not s1.stats_equal(s)
s2 = StatsObj()
s2.set_stats_from_string(s1.get_stats_string())
assert s1.stats_equal(s2)
[docs] def test_write_path(self):
u"""Test reading and writing of statistics object"""
p = path.Path(u"{0}/testfiles/statstest".format(_runtest_dir))
if p.exists():
p.delete()
s = StatsObj()
self.set_obj(s)
s.write_stats_to_path(p)
s2 = StatsObj()
assert not s2.stats_equal(s)
s2.read_stats_from_path(p)
assert s2.stats_equal(s)
[docs] def testAverage(self):
u"""Test making an average statsobj"""
s1 = StatsObj()
s1.StartTime = 5
s1.EndTime = 10
s1.ElapsedTime = 5
s1.ChangedFiles = 2
s1.SourceFiles = 100
s1.NewFileSize = 4
s2 = StatsObj()
s2.StartTime = 25
s2.EndTime = 35
s2.ElapsedTime = 10
s2.ChangedFiles = 1
s2.SourceFiles = 50
s2.DeletedFiles = 0
s3 = StatsObj().set_to_average([s1, s2])
assert s3.StartTime is s3.EndTime is None
assert s3.ElapsedTime == 7.5
assert s3.DeletedFiles is s3.NewFileSize is None, (s3.DeletedFiles,
s3.NewFileSize)
assert s3.ChangedFiles == 1.5
assert s3.SourceFiles == 75
if __name__ == u"__main__":
unittest.main()