Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integration Tests for Borg #1716

Merged
merged 75 commits into from
Aug 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
23ccbde
Initial nox configuration file
jetchirag May 20, 2023
70a9db9
Formatting
jetchirag May 20, 2023
2a46274
Added several tests for test_archives
jetchirag May 24, 2023
6cd2658
added more tests to archives tests
jetchirag May 28, 2023
077f993
Archive more supported file types
jetchirag May 28, 2023
5b3b6c6
Revert "Archive more supported file types"
jetchirag May 28, 2023
e243f68
Archive more supported file types
jetchirag May 28, 2023
14cab4a
Added test for creating / adding repo
jetchirag Jun 1, 2023
05ecaf2
Push changes for conftest.py
jetchirag Jun 1, 2023
0ca5613
Added tests for borg info
jetchirag Jun 6, 2023
c6418e8
Test configuration improvements and bug fixes
jetchirag Jun 8, 2023
a68cb65
conftest.py cleanup
jetchirag Jun 8, 2023
e456f10
Test for creating new archive
jetchirag Jun 9, 2023
6c769e8
Merge branch 'master' into borg-live-tests
jetchirag Jun 9, 2023
854ee60
Fixed prune test
jetchirag Jun 9, 2023
72215dc
Group common fixtures of conftest.py
jetchirag Jun 9, 2023
ce94213
Added nox to dev requirements and adjusted Makefile for nox and unit/…
jetchirag Jun 9, 2023
9067939
Added docstrings to test_archive.py
jetchirag Jun 9, 2023
d19b834
Added coverage to pytests
jetchirag Jun 9, 2023
bb7c2f6
Added all supported versions to nox
jetchirag Jun 11, 2023
a9c3da3
Changed GH action flow to install all required py versions
jetchirag Jun 11, 2023
7f8d1a3
Completed borg diff testing
jetchirag Jun 14, 2023
56827da
Removed unnecessary code from diff test
jetchirag Jun 14, 2023
3e4a462
Added a min borg version fixture
jetchirag Jun 14, 2023
d12dd08
Added libfuse3-dev to linux requirement for fuse3
jetchirag Jun 14, 2023
725b6b0
Added various compatibility check for platform and borg versions
jetchirag Jun 20, 2023
9a0c1c9
GH CI temp speedup
jetchirag Jun 20, 2023
ce33f9e
Solve borg_json_output not found error on archive rename test
jetchirag Jun 20, 2023
4a6c778
Fixed test_borg_repo_info error with invalid repo path
jetchirag Jun 20, 2023
db5d6bb
Macos does not use tmp for tmpdir, fix
jetchirag Jun 20, 2023
6ecdec4
Require pkgconfig to install borg 1.2.0 and above using pip
jetchirag Jun 20, 2023
da05507
pkg-config -> pkgconfig
jetchirag Jun 20, 2023
a1c7190
tmpdir appends integer to generate unique directory for diff tests ru…
jetchirag Jun 23, 2023
914a35a
Always install pre-commit
jetchirag Jun 23, 2023
79d247e
Install libxxhash-dev for linux
jetchirag Jun 23, 2023
9a19d90
Set PKG_CONFIG_PATH for macos
jetchirag Jun 23, 2023
ec87104
Remove python parameterization from nox
jetchirag Jun 24, 2023
282c119
Trial | Restore nox python parameterization with increased timeout
jetchirag Jun 24, 2023
1bc222a
Borg 2 have compact message case change
jetchirag Jun 24, 2023
83695fd
Added docstrings to tests
jetchirag Jun 24, 2023
ede422c
Added docstrings to tests_2
jetchirag Jun 24, 2023
86da9e9
Added pkg config path to env for macos
jetchirag Jun 24, 2023
b95d245
Macos install macfuse
jetchirag Jun 24, 2023
101c709
Attempt at installing borg via github test
jetchirag Jun 24, 2023
6e1c70c
Nox config to use env specified borg version when set
jetchirag Jun 24, 2023
23ce04c
Skip borg mount test on macos (atleast for now)
jetchirag Jun 24, 2023
cd77362
Merge branch 'master' into borg-live-tests
jetchirag Jun 24, 2023
1db9d4b
Cleanup | remove main.show() statements
jetchirag Jun 24, 2023
cf0dfaa
Run unit test seperately
jetchirag Jun 25, 2023
770ecbf
Unit job as include
jetchirag Jun 25, 2023
71f1ef6
Revert unit test config
jetchirag Jun 25, 2023
cd02371
Revert "Revert unit test config"
jetchirag Jun 25, 2023
1e484f1
Revert "Unit job as include"
jetchirag Jun 25, 2023
ba61d9e
Revert "Run unit test seperately"
jetchirag Jun 25, 2023
94bdc97
Merge remote-tracking branch 'upstream/master' into borg-live-tests
jetchirag Jun 25, 2023
26772e5
Restore unit test job
jetchirag Jun 25, 2023
2c51435
New composite action for installation
jetchirag Jun 25, 2023
1b33e37
Composite action require shell property
jetchirag Jun 25, 2023
48afd4b
Unit tests as another job
jetchirag Jun 25, 2023
f1302f4
Fixed breaking of some tests due to introduction of repo name
jetchirag Jun 25, 2023
c0ca616
Minor bug fix, incorrect variable used in asssertion
jetchirag Jun 25, 2023
211dec1
Use llfuse for borg 1.1.18, minor GH action changes
jetchirag Jun 27, 2023
4152103
Debug mount error
jetchirag Jun 27, 2023
55c8a84
Debug mount error 2
jetchirag Jun 27, 2023
99a3c11
raise exception if not mounted
jetchirag Jun 27, 2023
f64d7d3
Revert exception
jetchirag Jun 27, 2023
c8757f2
Minor changes; removed a comment
jetchirag Jul 19, 2023
0cdb4f8
Minor changes; removed a comment
jetchirag Jul 19, 2023
14ce5d4
Merge branch 'master' into borg-live-tests
jetchirag Jul 19, 2023
956eebd
Check for chrdev support
jetchirag Jul 24, 2023
8cc3bc7
Merge branch 'borg-live-tests' of github.com:jetchirag/vorta into bor…
jetchirag Jul 24, 2023
37f91ea
Update to Borg 2.0.0b6
jetchirag Jul 24, 2023
ff0f32a
Merge remote-tracking branch 'upstream/master' into borg-live-tests
jetchirag Aug 3, 2023
1b2f272
Merge Master
jetchirag Aug 3, 2023
0532cd9
Switch to new password widget for test_init
jetchirag Aug 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .github/actions/install-dependencies/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Install Dependencies
description: Installs system dependencies

runs:
using: "composite"
steps:
- name: Install system dependencies (Linux)
if: runner.os == 'Linux'
shell: bash
run: |
sudo apt update && sudo apt install -y \
xvfb libssl-dev openssl libacl1-dev libacl1 fuse3 build-essential \
libxkbcommon-x11-0 dbus-x11 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 libxcb-shape0 \
libegl1 libxcb-cursor0 libfuse-dev libsqlite3-dev libfuse3-dev pkg-config \
python3-pkgconfig libxxhash-dev borgbackup

- name: Install system dependencies (macOS)
if: runner.os == 'macOS'
shell: bash
run: |
brew install openssl readline xz xxhash pkg-config borgbackup
17 changes: 12 additions & 5 deletions .github/actions/setup/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ inputs:
description: The python version to install
required: true
default: "3.10"

install-nox:
description: Whether nox shall be installed
required: false
default: "" # == false
runs:
using: "composite"
steps:
Expand All @@ -37,16 +40,20 @@ runs:
restore-keys: |
${{ runner.os }}-pip-

- name: Install Vorta
- name: Install pre-commit
shell: bash
run: |
pip install -e .
pip install -r requirements.d/dev.txt
run: pip install pre-commit

- name: Install nox
if: ${{ inputs.install-nox }}
shell: bash
run: pip install nox

- name: Hash python version
if: ${{ inputs.setup-pre-commit }}
shell: bash
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV

- name: Caching for Pre-Commit
if: ${{ inputs.setup-pre-commit }}
uses: actions/cache@v3
Expand Down
80 changes: 66 additions & 14 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
shell: bash
run: make lint

test:
test-unit:
timeout-minutes: 20
runs-on: ${{ matrix.os }}
strategy:
Expand All @@ -35,40 +35,92 @@ jobs:
matrix:
python-version: ["3.8", "3.9", "3.10", "3.11"]
os: [ubuntu-latest, macos-latest]
borg-version: ["1.2.4"]

steps:
- uses: actions/checkout@v3

- name: Install system dependencies (Linux)
- name: Install system dependencies
uses: ./.github/actions/install-dependencies

- name: Setup python, vorta and dev deps
uses: ./.github/actions/setup
with:
python-version: ${{ matrix.python-version }}
install-nox: true

- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }}

- name: Run Unit Tests with pytest (Linux)
if: runner.os == 'Linux'
env:
BORG_VERSION: ${{ matrix.borg-version }}
run: |
sudo apt update && sudo apt install -y \
xvfb libssl-dev openssl libacl1-dev libacl1 build-essential borgbackup \
libxkbcommon-x11-0 dbus-x11 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \
libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 libxcb-shape0 \
libegl1 libxcb-cursor0
- name: Install system dependencies (macOS)
xvfb-run --server-args="-screen 0 1024x768x24+32" \
-a dbus-run-session -- make test-unit

- name: Run Unit Tests with pytest (macOS)
if: runner.os == 'macOS'
run: |
brew install openssl readline xz borgbackup
env:
BORG_VERSION: ${{ matrix.borg-version }}
PKG_CONFIG_PATH: /usr/local/opt/openssl@3/lib/pkgconfig
run: echo $PKG_CONFIG_PATH && make test-unit

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
env:
OS: ${{ runner.os }}
python: ${{ matrix.python-version }}
with:
token: ${{ secrets.CODECOV_TOKEN }}
env_vars: OS, python

test-integration:
timeout-minutes: 20
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false

matrix:
python-version: ["3.8", "3.9", "3.10", "3.11"]
os: [ubuntu-latest, macos-latest]
borg-version: ["1.1.18", "1.2.2", "1.2.4", "2.0.0b5"]
exclude:
- borg-version: "2.0.0b5"
python-version: "3.8"

steps:
- uses: actions/checkout@v3

- name: Install system dependencies
uses: ./.github/actions/install-dependencies

- name: Setup python, vorta and dev deps
uses: ./.github/actions/setup
with:
python-version: ${{ matrix.python-version }}
install-nox: true

- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled }}

- name: Test with pytest (Linux)
- name: Run Integration Tests with pytest (Linux)
if: runner.os == 'Linux'
env:
BORG_VERSION: ${{ matrix.borg-version }}
run: |
xvfb-run --server-args="-screen 0 1024x768x24+32" \
-a dbus-run-session -- make test
- name: Test with pytest (macOS)
-a dbus-run-session -- make test-integration

- name: Run Integration Tests with pytest (macOS)
if: runner.os == 'macOS'
run: make test
env:
BORG_VERSION: ${{ matrix.borg-version }}
PKG_CONFIG_PATH: /usr/local/opt/openssl@3/lib/pkgconfig
run: echo $PKG_CONFIG_PATH && make test-integration

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
Expand Down
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,13 @@ lint:
pre-commit run --all-files --show-diff-on-failure

test:
pytest --cov=vorta
nox -- --cov=vorta

test-unit:
nox -- --cov=vorta tests/unit

test-integration:
nox -- --cov=vorta tests/integration

help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
56 changes: 56 additions & 0 deletions noxfile.py
real-yfprojects marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import os
import re
import sys

import nox

borg_version = os.getenv("BORG_VERSION")

if borg_version:
# Use specified borg version
supported_borgbackup_versions = [borg_version]
else:
# Generate a list of borg versions compatible with system installed python version
system_python_version = tuple(sys.version_info[:3])

supported_borgbackup_versions = [
borgbackup
for borgbackup in ("1.1.18", "1.2.2", "1.2.4", "2.0.0b6")
# Python version requirements for borgbackup versions
if (borgbackup == "1.1.18" and system_python_version >= (3, 5, 0))
or (borgbackup == "1.2.2" and system_python_version >= (3, 8, 0))
or (borgbackup == "1.2.4" and system_python_version >= (3, 8, 0))
or (borgbackup == "2.0.0b6" and system_python_version >= (3, 9, 0))
]


@nox.session
@nox.parametrize("borgbackup", supported_borgbackup_versions)
def run_tests(session, borgbackup):
# install borgbackup
if (sys.platform == 'darwin'):
# in macOS there's currently no fuse package which works with borgbackup directly
session.install(f"borgbackup=={borgbackup}")
elif (borgbackup == "1.1.18"):
# borgbackup 1.1.18 doesn't support pyfuse3
session.install("llfuse")
session.install(f"borgbackup[llfuse]=={borgbackup}")
else:
session.install(f"borgbackup[pyfuse3]=={borgbackup}")

# install dependencies
session.install("-r", "requirements.d/dev.txt")
session.install("-e", ".")

# check versions
cli_version = session.run("borg", "--version", silent=True).strip()
cli_version = re.search(r"borg (\S+)", cli_version).group(1)
python_version = session.run("python", "-c", "import borg; print(borg.__version__)", silent=True).strip()

session.log(f"Borg CLI version: {cli_version}")
session.log(f"Borg Python version: {python_version}")

assert cli_version == borgbackup
assert python_version == borgbackup

session.run("pytest", *session.posargs, env={"BORG_VERSION": borgbackup})
2 changes: 2 additions & 0 deletions requirements.d/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ black==22.*
coverage
flake8
macholib
nox
pkgconfig
pre-commit
pyinstaller
pylint
Expand Down
104 changes: 0 additions & 104 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,11 @@
import os
import sys
from datetime import datetime as dt
from unittest.mock import MagicMock

import pytest
import vorta
import vorta.application
import vorta.borg.jobs_manager
from peewee import SqliteDatabase
from vorta.store.models import (
ArchiveModel,
BackupProfileModel,
EventLogModel,
RepoModel,
RepoPassword,
SchemaVersion,
SettingsModel,
SourceFileModel,
WifiSettingModel,
)
from vorta.views.main_window import MainWindow

models = [
RepoModel,
RepoPassword,
BackupProfileModel,
SourceFileModel,
SettingsModel,
ArchiveModel,
WifiSettingModel,
EventLogModel,
SchemaVersion,
]


def pytest_configure(config):
Expand All @@ -55,86 +29,8 @@ def qapp(tmpdir_factory):

from vorta.application import VortaApp

VortaApp.set_borg_details_action = MagicMock() # Can't use pytest-mock in session scope
VortaApp.scheduler = MagicMock()

qapp = VortaApp([]) # Only init QApplication once to avoid segfaults while testing.

yield qapp
mock_db.close()
qapp.quit()


@pytest.fixture(scope='function', autouse=True)
def init_db(qapp, qtbot, tmpdir_factory):
tmp_db = tmpdir_factory.mktemp('Vorta').join('settings.sqlite')
mock_db = SqliteDatabase(
str(tmp_db),
pragmas={
'journal_mode': 'wal',
},
)
vorta.store.connection.init_db(mock_db)

default_profile = BackupProfileModel(name='Default')
default_profile.save()

new_repo = RepoModel(url='i0fi93@i593.repo.borgbase.com:repo')
new_repo.encryption = 'none'
new_repo.save()

default_profile.repo = new_repo.id
default_profile.dont_run_on_metered_networks = False
default_profile.validation_on = False
default_profile.save()

test_archive = ArchiveModel(snapshot_id='99999', name='test-archive', time=dt(2000, 1, 1, 0, 0), repo=1)
test_archive.save()

test_archive1 = ArchiveModel(snapshot_id='99998', name='test-archive1', time=dt(2000, 1, 1, 0, 0), repo=1)
test_archive1.save()

source_dir = SourceFileModel(dir='/tmp/another', repo=new_repo, dir_size=100, dir_files_count=18, path_isdir=True)
source_dir.save()

qapp.main_window.deleteLater()
del qapp.main_window
qapp.main_window = MainWindow(qapp) # Re-open main window to apply mock data in UI

yield

qapp.jobs_manager.cancel_all_jobs()
qapp.backup_finished_event.disconnect()
qapp.scheduler.schedule_changed.disconnect()
qtbot.waitUntil(lambda: not qapp.jobs_manager.is_worker_running(), **pytest._wait_defaults)
mock_db.close()


@pytest.fixture
def choose_file_dialog(*args):
class MockFileDialog:
def __init__(self, *args, **kwargs):
pass

def open(self, func):
func()

def selectedFiles(self):
return ['/tmp']

return MockFileDialog


@pytest.fixture
def borg_json_output():
def _read_json(subcommand):
stdout = open(f'tests/borg_json_output/{subcommand}_stdout.json')
stderr = open(f'tests/borg_json_output/{subcommand}_stderr.json')
return stdout, stderr

return _read_json


@pytest.fixture
def rootdir():
return os.path.dirname(os.path.abspath(__file__))
Loading