File: test_sync.py

package info (click to toggle)
python-b2sdk 2.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,020 kB
  • sloc: python: 30,902; sh: 13; makefile: 8
file content (67 lines) | stat: -rw-r--r-- 1,921 bytes parent folder | download
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
######################################################################
#
# File: test/integration/test_sync.py
#
# Copyright 2024 Backblaze Inc. All Rights Reserved.
#
# License https://www.backblaze.com/using_b2_code.html
#
######################################################################
from __future__ import annotations

import io
import time

import pytest

from b2sdk.v2 import (
    CompareVersionMode,
    NewerFileSyncMode,
    Synchronizer,
    SyncReport,
    parse_folder,
)


@pytest.fixture
def local_folder_with_files(tmp_path):
    folder = tmp_path / 'test'
    folder.mkdir()
    (folder / 'a').mkdir()
    (folder / 'a' / 'foo').write_bytes(b'foo')
    # space in the name is important as it influences lexicographical sorting used by B2
    (folder / 'a b').mkdir()
    (folder / 'a b' / 'bar').write_bytes(b'bar')
    return folder


def test_sync_folder(b2_api, local_folder_with_files, b2_subfolder):
    source_folder = parse_folder(str(local_folder_with_files), b2_api)
    dest_folder = parse_folder(b2_subfolder, b2_api)

    synchronizer = Synchronizer(
        max_workers=10,
        newer_file_mode=NewerFileSyncMode.REPLACE,
        compare_version_mode=CompareVersionMode.MODTIME,
        compare_threshold=10,  # ms
    )

    def sync_and_report():
        buf = io.StringIO()
        reporter = SyncReport(buf, no_progress=True)
        with reporter:
            synchronizer.sync_folders(
                source_folder=source_folder,
                dest_folder=dest_folder,
                now_millis=int(1000 * time.time()),
                reporter=reporter,
            )
        return reporter

    report = sync_and_report()
    assert report.total_transfer_files == 2
    assert report.total_transfer_bytes == 6

    second_sync_report = sync_and_report()
    assert second_sync_report.total_transfer_files == 0
    assert second_sync_report.total_transfer_bytes == 0