summaryrefslogtreecommitdiff
path: root/test/util.py
blob: 2baf9341a192591543cf578a0e400b225814b803 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

import hashlib
import os


def check_same_md5sum(fa, fb):
    return (fa.md5sum() == fb.md5sum())


class File():
    def __init__(self, path, size = 0, content = "random", perm = 0o664):
        if not content in ["zero", "random"]:
            raise ValueError("invalid type: {}".format(content))
        self.path = path
        self.size = size
        self.content = content
        self.perm = perm

    def __repr__(self):
        return "<file:{} {}-bytes>".format(self.path, self.size)

    def __str__(self):
        return self.path

    def make(self, size = None):
        if size:
            self.size = size

        d = os.path.dirname(self.path)
        if d:
            os.makedirs(d, exist_ok = True)
        if self.content == "zero":
            self.make_content_zero()
        elif self.content == "random":
            self.make_content_random()
        else:
            raise ValueError("invalud content type: {}".format(self.content))
        os.chmod(self.path, self.perm)
        return self

    def make_content_zero(self):
        with open(self.path, "wb") as f:
            f.seek(self.size, 0)

    def make_content_random(self):
        with open(self.path, "wb") as f:
            f.write(os.urandom(self.size))

    def cleanup(self, preserve_dir = False):
        os.remove(self.path)
        if preserve_dir:
            return
        tmp = os.path.dirname(self.path)
        while tmp and not tmp in [".", "/"]:
            if len(os.listdir(tmp)) == 0:
                os.rmdir(tmp)
            tmp = os.path.dirname(tmp)

    def md5sum(self):
        m = hashlib.md5()
        with open(self.path, 'rb') as f:
            for chunk in iter(lambda: f.read(4096 * m.block_size), b''):
                m.update(chunk)
        return m.hexdigest()