summaryrefslogtreecommitdiff
path: root/tests/internals/storage.py
blob: c232832214e4fc3695a55bb173e76a89522a8f12 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import multiprocessing
import os
import signal

import pytest

from buildstream import utils, _signals
from buildstream._cas import CASCache
from buildstream.storage._casbaseddirectory import CasBasedDirectory
from buildstream.storage._filebaseddirectory import FileBasedDirectory

DATA_DIR = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    "storage"
)


# Since parent processes wait for queue events, we need
# to put something on it if the called process raises an
# exception.
def _queue_wrapper(target, queue, *args):
    try:
        target(*args)
    except Exception as e:
        queue.put(str(e))
        raise

    queue.put(None)


def setup_backend(backend_class, tmpdir):
    if backend_class == FileBasedDirectory:
        return backend_class(os.path.join(tmpdir, "vdir"))
    else:
        cas_cache = CASCache(tmpdir)
        return backend_class(cas_cache)


def _test_import_subprocess(tmpdir, datafiles, backend):
    original = os.path.join(str(datafiles), "original")

    c = setup_backend(backend, str(tmpdir))

    c.import_files(original)

    assert "bin/bash" in c.list_relative_paths()
    assert "bin/hello" in c.list_relative_paths()


@pytest.mark.parametrize("backend", [
    FileBasedDirectory, CasBasedDirectory])
@pytest.mark.datafiles(DATA_DIR)
def test_import(tmpdir, datafiles, backend):
    queue = multiprocessing.Queue()
    process = multiprocessing.Process(target=_queue_wrapper,
                                      args=(_test_import_subprocess, queue,
                                            tmpdir, datafiles, backend))
    try:
        with _signals.blocked([signal.SIGINT], ignore=False):
            process.start()
        error = queue.get()
        process.join()
    except KeyboardInterrupt:
        utils._kill_process_tree(process.pid)
        raise

    assert not error


def _test_modified_file_list_subprocess(tmpdir, datafiles, backend):
    original = os.path.join(str(datafiles), "original")
    overlay = os.path.join(str(datafiles), "overlay")

    c = setup_backend(backend, str(tmpdir))

    c.import_files(original)

    c.mark_unmodified()

    c.import_files(overlay)

    print("List of all paths in imported results: {}".format(c.list_relative_paths()))
    assert "bin/bash" in c.list_relative_paths()
    assert "bin/bash" in c.list_modified_paths()
    assert "bin/hello" not in c.list_modified_paths()


@pytest.mark.parametrize("backend", [
    FileBasedDirectory, CasBasedDirectory])
@pytest.mark.datafiles(DATA_DIR)
def test_modified_file_list(tmpdir, datafiles, backend):
    queue = multiprocessing.Queue()
    process = multiprocessing.Process(target=_queue_wrapper,
                                      args=(_test_modified_file_list_subprocess, queue,
                                            tmpdir, datafiles, backend))
    try:
        with _signals.blocked([signal.SIGINT], ignore=False):
            process.start()
        error = queue.get()
        process.join()
    except KeyboardInterrupt:
        utils._kill_process_tree(process.pid)
        raise

    assert not error