diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index 4c0c533..df5c357 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -207,6 +207,20 @@ jobs: windeployqt dist/backer-gui.exe if ($LASTEXITCODE -ne 0) { Write-Warning "windeployqt exited with $LASTEXITCODE"; $global:LASTEXITCODE = 0 } } + # 复制 VC++ 运行时 DLL(避免无 VC++ Redistributable 的机器上无法启动) + $vswhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + if (Test-Path $vswhere) { + $vsInstallDir = & $vswhere -latest -property installationPath + $vcRedistPaths = Resolve-Path "$vsInstallDir\VC\Redist\MSVC\*\x64\Microsoft.VC143.CRT\*" -ErrorAction SilentlyContinue + if ($vcRedistPaths) { + Copy-Item "$(Split-Path $vcRedistPaths[0])\*.dll" dist/ + Write-Host "✅ VC++ runtime DLLs copied" + } else { + Write-Warning "⚠ VC++ redist directory not found" + } + } else { + Write-Warning "⚠ vswhere not found, skipping VC++ runtime DLLs" + } Copy-Item "C:\Program Files\OpenSSL\bin\libcrypto-4-x64.dll" dist/ Copy-Item "C:\Program Files\OpenSSL\bin\libssl-4-x64.dll" dist/ Copy-Item LICENSE dist/ diff --git a/.gitignore b/.gitignore index 438ee00..a5528a9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,10 @@ assets/ data/ testdata/ output - +node_modules/ +package-lock.json +package.json +docs/diagrams/dist/* # ================= latex ================= .build/* @@ -58,9 +61,9 @@ ENV/ .cppcheck-cache/ # =============== 日志文件 =============== -logs/ -**/logs/ -*.log +# logs/ +# **/logs/ +# *.log # =============== IDE =============== # JetBrains diff --git a/README.md b/README.md index e8e18b8..4df8069 100644 --- a/README.md +++ b/README.md @@ -14,22 +14,62 @@ ## 📖 项目简介 -Backer 是计算机组成与体系结构/软件工程课程项目,基于 **C++17** 在 **Linux** 平台开发,使用 **CLI11** 提供命令行接口,**spdlog** 处理日志,**Google Test** 驱动测试。 +Backer 是一款 **Linux 平台的数据备份还原工具**,采用 **C++17** 开发,支持目录树备份与还原、特殊文件处理、元数据保留、灵活筛选、多格式打包、多算法压缩加密、图形界面与定时备份等完整功能。 -依赖通过 **CMake FetchContent** 自动拉取(CLI11 v2.4.2、spdlog v1.14.1、GTest v1.15.2),无需手动安装。加密功能依赖系统 OpenSSL(`libssl-dev`,通过 `find_package` 接入)。 +## 📁 项目结构 -**当前状态**:已完成核心备份/还原、特殊文件、元数据保留、自定义筛选(6 维度)、Tar/Zip 打包、gzip/zstd/lzma 压缩、AES-256-GCM/SM4-CBC 加密、Qt 6 图形界面及**定时备份(Cron 调度 + 数据淘汰)**。后续将通过管道架构扩展实时监控及网络备份等功能。 +```text +backer/ +├── CMakeLists.txt # 根构建配置(FetchContent 自动拉取依赖) +├── Dockerfile # Multi-stage Docker 构建 +├── docker-bake.hcl # Docker Bake 多平台构建 +├── docker-compose.yml # Compose 编排 +├── .dockerignore # 构建上下文精简 +├── .github/ # CI/CD: 三平台构建测试 + 发布 + 镜像推送 +├── .claude/ # Claude Code AI 辅助配置 +├── .vscode/ # VS Code 编辑器配置 +├── .gitignore +├── CLAUDE.md # AI 辅助开发指南 +├── LICENSE # Apache 2.0 +├── cppcheck-suppressions.txt # 静态分析抑制规则 +├── cppcheck-report.txt # 静态分析报告 +├── cmake/ # CMake 模块(FetchQt6.cmake) +├── docs/ +│ ├── architecture-design.md # 分层架构 + 管道模式 +│ ├── requirements.md # 需求规格说明 +│ ├── technology-selection.md # 技术选型记录 +│ ├── reportDetails.md # 课程报告详情 +│ ├── usage.md # 使用文档 +│ ├── ppt.md # 课程答辩提纲 +│ ├── diagrams/ # 架构图源文件(PlantUML) +│ ├── images/ # 文档配图 +│ └── plans/ # 分阶段实现计划 +├── src/ # 源代码 +│ ├── main.cpp # 程序入口 +│ ├── cli/ # 命令行接口 (CLI11) +│ ├── core/ # 备份/还原引擎 +│ ├── fs/ # 文件系统抽象层 +│ ├── storage/ # 存储抽象层 +│ ├── filters/ # 筛选器(6 维度) +│ ├── pack/ # 打包模块(Tar/Zip) +│ ├── compress/ # 压缩模块(gzip/zstd/lzma) +│ ├── crypto/ # 加密模块(AES/SM4) +│ ├── gui/ # Qt 6 图形界面 +│ └── scheduler/ # 定时备份 +├── tests/ # Google Test 单元测试 +├── scripts/ # 辅助脚本 +├── logs/ # 测试日志(gtest/ctest/valgrind) +└── data/ # 测试数据(.gitignore) +``` -## 🔧 构建与运行 +## 🔧 快速开始 **前置要求**:GCC 9+ / Clang 12+、CMake 3.16+ -> 加密功能需要系统安装 OpenSSL 开发库(Ubuntu: `sudo apt install libssl-dev`,Fedora: `sudo dnf install openssl-devel`)。CMake 通过 `find_package` 自动检测。 - -### Linux - ```bash -# 构建(CLI 版本,需要 OpenSSL) +sudo apt install libssl-dev # 加密功能依赖 OpenSSL + +# 构建(CLI 版本) cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc) @@ -37,54 +77,23 @@ cmake --build build -j$(nproc) cmake -B build -DBUILD_GUI=ON -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc) -# 运行测试 -ctest --test-dir build --output-on-failure - -# 生成测试数据(在 data/source 下创建目录及各类文件) -bash scripts/setup-testdata.sh +# 测试(日志输出到 logs/) +ctest --test-dir build --output-on-failure &>logs/ctest.log +./build/backer_test &>logs/gtest-all.log +valgrind --leak-check=full ./build/backer_test --gtest_filter="*" &>logs/valgrind.log +perf record -g -o logs/perf.data ./build/backer-cli backup data/source data/backup +perf report -i logs/perf.data --stdio >logs/perf.txt -# CLI 使用(测试数据目录备份/还原) -./build/backer-cli backup data/source data/backup -./build/backer-cli restore data/backup data/restore - -# 端到端流程测试(交互式选择 Local/Docker) -bash scripts/test-backup-restore.sh - -# 仅运行特定测试 -./build/backer_test --gtest_filter="*RestoreEngine*" +# CLI 使用(完整命令参考见 [使用文档](docs/usage.md)) +./build/backer-cli --help ``` -### Docker 构建 +### Docker ```bash -# 先准备好测试数据 -bash scripts/setup-testdata.sh - -# 构建镜像(multi-stage 构建,最终镜像约 100MB) -# 国内用户可添加 --build-arg GH_PROXY=https://ghproxy.net/ 加速依赖下载 docker build -t backer . - -# 使用 Compose(含数据卷挂载)进入容器执行备份 -docker compose run --rm backer backup /data/source /data/backup - -# 查看备份结果(目录已挂载到宿主机) -ls -la data/backup - -# 使用 Compose 还原备份 -docker compose run --rm backer restore /data/backup /data/restore - -# 查看还原结果 -ls -la data/restore - -# 交互式运行 -docker run --rm backer --help ``` -`docker-compose.yml` 默认挂载三个数据卷: -- `./data/source:/data/source:ro` — 待备份源目录 -- `./data/backup:/data/backup` — 备份输出目录 -- `./data/restore:/data/restore` — 还原目标目录 - ## 📌 规划特性 - ✅ **核心备份/还原** — 目录树递归扫描,文件内容读写,备份索引 @@ -99,51 +108,7 @@ docker run --rm backer --help - ✅ **定时备份** — Cron 表达式调度 + 快照数据淘汰 - 🔲 **网络备份** — gRPC + Protocol Buffers 远程备份 -## 📁 项目结构 - -```text -backer/ -├── CMakeLists.txt # 根构建配置(FetchContent 自动拉取依赖) -├── Dockerfile # Multi-stage Docker 构建 -├── docker-compose.yml # Compose 编排 -├── .dockerignore # 构建上下文精简 -├── .github/ # CI: workflows/ci.yml(lint → 构建测试 → Valgrind → Docker) -├── .claude/ # Claude Code AI 辅助配置(commands/:implement-feature, test-features, update-info, git 等) -├── cmake/ # CMake 模块(FetchQt6.cmake — Qt6 自动下载) -├── .vscode/ # VS Code 编辑器配置(c_cpp_properties.json) -├── CLAUDE.md # AI 辅助开发指南 -├── LICENSE # Apache 2.0 -├── docs/ -│ ├── architecture-design.md # 分层架构 + 管道模式 -│ ├── requirements.md # 需求规格说明 -│ ├── technology-selection.md # 技术选型记录 -│ ├── reportDetails.md # 课程报告详情 -│ └── plans/ # 分阶段实现计划(README + 01~11) -├── src/ # 🔧 源代码 -│ ├── main.cpp # 程序入口(CLI 初始化 + 命令派发) -│ ├── cli/ # ✅ 命令行接口 (CLI11) -│ ├── core/ # ✅ 备份/还原引擎(含特殊文件+元数据) -│ ├── fs/ # ✅ 文件系统抽象层(含元数据+特殊文件) -│ ├── storage/ # ✅ 存储抽象层(本地文件系统) -│ ├── filters/ # ✅ 筛选器(6 维度自定义规则) -│ ├── pack/ # ✅ 打包模块(Tar ustar + miniz Zip) -│ ├── compress/ ✅ # 压缩模块(gzip/zstd/lzma 策略接口 + 工厂) -│ ├── crypto/ ✅ # 加密模块(AES-256-GCM / SM4-CBC,基于 OpenSSL EVP) -│ ├── gui/ ✅ # Qt 6 图形界面(自动下载 Qt6) -│ ├── scheduler/ ✅ # 定时备份(cron 调度 + 数据淘汰) -│ ├── watch/ 🔲 # inotify 实时监控 -│ └── network/ 🔲 # gRPC 网络备份 -├── tests/ # 📝 Google Test 单元测试 -├── scripts/ # 辅助脚本(setup-qt6.sh, setup-testdata.sh, test-backup-restore.sh) -└── data/ # 🧪 脚本生成的测试数据(.gitignore) - ├── source/ # 源目录(setup-testdata.sh 生成) - ├── backup/ # 备份输出 - └── restore/ # 还原目标 -``` - -> ✅ = 已完成 🔲 = 待实施 - -## 🏗️ 架构设计 +## 🏗️ 架构设计f 详见 [架构设计文档](docs/architecture-design.md)。 @@ -189,17 +154,6 @@ git push origin <分支名> # 6. 在 GitHub 上创建 Pull Request → 待 review 通过后合入 main(合并时务必选择 **Squash and merge**,不要使用 Create a merge commit) ``` -### CI/CD - -项目配置了 [GitHub Actions CI](.github/workflows/ci.yml),每次推送/PR 自动运行: - -| Job | 系统 | 内容 | -|-----|------|------| -| `linux-build` | Ubuntu 22.04 | GCC-12 / Clang-14 双编译器 + Google Test + GUI | -| `macos-build` | macOS 14 | Xcode Clang + Google Test | -| `windows-build` | Windows 2022 | MSVC + Google Test | -| `docker` | Ubuntu 22.04 | Docker 镜像构建验证 | - ## 📄 许可证 本项目基于 Apache License 2.0 开源 — 详见 [LICENSE](LICENSE)。 diff --git a/docs/diagrams/src/class.puml b/docs/diagrams/src/class.puml new file mode 100644 index 0000000..ffe584e --- /dev/null +++ b/docs/diagrams/src/class.puml @@ -0,0 +1,36 @@ +@startuml backer-class +skinparam backgroundColor #FEFEFE +skinparam classBorderColor #2C3E50 +skinparam classBackgroundColor #ECF0F1 +skinparam arrowColor #2C3E50 + +class "CLI Commands" { + + handleBackup(source, dest) : int + + handleRestore(source, dest) : int +} + +class BackupEngine { + + backup(source, dest) : BackupResult +} + +class RestoreEngine { + + restore(source, dest) : BackupResult +} + +class BackupScheduler { + + addJob(job) + + run() +} + +interface FSAbstraction { + + {abstract} walk(root) + + {abstract} read(path) +} + +"CLI Commands" --> BackupEngine +"CLI Commands" --> RestoreEngine +"CLI Commands" --> BackupScheduler + +BackupEngine --> FSAbstraction +RestoreEngine --> FSAbstraction +@enduml diff --git a/docs/diagrams/src/component.puml b/docs/diagrams/src/component.puml new file mode 100644 index 0000000..242b78a --- /dev/null +++ b/docs/diagrams/src/component.puml @@ -0,0 +1,50 @@ +@startuml backer-component +skinparam backgroundColor #FEFEFE +skinparam componentBorderColor #2C3E50 +skinparam componentBackgroundColor #ECF0F1 +skinparam arrowColor #2C3E50 + +title 构件图 - 物理体系结构 + +package "可执行构件" { + [backer-cli] as CLI_EXE <> + [backer-gui] as GUI_EXE <> +} + +package "业务逻辑" { + [Backup Engine] + [Restore Engine] + [Backup Scheduler] +} + +package "管道构件" { + [Filter Library] + component "Packer Library" { + [Tar] + [Zip] + } + component "Compress Library" { + [Gzip] + [Zstd] + } + component "Crypto Library" { + [AES-256-GCM] + [SM4-CBC] + } +} + +package "基础设施" { + [FS Abstraction] + [Metadata Manager] +} + +CLI_EXE --> [Backup Engine] : uses +CLI_EXE --> [Backup Scheduler] : uses +GUI_EXE --> [Backup Engine] : uses +[Backup Engine] --> [FS Abstraction] : uses +[Restore Engine] --> [FS Abstraction] : uses +[Backup Engine] --> [Packer Library] : uses +[Backup Engine] --> [Compress Library] : uses +[Backup Engine] --> [Crypto Library] : uses +[Backup Engine] --> [Filter Library] : uses +@enduml diff --git a/docs/diagrams/src/layers.puml b/docs/diagrams/src/layers.puml new file mode 100644 index 0000000..fe66abb --- /dev/null +++ b/docs/diagrams/src/layers.puml @@ -0,0 +1,41 @@ +@startuml backer-layers +skinparam backgroundColor #FEFEFE +skinparam componentBorderColor #2C3E50 +skinparam componentBackgroundColor #ECF0F1 +skinparam arrowColor #3498DB + +title 分层架构 + +package "表现层" { + [CLI 命令] + [Qt GUI] +} +note right: 入口,调用业务层 + +package "业务层" { + [备份/还原引擎] + [备份调度器] +} +note right: 编排管道,调度任务 + +package "管道层" { + [筛选/打包/压缩/加密] +} +note right: 策略接口,按需组合 + +package "基础设施层" { + [文件系统抽象 / 元数据] +} +note right: 文件读写、元数据、特殊文件 + +package "存储层" { + [本地存储] +} +note right: 数据持久化 + +表现层 --> 业务层 : calls +业务层 --> 管道层 : orchestrates +业务层 --> 基础设施层 : uses +业务层 --> 存储层 : reads/writes +管道层 --> 基础设施层 : accesses files +@enduml diff --git a/docs/diagrams/src/sequence-backup.puml b/docs/diagrams/src/sequence-backup.puml new file mode 100644 index 0000000..9dddb45 --- /dev/null +++ b/docs/diagrams/src/sequence-backup.puml @@ -0,0 +1,41 @@ +@startuml backer-sequence-backup +skinparam backgroundColor #FEFEFE +skinparam participantPadding 20 +skinparam sequenceMessageAlign center + +actor 用户 as USER +participant CLI +participant BackupEngine as ENGINE +participant 文件系统 as FS +participant 管道 as PIPE +participant 存储 as STOR + +USER -> CLI: backup /source /dest --pack tar +activate CLI + +CLI -> ENGINE: backup(source, dest, options) +activate ENGINE + +ENGINE -> FS: walk(source) +activate FS +FS --> ENGINE: 文件列表 +deactivate FS + +ENGINE -> PIPE: apply(筛选/打包/压缩/加密) +activate PIPE +PIPE -> FS: read(file) +FS --> PIPE: file content +PIPE --> ENGINE: 处理完成 +deactivate PIPE + +ENGINE -> STOR: writeFile(dest, data) +activate STOR +STOR --> ENGINE: 写入成功 +deactivate STOR + +ENGINE --> CLI: 返回结果 +deactivate ENGINE + +CLI --> USER: 打印备份结果 +deactivate CLI +@enduml diff --git a/docs/diagrams/src/use-case.puml b/docs/diagrams/src/use-case.puml new file mode 100644 index 0000000..5d13280 --- /dev/null +++ b/docs/diagrams/src/use-case.puml @@ -0,0 +1,23 @@ +@startuml backer-use-case +skinparam backgroundColor #FEFEFE +skinparam usecaseBorderColor #2C3E50 +skinparam usecaseBackgroundColor #ECF0F1 +skinparam actorBorderColor #2C3E50 +skinparam arrowColor #2C3E50 + +left to right direction + +actor "用户" as USER + +usecase "备份数据" as BCK +usecase "还原数据" as RES +usecase "管理定时任务" as SCH +usecase "查看备份索引" as IDX +usecase "配置参数" as CFG + +USER --> BCK +USER --> RES +USER --> SCH +USER --> IDX +USER --> CFG +@enduml diff --git a/docs/ppt.md b/docs/ppt.md new file mode 100644 index 0000000..c91c658 --- /dev/null +++ b/docs/ppt.md @@ -0,0 +1,252 @@ +--- +标题:Backer — 数据备份软件 项目说明 +要点: +- 软件综合实验 课程项目 +- 电子科技大学 计算机科学与工程学院 +- 作者:古文斌 2023080901012、叶炜 2023080901024、谢松谕 2023080902017 +- 日期:2026年7月 +--- + +--- +标题:目录 / Outline +要点: +- 项目背景与需求 +- 系统架构设计 +- 功能实现与评分 +- UML 建模 +- 软件开发工具链 +- 人员分工与进度把控 +- 总结与展望 +--- + +--- +标题:项目背景 +要点: +- 电子科技大学计算机专业最后一门实践必修课,综合运用本科所学知识 +- 围绕一个模拟实战软件项目,以 3 人团队完成从需求分析→系统设计→编码实现→集成测试的完整软件生命周期 +- 项目目标:开发一款**数据备份软件**,支持目录树的备份与还原,并可选实现多项扩展功能 +- 重点考察:正确性、易用性、健壮性 +--- + +--- +标题:需求概述 +要点: +- **基本要求**:目录树文件数据的备份与还原 +- **扩展要求**: + - 特殊文件支持(管道/链接/设备文件) + - 元数据支持(属主/时间/权限) + - 自定义筛选(路径/类型/名称/时间/尺寸/属主 6 维度) + - Tar / Zip 两种打包格式 + - gzip / zstd / lzma 三种压缩算法 + - AES-256-GCM / SM4-CBC 两种加密算法 + - Qt 6 图形界面 + - cron 定时备份与自动淘汰 +--- + +--- +标题:总体架构设计 +要点: +- 自底向上五层分层架构:(1)存储层(本地文件系统)→ (2)基础设施层(FSAbstraction/元数据管理/特殊文件支持)→ (3)管道层(Filter→Packer→Compressor→Encryptor)→ (4)业务层(BackupEngine/RestoreEngine/Scheduler)→ (5)表现层(CLI + GUI),各层间箭头标注数据流向。右侧标注关键技术:CLI11、spdlog、Qt6、OpenSSL、miniz、ccronexpr +- 采用**五层分层架构** + **管道模式**设计 + - 表现层:CLI (CLI11) + GUI (Qt 6) + - 业务层:BackupEngine / RestoreEngine / BackupScheduler + - 管道层:Filter → Packer → Compressor → Encryptor 可插拔组合 + - 基础设施层:FSAbstraction / Metadata / 特殊文件处理 + - 存储层:LocalStorage +- 各层通过抽象接口通信,上层依赖下层,下层对上层无感知 +- ![五层分层架构](diagrams/dist/backer-layers.svg) +--- + +--- +标题:核心模块 — 备份/还原引擎 +要点: +- **BackupEngine**: 备份流程编排器 + - `walk(source)` → 遍历目录树获取 FileEntry 列表 + - `filter(entries)` → 按 6 维度筛选 + - `pack(entries)` → Tar/Zip 打包 + - `compress(buffer)` → gzip/zstd/lzma 压缩 + - `encrypt(buffer)` → AES/SM4 加密 + - `storage.write()` → 持久化到本地 +- **RestoreEngine**: 还原流程编排器(逆操作) + - 支持目录镜像模式(逐个文件复制)和归档模式(打包文件) +- 备份流程完整步骤:用户输入 backup 命令 → CLI 解析参数 → BackupEngine 调起 → FSAbstraction 遍历目录 → Filter 筛选 → Packer 打包 → Compressor 压缩 → Encryptor 加密 → Storage 写入磁盘,各步骤可选(虚线框标注) +--- + +--- +标题:核心模块 — 管道策略接口 +要点: +- 采用**策略模式**设计管道阶段,新增算法无需修改现有代码 +- **Filter**:`apply(entries)` → 返回筛选后子集 +- **Packer**:`pack/unpack(files, fs, stream)` → TarPacker / ZipPacker +- **Compressor**:`compress/decompress(input, output)` → Gzip / Zstd / Lzma +- **Encryptor**:`encrypt/decrypt(input, output, password)` → AES-256-GCM / SM4-CBC +- 使用工厂模式 (`CompressorFactory` / `EncryptorFactory`) 实现算法注册与按名创建 +- 所有接口使用 `std::expected` 返回,错误传播清晰 +--- + +--- +title: UML 建模 — 用例图 +要点: +- 主要用例包括:备份数据(含筛选文件子用例)、还原数据、管理定时任务(含添加/删除/启用/禁用子用例)、查看备份索引、配置参数(含选择打包格式/选择压缩算法/选择加密算法子用例) +- 覆盖全部需求功能点 +- `docs/diagrams/src/use-case.puml` +- ![UML 用例图](diagrams/dist/backer-use-case.svg) +--- + +--- +标题:UML 建模 — 类图 +要点: +- 五大分层核心类:表现层(MainWindow/BackupTab/CLICommands)、业务层(BackupEngine/RestoreEngine/BackupScheduler)、管道层(Filter←CriteriaFilter, Packer←TarPacker/ZipPacker, Compressor←GzipCompressor/ZstdCompressor/LzmaCompressor, Encryptor←OpenSslEncryptor)、基础设施层(FSAbstraction←LocalFsAbstraction)、存储层(Storage←LocalStorage) +- 管道层全部采用接口(纯虚类)设计,支持可插拔策略 +- 表现层与业务层解耦,CLI 和 GUI 共用同一套业务接口 +- ![UML 类图](diagrams/dist/backer-class.svg) +--- + +--- +标题:UML 建模 — 顺序图 / 构件图 +要点: +- 一次完整备份请求的交互流程:用户→CLI→BackupEngine→FSAbstraction(walk)→Filter(apply)→Packer(pack)→Compressor(compress)→Encryptor(encrypt, PBKDF2+AES)→Storage(writeFile)→返回结果 +- 可执行构件(backer-cli/backer-gui/backer_test)与各编译单元(commands.cpp, backup_engine.cpp, tar_packer.cpp 等)及外部依赖(CLI11/spdlog/Qt6/OpenSSL/miniz/ccronexpr/Google Test)之间的链接和依赖关系 +- 顺序图清晰展示备份请求在 5 层架构中的完整传递路径 +- 构件图反映编译期依赖关系,指导模块化开发和增量编译 +- ![UML 顺序图](diagrams/dist/backer-sequence-backup.svg) +- ![UML 构件图](diagrams/dist/backer-component.svg) +--- + +--- +标题:功能实现概览 +要点: +| 类别 | 功能 | 状态 | +|:-----|:-----|:----:| +| 基本要求 | 目录镜像备份 | ✅ | +| 扩展要求 | 特殊文件支持(管道/链接/设备) | ✅ | +| 扩展要求 | 元数据保留(属主/时间/权限) | ✅ | +| 扩展要求 | 6 维度筛选器(路径/类型/名称/时间/尺寸/属主) | ✅ | +| 扩展要求 | Tar / Zip 打包 | ✅ | +| 扩展要求 | gzip / zstd / lzma 压缩 | ✅ | +| 扩展要求 | AES-256-GCM / SM4-CBC 加密 | ✅ | +| 扩展要求 | Qt 6 图形界面 | ✅ | +| 扩展要求 | cron 定时备份与自动淘汰 | ✅ | +- 打包+压缩+加密可串联使用:`backup src dest --pack tar --compress zstd --encrypt aes256 --password pwd` +--- + +--- +标题:图形界面展示 +要点: +- 主窗口包含4个标签页:(1)备份标签页:源路径/目标路径选择、打包/压缩/加密选项、开始按钮;(2)还原标签页:备份源/还原目标选择、解密/解压/解包选项;(3)定时任务标签页:任务列表表格(cron表达式/下次执行时间)、添加/删除/启用按钮;(4)设置标签页。窗口底部为状态栏和进度条 +- 基于 Qt 6 Widget 开发,4 个标签页: + - **备份**:源/目标路径选择 + 筛选/打包/压缩/加密参数配置 + - **还原**:备份源选择 + 解密/解压/解包选项 + - **定时任务**:任务列表 + 添加/删除/启用/禁用管理 + - **设置**:通用配置 +- 备份操作在 `QThread` 后台线程执行,不阻塞 UI +--- + +--- +标题:软件开发工具链 +要点: +- **版本控制**:Git + GitHub(PR 工作流、Issue 追踪、CI/CD) +- **集成开发**:VSCode + CMake + GCC/Clang/MSVC 三平台 +- **项目管理**:GitHub Issues(Bug 追踪和任务分配)+ GitHub Projects + - UML 建模:PlantUML(用例图、类图、顺序图、构件图) +- **单元测试**:Google Test(14 个测试文件覆盖全部功能模块) +- **内存检测**:Valgrind(`--leak-check=full`) +- **性能分析**:perf(内核级采样)+ gprof(`-pg` 编译插桩) +- **CI/CD**:GitHub Actions(三平台构建测试 + Docker 验证) +--- + +--- +标题:自动化测试体系 +要点: +- **单元测试**:Google Test,每个模块独立测试文件 + - core/: BackupEngine + RestoreEngine 集成测试 + - compress/: gzip/zstd/lzma 参数化测试 + - crypto/: AES/SM4 加解密验证 + - filter/: 6维度筛选逻辑全覆盖 + - fs/: 元数据 + 特殊文件读写 + - pack/: Tar/Zip 打包解包 + - scheduler/: 定时任务 + cron 表达式 + 淘汰策略 +- **CI 流水线**(GitHub Actions): + - Linux GCC + Clang 双编译器矩阵构建 + - macOS AppleClang 构建 + - Windows MSVC 构建 + - Docker multi-stage 构建验证 +- **本地检测**:Valgrind 内存泄漏检测 + perf/gprof 性能分析 +--- + +--- +标题:人员分工 +要点: +- **古文斌** — 技术选型和架构设计 + - 核心备份/还原引擎实现 + - 压缩(gzip/zstd/lzma)、加密(AES/SM4)功能实现与测试 +- **叶炜** — 测试和文档 + - 软件测试和测试报告编写 + - 测试用例设计与执行(Google Test + 端到端脚本) + - PPT 制作与演示材料 +- **谢松谕** — 编码实现和性能优化 + - 文件类型支持、元数据管理、6维度筛选器 + - Tar/Zip 打包解包、Qt 6 图形界面实现与测试 + - UML 图绘制、项目文档编写、演示视频制作 +--- + +--- +标题:项目进度与版本管理 +要点: +- **开发流程**:基于 GitHub Flow 分支策略 + - main → release/分支 → feature/分支 + - 每个功能独立分支开发,PR 合入前需 CI 通过 + Code Review +- **Git 提交规范**:`(): ` 格式 + - 如 `feat(core):` / `fix(cli):` / `docs(usage):` / `perf(ci):` +- **版本发布**:git tag + GitHub Release 自动发布 + - 当前版本:`release/airprofly_01-v1.0.0` +- **问题追踪**:GitHub Issues(bug report 模板 + 任务分配) +--- + +--- +标题:项目亮点与难点 +要点: +- **亮点**: + - 可插拔管道架构:新增压缩/加密算法仅需 3 个文件(接口实现+工厂注册) + - 跨平台三平台(Linux/macOS/Windows)CI 持续验证 + - 依赖零系统化:`git clone` → `cmake --build` 即可产出可执行软件 + - Full pipeline 串联:打包+压缩+加密可同时启用 +- **难点**: + - 特殊文件处理:设备号(major/minor)获取与重建需平台特定系统调用 + - 元数据还原顺序:属主→权限→时间戳需按内核预期顺序操作 + - 定时任务的时间计算:跨平台 cron 表达式解析 (ccronexpr) + - Qt 6 跨平台构建:不同平台 Qt 安装路径和依赖差异大 +--- + +--- +标题:总结与展望 +要点: +- **成果**:完成 158 分功能的数据备份软件,通过 CI 三平台构建验证和 Valgrind 内存检测 +- **已实现**:核心备份还原、特殊文件、元数据、6 维度筛选、Tar/Zip 打包、3 种压缩、2 种加密、GUI 界面、定时备份 +- **技术收获**: + - 经历完整软件生命周期:需求→设计→编码→测试→部署 + - 掌握 CMake/FetchContent + 零系统依赖的跨平台构建技术 + - 运用 RAII、策略模式、工厂模式、管道模式等 C++ 设计模式 + - 实践 Git Flow、CI/CD、自动化测试等现代工程实践 +- **可扩展方向**: + - 实时备份(inotify 目录监控) + - 网络备份(gRPC 客户端/服务端架构) + - 增量备份(基于文件哈希比较) +--- + +--- +标题:致谢 / Q&A +要点: +- 感谢课程指导老师的悉心指导 +- 感谢团队成员的通力协作 +- 项目地址:`https://github.com/airprofly/backer` +- 欢迎提问! +--- + +--- +风格指引:清洁、简约、舒缓 +要点: +- 整体风格:简约风格 +- 色彩基调:以柔和低饱和度的主色点缀 +- 传达感受:阅读轻松、视觉舒缓、令人感到舒适和专注 +--- diff --git a/docs/requirements.md b/docs/requirements.md index d84a073..cf980f3 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -38,3 +38,59 @@ 软件文档应包括:需求分析说明书、系统设计文档、软件测试报告,重点考察其规范性、一致性、可读性。 采用现代化软件开发工具辅助项目开发,包括但不限于:集成开发环境(VSCode、make、gdb),版本控制工具(git),代码检测工具(cpplint),软件测试工具(gtest、valgrind、gprof、perf)。 + + +## 课程背景 +本课程是电子科技大学计算机专业学生的最后一门实践类必修课程,旨在让学生在本科学习的最后阶段能对所学知识进行综合运用和融会贯通。 + +课程围绕一个模拟实战的软件项目,让学生以团队为单位,完成从需求分析、系统设计、程序编码到集成测试的整个软件生命周期。 + +通过对软件工程的全流程实践,提升学生的系统分析与建模能力、程序设计与实现能力、团队协作及领导能力,使学生具备足够的面向市场和科研环境的工程能力和职业素养。 + + +对软件开发过程、软件开发方法、软件开发环境有所掌握并进行基本实践。 + +设计并实现一款数据备份软件,以项目组形式推进,每组最多三人。 + +基于面向对象的软件工程方法学进行项目推进,经历从需求分析、系统设计、编码实现、软件测试的整个软件生命周期。 + +实验最终成果包括一款基本可用的软件及其对应文档。 + +软件应包括选定的完整功能,重点考察其正确性、易用性、健壮性。 + +软件文档应包括:需求分析说明书、系统设计文档、软件测试报告,重点考察其规范性、一致性、可读性。 + +采用现代化软件开发工具辅助项目开发,包括但不限于:项目管理工具(Teambition),UML建模工具(StarUML),集成开发环境(VSCode、make、gdb),版本控制工具(git),代码检测工具(cpplint),软件测试工具(gtest、valgrind、gprof、perf)。 + +AI的使用:本课程允许学生使用AI工具辅助完成,但并不鼓励学生一开始就直接使用AI。体验软件开发的整个生命周期以及从 0 到 1 的开发过程,对打基础阶段非常重要。 + + +## ppt项目说明 要求 + + +- 个人信息 + - 古文斌 2023080901012 + - 叶炜 2023080901024 + - 谢松谕 2023080902017 + +- 项目管理工具的使用情况 + - uml + - 至少使用用例图和用例描述完成项目的需求分析 + - 至少使用类图完成项目设计的静态建模部分 + - 至少使用顺序图完成项目设计的动态建模部分 + - 至少使用构件图完成项目设计的物理体系结构建模部分 + - 使用 Teambition 添加甘特图,查看任务与时间的顺序,通过拖拉操作对任务关系进行协调 ,使用 github issue 进行 bug 追踪和任务分配, + - 采用Github 创建在线版本库并使用git进行项目开发4 + - gtest + - 内存测试工具:valgrind + - 性能测试工具:gprof、perf + - 项目说明PPT +- 人员分工安排情况 + - 古文斌 负责项目的技术选型和架构设计,主要负责数据备份和还原功能,解压缩和加密解密功能的实现和功能测试。 + - 叶炜 负责项目的测试和文档编写,主要负责软件测试和报告的编写,测试用例的设计,以及 ppt 制作。 + - 谢松谕 负责项目的编码实现和性能优化,主要负责文件类型支持,元数据支持功能,自定义备份功能,打包解包,图形界面的实现和功能测试。同时负责项目的 UML 图的绘制和项目文档编写,以及演示视频制作。 +- 项目进度把控情况 +- 编程规范完善程度 +- 版本管理工具使用情况 + +- 同时要介绍和讲懂项目 diff --git a/logs/ctest.log b/logs/ctest.log new file mode 100644 index 0000000..ee64999 --- /dev/null +++ b/logs/ctest.log @@ -0,0 +1,572 @@ +Internal ctest changing into directory: /home/airprofly/codeFolder/backer/build +Test project /home/airprofly/codeFolder/backer/build + Start 1: BackupEngineTest.BackupBasic + 1/283 Test #1: BackupEngineTest.BackupBasic ........................................... Passed 0.01 sec + Start 2: BackupEngineTest.BackupContentMatches + 2/283 Test #2: BackupEngineTest.BackupContentMatches .................................. Passed 0.00 sec + Start 3: BackupEngineTest.BackupWithEmptyDir + 3/283 Test #3: BackupEngineTest.BackupWithEmptyDir .................................... Passed 0.00 sec + Start 4: BackupEngineTest.BackupNonExistentSource + 4/283 Test #4: BackupEngineTest.BackupNonExistentSource ............................... Passed 0.00 sec + Start 5: BackupEngineTest.BackupEmptyDirectory + 5/283 Test #5: BackupEngineTest.BackupEmptyDirectory .................................. Passed 0.00 sec + Start 6: BackupEngineTest.BackupBinaryFile + 6/283 Test #6: BackupEngineTest.BackupBinaryFile ...................................... Passed 0.00 sec + Start 7: BackupEngineTest.BackupDeepNestedDirectories + 7/283 Test #7: BackupEngineTest.BackupDeepNestedDirectories ........................... Passed 0.01 sec + Start 8: BackupEngineTest.BackupFileAsSourceFails + 8/283 Test #8: BackupEngineTest.BackupFileAsSourceFails ............................... Passed 0.00 sec + Start 9: BackupEngineTest.BackupUnicodeFilenames + 9/283 Test #9: BackupEngineTest.BackupUnicodeFilenames ................................ Passed 0.00 sec + Start 10: BackupEngineTest.BackupIdempotency + 10/283 Test #10: BackupEngineTest.BackupIdempotency ..................................... Passed 0.00 sec + Start 11: BackupEngineTest.BackupLargeFile + 11/283 Test #11: BackupEngineTest.BackupLargeFile ....................................... Passed 0.01 sec + Start 12: BackupEngineTest.BackupMixedContent + 12/283 Test #12: BackupEngineTest.BackupMixedContent .................................... Passed 0.00 sec + Start 13: BackupEngineTest.BackupSingleFile + 13/283 Test #13: BackupEngineTest.BackupSingleFile ...................................... Passed 0.00 sec + Start 14: BackupEngineTest.BackupNestedEmptyDirs + 14/283 Test #14: BackupEngineTest.BackupNestedEmptyDirs ................................. Passed 0.00 sec + Start 15: BackupEngineTest.BackupSymlinks + 15/283 Test #15: BackupEngineTest.BackupSymlinks ........................................ Passed 0.00 sec + Start 16: BackupEngineTest.BackupSymlinkToFileInSameDir + 16/283 Test #16: BackupEngineTest.BackupSymlinkToFileInSameDir .......................... Passed 0.00 sec + Start 17: BackupEngineTest.BackupPreservesPermissions + 17/283 Test #17: BackupEngineTest.BackupPreservesPermissions ............................ Passed 0.00 sec + Start 18: BackupEngineTest.BackupWithFilterIncludeType + 18/283 Test #18: BackupEngineTest.BackupWithFilterIncludeType ........................... Passed 0.00 sec + Start 19: BackupEngineTest.BackupWithFilterExcludePath + 19/283 Test #19: BackupEngineTest.BackupWithFilterExcludePath ........................... Passed 0.00 sec + Start 20: BackupEngineTest.BackupWithFilterAllExcluded + 20/283 Test #20: BackupEngineTest.BackupWithFilterAllExcluded ........................... Passed 0.00 sec + Start 21: BackupEngineTest.BackupWithTarPacker + 21/283 Test #21: BackupEngineTest.BackupWithTarPacker ................................... Passed 0.00 sec + Start 22: BackupEngineTest.BackupWithFilterAndPacker + 22/283 Test #22: BackupEngineTest.BackupWithFilterAndPacker ............................. Passed 0.00 sec + Start 23: RestoreEngineTest.RestoreBasic + 23/283 Test #23: RestoreEngineTest.RestoreBasic ......................................... Passed 0.00 sec + Start 24: RestoreEngineTest.RestoreContentMatches + 24/283 Test #24: RestoreEngineTest.RestoreContentMatches ................................ Passed 0.00 sec + Start 25: RestoreEngineTest.RestorePreservesEmptyDirs + 25/283 Test #25: RestoreEngineTest.RestorePreservesEmptyDirs ............................ Passed 0.00 sec + Start 26: RestoreEngineTest.RestoreNonExistentSource + 26/283 Test #26: RestoreEngineTest.RestoreNonExistentSource ............................. Passed 0.00 sec + Start 27: RestoreEngineTest.BackupRestoreEndToEnd + 27/283 Test #27: RestoreEngineTest.BackupRestoreEndToEnd ................................ Passed 0.00 sec + Start 28: RestoreEngineTest.BackupRestoreComplexTree + 28/283 Test #28: RestoreEngineTest.BackupRestoreComplexTree ............................. Passed 0.01 sec + Start 29: RestoreEngineTest.RestoreBinaryFile + 29/283 Test #29: RestoreEngineTest.RestoreBinaryFile .................................... Passed 0.00 sec + Start 30: RestoreEngineTest.RestoreUnicodeFilenames + 30/283 Test #30: RestoreEngineTest.RestoreUnicodeFilenames .............................. Passed 0.00 sec + Start 31: RestoreEngineTest.RestoreLargeFile + 31/283 Test #31: RestoreEngineTest.RestoreLargeFile ..................................... Passed 0.01 sec + Start 32: RestoreEngineTest.RestoreIdempotency + 32/283 Test #32: RestoreEngineTest.RestoreIdempotency ................................... Passed 0.00 sec + Start 33: RestoreEngineTest.RestoreOverwriteDifferentContent + 33/283 Test #33: RestoreEngineTest.RestoreOverwriteDifferentContent ..................... Passed 0.00 sec + Start 34: RestoreEngineTest.BackupRestoreRoundTripLargeTree + 34/283 Test #34: RestoreEngineTest.BackupRestoreRoundTripLargeTree ...................... Passed 0.01 sec + Start 35: RestoreEngineTest.BackupRestoreWithSymlinks + 35/283 Test #35: RestoreEngineTest.BackupRestoreWithSymlinks ............................ Passed 0.00 sec + Start 36: RestoreEngineTest.BackupRestoreDanglingSymlink + 36/283 Test #36: RestoreEngineTest.BackupRestoreDanglingSymlink ......................... Passed 0.00 sec + Start 37: RestoreEngineTest.BackupRestorePreservesPermissions + 37/283 Test #37: RestoreEngineTest.BackupRestorePreservesPermissions .................... Passed 0.00 sec + Start 38: RestoreEngineTest.BackupRestoreWithFifo + 38/283 Test #38: RestoreEngineTest.BackupRestoreWithFifo ................................ Passed 0.00 sec + Start 39: RestoreEngineTest.RestoreFromTarArchive + 39/283 Test #39: RestoreEngineTest.RestoreFromTarArchive ................................ Passed 0.00 sec + Start 40: RestoreEngineTest.RestoreFromTarArchiveEmptyDir + 40/283 Test #40: RestoreEngineTest.RestoreFromTarArchiveEmptyDir ........................ Passed 0.00 sec + Start 41: MetadataTest.ReadMetadataRegular + 41/283 Test #41: MetadataTest.ReadMetadataRegular ....................................... Passed 0.00 sec + Start 42: MetadataTest.ReadMetadataNonExistent + 42/283 Test #42: MetadataTest.ReadMetadataNonExistent ................................... Passed 0.00 sec + Start 43: MetadataTest.ReadMetadataDirectory + 43/283 Test #43: MetadataTest.ReadMetadataDirectory ..................................... Passed 0.00 sec + Start 44: MetadataTest.RestorePermissions + 44/283 Test #44: MetadataTest.RestorePermissions ........................................ Passed 0.00 sec + Start 45: MetadataTest.MetadataJsonRoundTrip + 45/283 Test #45: MetadataTest.MetadataJsonRoundTrip ..................................... Passed 0.00 sec + Start 46: MetadataTest.RestoreTimestamps + 46/283 Test #46: MetadataTest.RestoreTimestamps ......................................... Passed 0.00 sec + Start 47: MetadataTest.RestoreSetuidBit + 47/283 Test #47: MetadataTest.RestoreSetuidBit .......................................... Passed 0.00 sec + Start 48: MetadataTest.canRestoreOwnership + 48/283 Test #48: MetadataTest.canRestoreOwnership ....................................... Passed 0.00 sec + Start 49: MetadataTest.ReadMetadataSymlink + 49/283 Test #49: MetadataTest.ReadMetadataSymlink ....................................... Passed 0.00 sec + Start 50: SpecialFileTest.DetectRegularFile + 50/283 Test #50: SpecialFileTest.DetectRegularFile ...................................... Passed 0.00 sec + Start 51: SpecialFileTest.DetectDirectory + 51/283 Test #51: SpecialFileTest.DetectDirectory ........................................ Passed 0.00 sec + Start 52: SpecialFileTest.DetectNonExistent + 52/283 Test #52: SpecialFileTest.DetectNonExistent ...................................... Passed 0.00 sec + Start 53: SpecialFileTest.SymlinkRoundTrip + 53/283 Test #53: SpecialFileTest.SymlinkRoundTrip ....................................... Passed 0.00 sec + Start 54: SpecialFileTest.CreateSymlinkInNestedDir + 54/283 Test #54: SpecialFileTest.CreateSymlinkInNestedDir ............................... Passed 0.00 sec + Start 55: SpecialFileTest.DetectSymlink + 55/283 Test #55: SpecialFileTest.DetectSymlink .......................................... Passed 0.00 sec + Start 56: SpecialFileTest.DetectFifo + 56/283 Test #56: SpecialFileTest.DetectFifo ............................................. Passed 0.00 sec + Start 57: SpecialFileTest.ReadSymlinkDangling + 57/283 Test #57: SpecialFileTest.ReadSymlinkDangling .................................... Passed 0.00 sec + Start 58: SpecialFileTest.CreateFifoAndDetect + 58/283 Test #58: SpecialFileTest.CreateFifoAndDetect .................................... Passed 0.00 sec + Start 59: SpecialFileTest.CreateFifoWithPermissions + 59/283 Test #59: SpecialFileTest.CreateFifoWithPermissions .............................. Passed 0.00 sec + Start 60: SpecialFileTest.CreateDeviceAsNonRoot + 60/283 Test #60: SpecialFileTest.CreateDeviceAsNonRoot .................................. Passed 0.00 sec + Start 61: SpecialFileTest.DetectUnicodeFilename + 61/283 Test #61: SpecialFileTest.DetectUnicodeFilename .................................. Passed 0.00 sec + Start 62: CriteriaFilterTest.IncludePathGlob + 62/283 Test #62: CriteriaFilterTest.IncludePathGlob ..................................... Passed 0.00 sec + Start 63: CriteriaFilterTest.IncludePathGlobRecursive + 63/283 Test #63: CriteriaFilterTest.IncludePathGlobRecursive ............................ Passed 0.00 sec + Start 64: CriteriaFilterTest.IncludeNameGlob + 64/283 Test #64: CriteriaFilterTest.IncludeNameGlob ..................................... Passed 0.00 sec + Start 65: CriteriaFilterTest.IncludeFileType + 65/283 Test #65: CriteriaFilterTest.IncludeFileType ..................................... Passed 0.00 sec + Start 66: CriteriaFilterTest.IncludeTimeRange + 66/283 Test #66: CriteriaFilterTest.IncludeTimeRange .................................... Passed 0.00 sec + Start 67: CriteriaFilterTest.IncludeTimeRangeBefore + 67/283 Test #67: CriteriaFilterTest.IncludeTimeRangeBefore .............................. Passed 0.00 sec + Start 68: CriteriaFilterTest.IncludeSizeRange + 68/283 Test #68: CriteriaFilterTest.IncludeSizeRange .................................... Passed 0.00 sec + Start 69: CriteriaFilterTest.IncludeOwner + 69/283 Test #69: CriteriaFilterTest.IncludeOwner ........................................ Passed 0.00 sec + Start 70: CriteriaFilterTest.ExcludeType + 70/283 Test #70: CriteriaFilterTest.ExcludeType ......................................... Passed 0.00 sec + Start 71: CriteriaFilterTest.ExcludePathGlob + 71/283 Test #71: CriteriaFilterTest.ExcludePathGlob ..................................... Passed 0.00 sec + Start 72: CriteriaFilterTest.ExcludeOverridesInclude + 72/283 Test #72: CriteriaFilterTest.ExcludeOverridesInclude ............................. Passed 0.00 sec + Start 73: CriteriaFilterTest.IncludeAcrossDimensionsAnd + 73/283 Test #73: CriteriaFilterTest.IncludeAcrossDimensionsAnd .......................... Passed 0.00 sec + Start 74: CriteriaFilterTest.IncludeSameDimensionOr + 74/283 Test #74: CriteriaFilterTest.IncludeSameDimensionOr .............................. Passed 0.00 sec + Start 75: CriteriaFilterTest.SingleCriterionAndFields + 75/283 Test #75: CriteriaFilterTest.SingleCriterionAndFields ............................ Passed 0.00 sec + Start 76: CriteriaFilterTest.NoIncludeCriteriaAllPass + 76/283 Test #76: CriteriaFilterTest.NoIncludeCriteriaAllPass ............................ Passed 0.00 sec + Start 77: CriteriaFilterTest.EmptyCriteriaPassesAll + 77/283 Test #77: CriteriaFilterTest.EmptyCriteriaPassesAll .............................. Passed 0.00 sec + Start 78: CriteriaFilterTest.EmptyInput + 78/283 Test #78: CriteriaFilterTest.EmptyInput .......................................... Passed 0.00 sec + Start 79: CriteriaFilterTest.AllFilteredOut + 79/283 Test #79: CriteriaFilterTest.AllFilteredOut ...................................... Passed 0.00 sec + Start 80: CriteriaFilterTest.NoopFilterPassesAll + 80/283 Test #80: CriteriaFilterTest.NoopFilterPassesAll ................................. Passed 0.00 sec + Start 81: CriteriaFilterTest.NoopFilterEmptyInput + 81/283 Test #81: CriteriaFilterTest.NoopFilterEmptyInput ................................ Passed 0.00 sec + Start 82: CriteriaFilterTest.IncludeWildcardQuestionMark + 82/283 Test #82: CriteriaFilterTest.IncludeWildcardQuestionMark ......................... Passed 0.00 sec + Start 83: CriteriaFilterTest.IncludeBracketGlob + 83/283 Test #83: CriteriaFilterTest.IncludeBracketGlob .................................. Passed 0.00 sec + Start 84: CriteriaFilterTest.SizeExactlyAtMin + 84/283 Test #84: CriteriaFilterTest.SizeExactlyAtMin .................................... Passed 0.00 sec + Start 85: CriteriaFilterTest.SizeExactlyAtMax + 85/283 Test #85: CriteriaFilterTest.SizeExactlyAtMax .................................... Passed 0.00 sec + Start 86: CriteriaFilterTest.SizeZeroBytes + 86/283 Test #86: CriteriaFilterTest.SizeZeroBytes ....................................... Passed 0.00 sec + Start 87: CriteriaFilterTest.TimeExactlyAtBoundary + 87/283 Test #87: CriteriaFilterTest.TimeExactlyAtBoundary ............................... Passed 0.00 sec + Start 88: CriteriaFilterTest.IncludeAcrossSomeMatch + 88/283 Test #88: CriteriaFilterTest.IncludeAcrossSomeMatch .............................. Passed 0.00 sec + Start 89: CriteriaFilterTest.IncludePathWithSpaces + 89/283 Test #89: CriteriaFilterTest.IncludePathWithSpaces ............................... Passed 0.00 sec + Start 90: CriteriaFilterTest.ExcludeMultipleCriteria + 90/283 Test #90: CriteriaFilterTest.ExcludeMultipleCriteria ............................. Passed 0.00 sec + Start 91: CriteriaFilterTest.LargeEntryList + 91/283 Test #91: CriteriaFilterTest.LargeEntryList ...................................... Passed 0.00 sec + Start 92: TarPackerTest.PackSingleRegularFile + 92/283 Test #92: TarPackerTest.PackSingleRegularFile .................................... Passed 0.00 sec + Start 93: TarPackerTest.PackUnpackRoundTrip + 93/283 Test #93: TarPackerTest.PackUnpackRoundTrip ...................................... Passed 0.00 sec + Start 94: TarPackerTest.PackDirectory + 94/283 Test #94: TarPackerTest.PackDirectory ............................................ Passed 0.00 sec + Start 95: TarPackerTest.PackSymlink + 95/283 Test #95: TarPackerTest.PackSymlink .............................................. Passed 0.00 sec + Start 96: TarPackerTest.PackFifo + 96/283 Test #96: TarPackerTest.PackFifo ................................................. Passed 0.00 sec + Start 97: TarPackerTest.PackDevice + 97/283 Test #97: TarPackerTest.PackDevice ............................................... Passed 0.00 sec + Start 98: TarPackerTest.PackEmptyFile + 98/283 Test #98: TarPackerTest.PackEmptyFile ............................................ Passed 0.00 sec + Start 99: TarPackerTest.PackLongPath + 99/283 Test #99: TarPackerTest.PackLongPath ............................................. Passed 0.00 sec + Start 100: TarPackerTest.PackMultipleEntries +100/283 Test #100: TarPackerTest.PackMultipleEntries ...................................... Passed 0.00 sec + Start 101: TarPackerTest.EmptyEntryList +101/283 Test #101: TarPackerTest.EmptyEntryList ........................................... Passed 0.00 sec + Start 102: TarPackerTest.ValidChecksum +102/283 Test #102: TarPackerTest.ValidChecksum ............................................ Passed 0.00 sec + Start 103: TarPackerTest.RejectInvalidArchive +103/283 Test #103: TarPackerTest.RejectInvalidArchive ..................................... Passed 0.00 sec + Start 104: TarPackerTest.FormatName +104/283 Test #104: TarPackerTest.FormatName ............................................... Passed 0.00 sec + Start 105: TarPackerTest.PackFileSpanningMultipleBlocks +105/283 Test #105: TarPackerTest.PackFileSpanningMultipleBlocks ........................... Passed 0.00 sec + Start 106: TarPackerTest.PackExactBlockSizeFile +106/283 Test #106: TarPackerTest.PackExactBlockSizeFile ................................... Passed 0.00 sec + Start 107: TarPackerTest.PackBinaryDataAllBytes +107/283 Test #107: TarPackerTest.PackBinaryDataAllBytes ................................... Passed 0.00 sec + Start 108: TarPackerTest.PackDeeplyNestedStructure +108/283 Test #108: TarPackerTest.PackDeeplyNestedStructure ................................ Passed 0.00 sec + Start 109: TarPackerTest.PackFileNameBoundary +109/283 Test #109: TarPackerTest.PackFileNameBoundary ..................................... Passed 0.00 sec + Start 110: TarPackerTest.MetadataPreservedInRoundTrip +110/283 Test #110: TarPackerTest.MetadataPreservedInRoundTrip ............................. Passed 0.00 sec + Start 111: TarPackerTest.PackManySmallFiles +111/283 Test #111: TarPackerTest.PackManySmallFiles ....................................... Passed 0.00 sec + Start 112: ZipPackerTest.FormatName +112/283 Test #112: ZipPackerTest.FormatName ............................................... Passed 0.00 sec + Start 113: ZipPackerTest.PackSingleRegularFile +113/283 Test #113: ZipPackerTest.PackSingleRegularFile .................................... Passed 0.00 sec + Start 114: ZipPackerTest.PackUnpackRoundTrip +114/283 Test #114: ZipPackerTest.PackUnpackRoundTrip ...................................... Passed 0.00 sec + Start 115: ZipPackerTest.PackDirectory +115/283 Test #115: ZipPackerTest.PackDirectory ............................................ Passed 0.00 sec + Start 116: ZipPackerTest.PackSymlink +116/283 Test #116: ZipPackerTest.PackSymlink .............................................. Passed 0.00 sec + Start 117: ZipPackerTest.PackFifo +117/283 Test #117: ZipPackerTest.PackFifo ................................................. Passed 0.00 sec + Start 118: ZipPackerTest.PackDevice +118/283 Test #118: ZipPackerTest.PackDevice ............................................... Passed 0.00 sec + Start 119: ZipPackerTest.PackEmptyFile +119/283 Test #119: ZipPackerTest.PackEmptyFile ............................................ Passed 0.00 sec + Start 120: ZipPackerTest.EmptyEntryList +120/283 Test #120: ZipPackerTest.EmptyEntryList ........................................... Passed 0.00 sec + Start 121: ZipPackerTest.RejectInvalidArchive +121/283 Test #121: ZipPackerTest.RejectInvalidArchive ..................................... Passed 0.00 sec + Start 122: ZipPackerTest.RejectZipWithoutMetadata +122/283 Test #122: ZipPackerTest.RejectZipWithoutMetadata ................................. Passed 0.00 sec + Start 123: ZipPackerTest.PackMultipleEntries +123/283 Test #123: ZipPackerTest.PackMultipleEntries ...................................... Passed 0.00 sec + Start 124: ZipPackerTest.PackBinaryDataAllBytes +124/283 Test #124: ZipPackerTest.PackBinaryDataAllBytes ................................... Passed 0.00 sec + Start 125: ZipPackerTest.MetadataPreservedInRoundTrip +125/283 Test #125: ZipPackerTest.MetadataPreservedInRoundTrip ............................. Passed 0.00 sec + Start 126: ZipPackerTest.SymlinkWithMetadata +126/283 Test #126: ZipPackerTest.SymlinkWithMetadata ...................................... Passed 0.00 sec + Start 127: ZipPackerTest.PackLargeFile +127/283 Test #127: ZipPackerTest.PackLargeFile ............................................ Passed 0.04 sec + Start 128: ZipPackerTest.PackDeeplyNestedStructure +128/283 Test #128: ZipPackerTest.PackDeeplyNestedStructure ................................ Passed 0.00 sec + Start 129: ZipPackerTest.PackManySmallFiles +129/283 Test #129: ZipPackerTest.PackManySmallFiles ....................................... Passed 0.00 sec + Start 130: ZipPackerTest.PackAllTypes +130/283 Test #130: ZipPackerTest.PackAllTypes ............................................. Passed 0.00 sec + Start 131: BuildCompressorTest.CreateGzip +131/283 Test #131: BuildCompressorTest.CreateGzip ......................................... Passed 0.00 sec + Start 132: BuildCompressorTest.CreateZstd +132/283 Test #132: BuildCompressorTest.CreateZstd ......................................... Passed 0.00 sec + Start 133: BuildCompressorTest.CreateLzma +133/283 Test #133: BuildCompressorTest.CreateLzma ......................................... Passed 0.00 sec + Start 134: BuildCompressorTest.UnknownAlgorithmReturnsNull +134/283 Test #134: BuildCompressorTest.UnknownAlgorithmReturnsNull ........................ Passed 0.00 sec + Start 135: BuildCompressorTest.CaseSensitiveLookup +135/283 Test #135: BuildCompressorTest.CaseSensitiveLookup ................................ Passed 0.00 sec + Start 136: BuildCompressorTest.PartialNameRejected +136/283 Test #136: BuildCompressorTest.PartialNameRejected ................................ Passed 0.00 sec + Start 137: BuildCompressorTest.DefaultLevelZero +137/283 Test #137: BuildCompressorTest.DefaultLevelZero ................................... Passed 0.00 sec + Start 138: BuildCompressorTest.RoundTrip +138/283 Test #138: BuildCompressorTest.RoundTrip .......................................... Passed 0.00 sec + Start 139: BuildEncryptorTest.CreateAes256 +139/283 Test #139: BuildEncryptorTest.CreateAes256 ........................................ Passed 0.00 sec + Start 140: BuildEncryptorTest.CreateAes256FullName +140/283 Test #140: BuildEncryptorTest.CreateAes256FullName ................................ Passed 0.00 sec + Start 141: BuildEncryptorTest.CreateSm4 +141/283 Test #141: BuildEncryptorTest.CreateSm4 ........................................... Passed 0.00 sec + Start 142: BuildEncryptorTest.UnknownAlgorithmReturnsNull +142/283 Test #142: BuildEncryptorTest.UnknownAlgorithmReturnsNull ......................... Passed 0.00 sec + Start 143: BuildEncryptorTest.UnknownAlgorithmEmpty +143/283 Test #143: BuildEncryptorTest.UnknownAlgorithmEmpty ............................... Passed 0.00 sec + Start 144: BuildEncryptorTest.CaseSensitiveLookup +144/283 Test #144: BuildEncryptorTest.CaseSensitiveLookup ................................. Passed 0.00 sec + Start 145: BuildEncryptorTest.PartialNameRejected +145/283 Test #145: BuildEncryptorTest.PartialNameRejected ................................. Passed 0.00 sec + Start 146: BuildEncryptorTest.RoundTrip +146/283 Test #146: BuildEncryptorTest.RoundTrip ........................................... Passed 0.13 sec + Start 147: CcronexprTest.DailyAt2am +147/283 Test #147: CcronexprTest.DailyAt2am ............................................... Passed 0.00 sec + Start 148: CcronexprTest.DailyAt2amBeforeMidnight +148/283 Test #148: CcronexprTest.DailyAt2amBeforeMidnight ................................. Passed 0.00 sec + Start 149: CcronexprTest.EveryHour +149/283 Test #149: CcronexprTest.EveryHour ................................................ Passed 0.00 sec + Start 150: CcronexprTest.Every15Min +150/283 Test #150: CcronexprTest.Every15Min ............................................... Passed 0.00 sec + Start 151: CcronexprTest.Every15MinFromOffset +151/283 Test #151: CcronexprTest.Every15MinFromOffset ..................................... Passed 0.00 sec + Start 152: CcronexprTest.WeekdaysOnly +152/283 Test #152: CcronexprTest.WeekdaysOnly ............................................. Passed 0.00 sec + Start 153: CcronexprTest.WeeklyOnSunday +153/283 Test #153: CcronexprTest.WeeklyOnSunday ........................................... Passed 0.00 sec + Start 154: CcronexprTest.RangeHours +154/283 Test #154: CcronexprTest.RangeHours ............................................... Passed 0.00 sec + Start 155: CcronexprTest.InvalidExpression +155/283 Test #155: CcronexprTest.InvalidExpression ........................................ Passed 0.00 sec + Start 156: CcronexprTest.NeverFires +156/283 Test #156: CcronexprTest.NeverFires ............................................... Passed 0.00 sec + Start 157: SnapshotPathTest.ProducesTimestampedName +157/283 Test #157: SnapshotPathTest.ProducesTimestampedName ............................... Passed 0.00 sec + Start 158: RetentionTest.ParseTimestampValid +158/283 Test #158: RetentionTest.ParseTimestampValid ...................................... Passed 0.00 sec + Start 159: RetentionTest.ParseTimestampInvalidFormat +159/283 Test #159: RetentionTest.ParseTimestampInvalidFormat .............................. Passed 0.00 sec + Start 160: RetentionTest.ParseTimestampWrongLength +160/283 Test #160: RetentionTest.ParseTimestampWrongLength ................................ Passed 0.00 sec + Start 161: RetentionTest.KeepAllWhenUnlimited +161/283 Test #161: RetentionTest.KeepAllWhenUnlimited ..................................... Passed 0.00 sec + Start 162: RetentionTest.KeepAllWhenDisabled +162/283 Test #162: RetentionTest.KeepAllWhenDisabled ...................................... Passed 0.00 sec + Start 163: RetentionTest.RemoveOldestWhenExceedingCount +163/283 Test #163: RetentionTest.RemoveOldestWhenExceedingCount ........................... Passed 0.00 sec + Start 164: RetentionTest.RemoveMultipleOldest +164/283 Test #164: RetentionTest.RemoveMultipleOldest ..................................... Passed 0.00 sec + Start 165: RetentionTest.KeepExactCount +165/283 Test #165: RetentionTest.KeepExactCount ........................................... Passed 0.00 sec + Start 166: RetentionTest.RemoveOlderThanDays +166/283 Test #166: RetentionTest.RemoveOlderThanDays ...................................... Passed 0.00 sec + Start 167: RetentionTest.MixedBothConstraints +167/283 Test #167: RetentionTest.MixedBothConstraints ..................................... Passed 0.00 sec + Start 168: RetentionTest.EmptyList +168/283 Test #168: RetentionTest.EmptyList ................................................ Passed 0.00 sec + Start 169: RetentionTest.SingleSnapshot +169/283 Test #169: RetentionTest.SingleSnapshot ........................................... Passed 0.00 sec + Start 170: RetentionTest.NonMatchingNamesAreSkipped +170/283 Test #170: RetentionTest.NonMatchingNamesAreSkipped ............................... Passed 0.00 sec + Start 171: SchedulerTest.AddAndListJobs +171/283 Test #171: SchedulerTest.AddAndListJobs ........................................... Passed 0.00 sec + Start 172: SchedulerTest.RemoveJob +172/283 Test #172: SchedulerTest.RemoveJob ................................................ Passed 0.00 sec + Start 173: SchedulerTest.RemoveNonExistent +173/283 Test #173: SchedulerTest.RemoveNonExistent ........................................ Passed 0.00 sec + Start 174: SchedulerTest.EnableDisableJob +174/283 Test #174: SchedulerTest.EnableDisableJob ......................................... Passed 0.00 sec + Start 175: SchedulerTest.FindJob +175/283 Test #175: SchedulerTest.FindJob .................................................. Passed 0.00 sec + Start 176: SchedulerTest.StopWithoutRun +176/283 Test #176: SchedulerTest.StopWithoutRun ........................................... Passed 0.00 sec + Start 177: SchedulerTest.RunAndStop +177/283 Test #177: SchedulerTest.RunAndStop ............................................... Passed 0.10 sec + Start 178: SchedulerTest.AddJobWithCustomId +178/283 Test #178: SchedulerTest.AddJobWithCustomId ....................................... Passed 0.00 sec + Start 179: ScheduleStoreTest.SaveAndLoad +179/283 Test #179: ScheduleStoreTest.SaveAndLoad .......................................... Passed 0.00 sec + Start 180: ScheduleStoreTest.LoadNonExistent +180/283 Test #180: ScheduleStoreTest.LoadNonExistent ...................................... Passed 0.00 sec + Start 181: ScheduleStoreTest.SaveMultipleAndLoad +181/283 Test #181: ScheduleStoreTest.SaveMultipleAndLoad .................................. Passed 0.00 sec + Start 182: RetentionScanTest.ScansTimestampedDirs +182/283 Test #182: RetentionScanTest.ScansTimestampedDirs ................................. Passed 0.00 sec + Start 183: RetentionScanTest.EmptyDir +183/283 Test #183: RetentionScanTest.EmptyDir ............................................. Passed 0.00 sec + Start 184: AllCompressors/CompressorTest.RoundTripSmall/"gzip" +184/283 Test #184: AllCompressors/CompressorTest.RoundTripSmall/"gzip" .................... Passed 0.00 sec + Start 185: AllCompressors/CompressorTest.RoundTripSmall/"zstd" +185/283 Test #185: AllCompressors/CompressorTest.RoundTripSmall/"zstd" .................... Passed 0.00 sec + Start 186: AllCompressors/CompressorTest.RoundTripSmall/"lzma" +186/283 Test #186: AllCompressors/CompressorTest.RoundTripSmall/"lzma" .................... Passed 0.00 sec + Start 187: AllCompressors/CompressorTest.RoundTripEmpty/"gzip" +187/283 Test #187: AllCompressors/CompressorTest.RoundTripEmpty/"gzip" .................... Passed 0.00 sec + Start 188: AllCompressors/CompressorTest.RoundTripEmpty/"zstd" +188/283 Test #188: AllCompressors/CompressorTest.RoundTripEmpty/"zstd" .................... Passed 0.00 sec + Start 189: AllCompressors/CompressorTest.RoundTripEmpty/"lzma" +189/283 Test #189: AllCompressors/CompressorTest.RoundTripEmpty/"lzma" .................... Passed 0.00 sec + Start 190: AllCompressors/CompressorTest.RoundTripSingleByte/"gzip" +190/283 Test #190: AllCompressors/CompressorTest.RoundTripSingleByte/"gzip" ............... Passed 0.00 sec + Start 191: AllCompressors/CompressorTest.RoundTripSingleByte/"zstd" +191/283 Test #191: AllCompressors/CompressorTest.RoundTripSingleByte/"zstd" ............... Passed 0.00 sec + Start 192: AllCompressors/CompressorTest.RoundTripSingleByte/"lzma" +192/283 Test #192: AllCompressors/CompressorTest.RoundTripSingleByte/"lzma" ............... Passed 0.00 sec + Start 193: AllCompressors/CompressorTest.RoundTrip1KB/"gzip" +193/283 Test #193: AllCompressors/CompressorTest.RoundTrip1KB/"gzip" ...................... Passed 0.00 sec + Start 194: AllCompressors/CompressorTest.RoundTrip1KB/"zstd" +194/283 Test #194: AllCompressors/CompressorTest.RoundTrip1KB/"zstd" ...................... Passed 0.00 sec + Start 195: AllCompressors/CompressorTest.RoundTrip1KB/"lzma" +195/283 Test #195: AllCompressors/CompressorTest.RoundTrip1KB/"lzma" ...................... Passed 0.01 sec + Start 196: AllCompressors/CompressorTest.RoundTrip64KB/"gzip" +196/283 Test #196: AllCompressors/CompressorTest.RoundTrip64KB/"gzip" ..................... Passed 0.00 sec + Start 197: AllCompressors/CompressorTest.RoundTrip64KB/"zstd" +197/283 Test #197: AllCompressors/CompressorTest.RoundTrip64KB/"zstd" ..................... Passed 0.00 sec + Start 198: AllCompressors/CompressorTest.RoundTrip64KB/"lzma" +198/283 Test #198: AllCompressors/CompressorTest.RoundTrip64KB/"lzma" ..................... Passed 0.02 sec + Start 199: AllCompressors/CompressorTest.RoundTrip1MiB/"gzip" +199/283 Test #199: AllCompressors/CompressorTest.RoundTrip1MiB/"gzip" ..................... Passed 0.03 sec + Start 200: AllCompressors/CompressorTest.RoundTrip1MiB/"zstd" +200/283 Test #200: AllCompressors/CompressorTest.RoundTrip1MiB/"zstd" ..................... Passed 0.01 sec + Start 201: AllCompressors/CompressorTest.RoundTrip1MiB/"lzma" +201/283 Test #201: AllCompressors/CompressorTest.RoundTrip1MiB/"lzma" ..................... Passed 0.22 sec + Start 202: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"gzip" +202/283 Test #202: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"gzip" ......... Passed 0.01 sec + Start 203: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"zstd" +203/283 Test #203: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"zstd" ......... Passed 0.00 sec + Start 204: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"lzma" +204/283 Test #204: AllCompressors/CompressorTest.RoundTripCompressible1MiB/"lzma" ......... Passed 0.01 sec + Start 205: AllCompressors/CompressorTest.RoundTripBinary/"gzip" +205/283 Test #205: AllCompressors/CompressorTest.RoundTripBinary/"gzip" ................... Passed 0.00 sec + Start 206: AllCompressors/CompressorTest.RoundTripBinary/"zstd" +206/283 Test #206: AllCompressors/CompressorTest.RoundTripBinary/"zstd" ................... Passed 0.00 sec + Start 207: AllCompressors/CompressorTest.RoundTripBinary/"lzma" +207/283 Test #207: AllCompressors/CompressorTest.RoundTripBinary/"lzma" ................... Passed 0.00 sec + Start 208: AllCompressors/CompressorTest.DefaultLevelIsValid/"gzip" +208/283 Test #208: AllCompressors/CompressorTest.DefaultLevelIsValid/"gzip" ............... Passed 0.00 sec + Start 209: AllCompressors/CompressorTest.DefaultLevelIsValid/"zstd" +209/283 Test #209: AllCompressors/CompressorTest.DefaultLevelIsValid/"zstd" ............... Passed 0.00 sec + Start 210: AllCompressors/CompressorTest.DefaultLevelIsValid/"lzma" +210/283 Test #210: AllCompressors/CompressorTest.DefaultLevelIsValid/"lzma" ............... Passed 0.00 sec + Start 211: AllCompressors/CompressorTest.NegativeLevelInvalid/"gzip" +211/283 Test #211: AllCompressors/CompressorTest.NegativeLevelInvalid/"gzip" .............. Passed 0.00 sec + Start 212: AllCompressors/CompressorTest.NegativeLevelInvalid/"zstd" +212/283 Test #212: AllCompressors/CompressorTest.NegativeLevelInvalid/"zstd" .............. Passed 0.00 sec + Start 213: AllCompressors/CompressorTest.NegativeLevelInvalid/"lzma" +213/283 Test #213: AllCompressors/CompressorTest.NegativeLevelInvalid/"lzma" .............. Passed 0.00 sec + Start 214: AllCompressors/CompressorTest.ExtremeLevelInvalid/"gzip" +214/283 Test #214: AllCompressors/CompressorTest.ExtremeLevelInvalid/"gzip" ............... Passed 0.00 sec + Start 215: AllCompressors/CompressorTest.ExtremeLevelInvalid/"zstd" +215/283 Test #215: AllCompressors/CompressorTest.ExtremeLevelInvalid/"zstd" ............... Passed 0.00 sec + Start 216: AllCompressors/CompressorTest.ExtremeLevelInvalid/"lzma" +216/283 Test #216: AllCompressors/CompressorTest.ExtremeLevelInvalid/"lzma" ............... Passed 0.00 sec + Start 217: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"gzip" +217/283 Test #217: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"gzip" .... Passed 0.01 sec + Start 218: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"zstd" +218/283 Test #218: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"zstd" .... Passed 0.02 sec + Start 219: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"lzma" +219/283 Test #219: AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/"lzma" .... Passed 0.07 sec + Start 220: AllCompressors/CompressorTest.DecompressGarbageFails/"gzip" +220/283 Test #220: AllCompressors/CompressorTest.DecompressGarbageFails/"gzip" ............ Passed 0.00 sec + Start 221: AllCompressors/CompressorTest.DecompressGarbageFails/"zstd" +221/283 Test #221: AllCompressors/CompressorTest.DecompressGarbageFails/"zstd" ............ Passed 0.00 sec + Start 222: AllCompressors/CompressorTest.DecompressGarbageFails/"lzma" +222/283 Test #222: AllCompressors/CompressorTest.DecompressGarbageFails/"lzma" ............ Passed 0.00 sec + Start 223: AllCompressors/CompressorTest.DecompressTruncatedFails/"gzip" +223/283 Test #223: AllCompressors/CompressorTest.DecompressTruncatedFails/"gzip" .......... Passed 0.00 sec + Start 224: AllCompressors/CompressorTest.DecompressTruncatedFails/"zstd" +224/283 Test #224: AllCompressors/CompressorTest.DecompressTruncatedFails/"zstd" .......... Passed 0.00 sec + Start 225: AllCompressors/CompressorTest.DecompressTruncatedFails/"lzma" +225/283 Test #225: AllCompressors/CompressorTest.DecompressTruncatedFails/"lzma" .......... Passed 0.01 sec + Start 226: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"gzip" +226/283 Test #226: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"gzip" ... Passed 0.00 sec + Start 227: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"zstd" +227/283 Test #227: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"zstd" ... Passed 0.00 sec + Start 228: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"lzma" +228/283 Test #228: AllCompressors/CompressorTest.CompressAppendsToExistingOutput/"lzma" ... Passed 0.00 sec + Start 229: AllEncryptors/EncryptorTest.RoundTripSmall/"aes256" +229/283 Test #229: AllEncryptors/EncryptorTest.RoundTripSmall/"aes256" .................... Passed 0.04 sec + Start 230: AllEncryptors/EncryptorTest.RoundTripSmall/"sm4" +230/283 Test #230: AllEncryptors/EncryptorTest.RoundTripSmall/"sm4" ....................... Passed 0.09 sec + Start 231: AllEncryptors/EncryptorTest.RoundTripEmpty/"aes256" +231/283 Test #231: AllEncryptors/EncryptorTest.RoundTripEmpty/"aes256" .................... Passed 0.04 sec + Start 232: AllEncryptors/EncryptorTest.RoundTripEmpty/"sm4" +232/283 Test #232: AllEncryptors/EncryptorTest.RoundTripEmpty/"sm4" ....................... Passed 0.09 sec + Start 233: AllEncryptors/EncryptorTest.RoundTripSingleByte/"aes256" +233/283 Test #233: AllEncryptors/EncryptorTest.RoundTripSingleByte/"aes256" ............... Passed 0.04 sec + Start 234: AllEncryptors/EncryptorTest.RoundTripSingleByte/"sm4" +234/283 Test #234: AllEncryptors/EncryptorTest.RoundTripSingleByte/"sm4" .................. Passed 0.09 sec + Start 235: AllEncryptors/EncryptorTest.RoundTrip1KB/"aes256" +235/283 Test #235: AllEncryptors/EncryptorTest.RoundTrip1KB/"aes256" ...................... Passed 0.04 sec + Start 236: AllEncryptors/EncryptorTest.RoundTrip1KB/"sm4" +236/283 Test #236: AllEncryptors/EncryptorTest.RoundTrip1KB/"sm4" ......................... Passed 0.09 sec + Start 237: AllEncryptors/EncryptorTest.RoundTrip64KB/"aes256" +237/283 Test #237: AllEncryptors/EncryptorTest.RoundTrip64KB/"aes256" ..................... Passed 0.04 sec + Start 238: AllEncryptors/EncryptorTest.RoundTrip64KB/"sm4" +238/283 Test #238: AllEncryptors/EncryptorTest.RoundTrip64KB/"sm4" ........................ Passed 0.09 sec + Start 239: AllEncryptors/EncryptorTest.RoundTrip1MiB/"aes256" +239/283 Test #239: AllEncryptors/EncryptorTest.RoundTrip1MiB/"aes256" ..................... Passed 0.05 sec + Start 240: AllEncryptors/EncryptorTest.RoundTrip1MiB/"sm4" +240/283 Test #240: AllEncryptors/EncryptorTest.RoundTrip1MiB/"sm4" ........................ Passed 0.10 sec + Start 241: AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/"aes256" +241/283 Test #241: AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/"aes256" ......... Passed 0.04 sec + Start 242: AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/"sm4" +242/283 Test #242: AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/"sm4" ............ Passed 0.10 sec + Start 243: AllEncryptors/EncryptorTest.RoundTripBinary/"aes256" +243/283 Test #243: AllEncryptors/EncryptorTest.RoundTripBinary/"aes256" ................... Passed 0.04 sec + Start 244: AllEncryptors/EncryptorTest.RoundTripBinary/"sm4" +244/283 Test #244: AllEncryptors/EncryptorTest.RoundTripBinary/"sm4" ...................... Passed 0.09 sec + Start 245: AllEncryptors/EncryptorTest.WrongPasswordFails/"aes256" +245/283 Test #245: AllEncryptors/EncryptorTest.WrongPasswordFails/"aes256" ................ Passed 0.04 sec + Start 246: AllEncryptors/EncryptorTest.WrongPasswordFails/"sm4" +246/283 Test #246: AllEncryptors/EncryptorTest.WrongPasswordFails/"sm4" ................... Passed 0.09 sec + Start 247: AllEncryptors/EncryptorTest.EmptyPassword/"aes256" +247/283 Test #247: AllEncryptors/EncryptorTest.EmptyPassword/"aes256" ..................... Passed 0.00 sec + Start 248: AllEncryptors/EncryptorTest.EmptyPassword/"sm4" +248/283 Test #248: AllEncryptors/EncryptorTest.EmptyPassword/"sm4" ........................ Passed 0.00 sec + Start 249: AllEncryptors/EncryptorTest.PasswordWithSpaces/"aes256" +249/283 Test #249: AllEncryptors/EncryptorTest.PasswordWithSpaces/"aes256" ................ Passed 0.04 sec + Start 250: AllEncryptors/EncryptorTest.PasswordWithSpaces/"sm4" +250/283 Test #250: AllEncryptors/EncryptorTest.PasswordWithSpaces/"sm4" ................... Passed 0.09 sec + Start 251: AllEncryptors/EncryptorTest.CorruptedCiphertextFails/"aes256" +251/283 Test #251: AllEncryptors/EncryptorTest.CorruptedCiphertextFails/"aes256" .......... Passed 0.04 sec + Start 252: AllEncryptors/EncryptorTest.CorruptedCiphertextFails/"sm4" +252/283 Test #252: AllEncryptors/EncryptorTest.CorruptedCiphertextFails/"sm4" ............. Passed 0.09 sec + Start 253: AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/"aes256" +253/283 Test #253: AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/"aes256" ......... Passed 0.02 sec + Start 254: AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/"sm4" +254/283 Test #254: AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/"sm4" ............ Passed 0.05 sec + Start 255: AllEncryptors/EncryptorTest.TruncatedInputFails/"aes256" +255/283 Test #255: AllEncryptors/EncryptorTest.TruncatedInputFails/"aes256" ............... Passed 0.02 sec + Start 256: AllEncryptors/EncryptorTest.TruncatedInputFails/"sm4" +256/283 Test #256: AllEncryptors/EncryptorTest.TruncatedInputFails/"sm4" .................. Passed 0.05 sec + Start 257: AllEncryptors/EncryptorTest.GarbageInputFails/"aes256" +257/283 Test #257: AllEncryptors/EncryptorTest.GarbageInputFails/"aes256" ................. Passed 0.00 sec + Start 258: AllEncryptors/EncryptorTest.GarbageInputFails/"sm4" +258/283 Test #258: AllEncryptors/EncryptorTest.GarbageInputFails/"sm4" .................... Passed 0.00 sec + Start 259: AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/"aes256" +259/283 Test #259: AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/"aes256" .... Passed 0.02 sec + Start 260: AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/"sm4" +260/283 Test #260: AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/"sm4" ....... Passed 0.05 sec + Start 261: AllEncryptors/EncryptorTest.UnicodePassword/"aes256" +261/283 Test #261: AllEncryptors/EncryptorTest.UnicodePassword/"aes256" ................... Passed 0.04 sec + Start 262: AllEncryptors/EncryptorTest.UnicodePassword/"sm4" +262/283 Test #262: AllEncryptors/EncryptorTest.UnicodePassword/"sm4" ...................... Passed 0.08 sec + Start 263: example +263/283 Test #263: example ................................................................ Passed 0.00 sec + Start 264: example64 +264/283 Test #264: example64 .............................................................. Passed 0.00 sec + Start 265: test_bcj_exact_size +265/283 Test #265: test_bcj_exact_size .................................................... Passed 0.00 sec + Start 266: test_block_header +266/283 Test #266: test_block_header ...................................................... Passed 0.00 sec + Start 267: test_check +267/283 Test #267: test_check ............................................................. Passed 0.01 sec + Start 268: test_filter_flags +268/283 Test #268: test_filter_flags ...................................................... Passed 0.00 sec + Start 269: test_filter_str +269/283 Test #269: test_filter_str ........................................................ Passed 0.00 sec + Start 270: test_hardware +270/283 Test #270: test_hardware .......................................................... Passed 0.00 sec + Start 271: test_index +271/283 Test #271: test_index ............................................................. Passed 0.00 sec + Start 272: test_index_hash +272/283 Test #272: test_index_hash ........................................................ Passed 0.00 sec + Start 273: test_lzip_decoder +273/283 Test #273: test_lzip_decoder ...................................................... Passed 0.01 sec + Start 274: test_memlimit +274/283 Test #274: test_memlimit .......................................................... Passed 0.00 sec + Start 275: test_stream_flags +275/283 Test #275: test_stream_flags ...................................................... Passed 0.00 sec + Start 276: test_vli +276/283 Test #276: test_vli ............................................................... Passed 0.00 sec + Start 277: test_microlzma +277/283 Test #277: test_microlzma ......................................................... Passed 0.01 sec + Start 278: test_scripts.sh +278/283 Test #278: test_scripts.sh ........................................................ Passed 0.07 sec + Start 279: test_suffix.sh +279/283 Test #279: test_suffix.sh ......................................................... Passed 0.01 sec + Start 280: test_compress_generated_abc +280/283 Test #280: test_compress_generated_abc ............................................ Passed 0.06 sec + Start 281: test_compress_generated_text +281/283 Test #281: test_compress_generated_text ........................................... Passed 0.42 sec + Start 282: test_compress_generated_random +282/283 Test #282: test_compress_generated_random ......................................... Passed 0.87 sec + Start 283: test_files.sh +283/283 Test #283: test_files.sh .......................................................... Passed 0.09 sec + +100% tests passed, 0 tests failed out of 283 + +Total Test time (real) = 4.62 sec diff --git a/logs/gtest-all.log b/logs/gtest-all.log new file mode 100644 index 0000000..61fd819 --- /dev/null +++ b/logs/gtest-all.log @@ -0,0 +1,761 @@ +Running main() from /home/airprofly/codeFolder/backer/build/_deps/googletest-src/googletest/src/gtest_main.cc +[==========] Running 262 tests from 17 test suites. +[----------] Global test environment set-up. +[----------] 22 tests from BackupEngineTest +[ RUN ] BackupEngineTest.BackupBasic +[2026-07-16 00:02:24.047] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupBasic/source +[2026-07-16 00:02:24.048] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[ OK ] BackupEngineTest.BackupBasic (1 ms) +[ RUN ] BackupEngineTest.BackupContentMatches +[2026-07-16 00:02:24.049] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupContentMatches/source +[2026-07-16 00:02:24.049] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[ OK ] BackupEngineTest.BackupContentMatches (1 ms) +[ RUN ] BackupEngineTest.BackupWithEmptyDir +[2026-07-16 00:02:24.050] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupWithEmptyDir/source +[2026-07-16 00:02:24.050] [info] Backup complete: 0 files, 1 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithEmptyDir (0 ms) +[ RUN ] BackupEngineTest.BackupNonExistentSource +[2026-07-16 00:02:24.050] [error] Source path does not exist: /tmp/backer_test/BackupNonExistentSource/nonexistent +[ OK ] BackupEngineTest.BackupNonExistentSource (0 ms) +[ RUN ] BackupEngineTest.BackupEmptyDirectory +[2026-07-16 00:02:24.050] [info] BackupEngine: found 0 entries in /tmp/backer_test/BackupEmptyDirectory/source +[2026-07-16 00:02:24.051] [info] Backup complete: 0 files, 0 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupEmptyDirectory (0 ms) +[ RUN ] BackupEngineTest.BackupBinaryFile +[2026-07-16 00:02:24.051] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupBinaryFile/source +[2026-07-16 00:02:24.051] [info] Backup complete: 1 files, 0 dirs, 65537 bytes in 0.0s +[ OK ] BackupEngineTest.BackupBinaryFile (0 ms) +[ RUN ] BackupEngineTest.BackupDeepNestedDirectories +[2026-07-16 00:02:24.053] [info] BackupEngine: found 21 entries in /tmp/backer_test/BackupDeepNestedDirectories/source +[2026-07-16 00:02:24.055] [info] Backup complete: 1 files, 20 dirs, 9 bytes in 0.0s +[ OK ] BackupEngineTest.BackupDeepNestedDirectories (4 ms) +[ RUN ] BackupEngineTest.BackupFileAsSourceFails +[2026-07-16 00:02:24.056] [error] Source is not a directory: /tmp/backer_test/BackupFileAsSourceFails/source/afile.txt +[ OK ] BackupEngineTest.BackupFileAsSourceFails (0 ms) +[ RUN ] BackupEngineTest.BackupUnicodeFilenames +[2026-07-16 00:02:24.056] [info] BackupEngine: found 3 entries in /tmp/backer_test/BackupUnicodeFilenames/source +[2026-07-16 00:02:24.056] [info] Backup complete: 3 files, 0 dirs, 43 bytes in 0.0s +[ OK ] BackupEngineTest.BackupUnicodeFilenames (0 ms) +[ RUN ] BackupEngineTest.BackupIdempotency +[2026-07-16 00:02:24.057] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupIdempotency/source +[2026-07-16 00:02:24.058] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[2026-07-16 00:02:24.058] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupIdempotency/source +[2026-07-16 00:02:24.058] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[ OK ] BackupEngineTest.BackupIdempotency (2 ms) +[ RUN ] BackupEngineTest.BackupLargeFile +[2026-07-16 00:02:24.060] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupLargeFile/source +[2026-07-16 00:02:24.061] [info] Backup complete: 1 files, 0 dirs, 1048576 bytes in 0.0s +[ OK ] BackupEngineTest.BackupLargeFile (3 ms) +[ RUN ] BackupEngineTest.BackupMixedContent +[2026-07-16 00:02:24.064] [info] BackupEngine: found 9 entries in /tmp/backer_test/BackupMixedContent/source +[2026-07-16 00:02:24.064] [info] Backup complete: 4 files, 5 dirs, 25 bytes in 0.0s +[ OK ] BackupEngineTest.BackupMixedContent (1 ms) +[ RUN ] BackupEngineTest.BackupSingleFile +[2026-07-16 00:02:24.065] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupSingleFile/source +[2026-07-16 00:02:24.065] [info] Backup complete: 1 files, 0 dirs, 8 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSingleFile (0 ms) +[ RUN ] BackupEngineTest.BackupNestedEmptyDirs +[2026-07-16 00:02:24.066] [info] BackupEngine: found 5 entries in /tmp/backer_test/BackupNestedEmptyDirs/source +[2026-07-16 00:02:24.066] [info] Backup complete: 0 files, 5 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupNestedEmptyDirs (1 ms) +[ RUN ] BackupEngineTest.BackupSymlinks +[2026-07-16 00:02:24.067] [info] BackupEngine: found 3 entries in /tmp/backer_test/BackupSymlinks/source +[2026-07-16 00:02:24.067] [info] Backup complete: 2 files, 1 dirs, 14 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSymlinks (0 ms) +[ RUN ] BackupEngineTest.BackupSymlinkToFileInSameDir +[2026-07-16 00:02:24.067] [info] BackupEngine: found 2 entries in /tmp/backer_test/BackupSymlinkToFileInSameDir/source +[2026-07-16 00:02:24.067] [info] Backup complete: 2 files, 0 dirs, 8 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSymlinkToFileInSameDir (0 ms) +[ RUN ] BackupEngineTest.BackupPreservesPermissions +[2026-07-16 00:02:24.067] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupPreservesPermissions/source +[2026-07-16 00:02:24.068] [info] Backup complete: 1 files, 0 dirs, 20 bytes in 0.0s +[ OK ] BackupEngineTest.BackupPreservesPermissions (0 ms) +[ RUN ] BackupEngineTest.BackupWithFilterIncludeType +[2026-07-16 00:02:24.068] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterIncludeType/source +[2026-07-16 00:02:24.068] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-16 00:02:24.068] [info] Backup complete: 2 files, 0 dirs, 9 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterIncludeType (0 ms) +[ RUN ] BackupEngineTest.BackupWithFilterExcludePath +[2026-07-16 00:02:24.069] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterExcludePath/source +[2026-07-16 00:02:24.069] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-16 00:02:24.069] [info] Backup complete: 1 files, 1 dirs, 4 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterExcludePath (0 ms) +[ RUN ] BackupEngineTest.BackupWithFilterAllExcluded +[2026-07-16 00:02:24.069] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupWithFilterAllExcluded/source +[2026-07-16 00:02:24.069] [info] CriteriaFilter: 1 → 0 entries after filtering +[2026-07-16 00:02:24.069] [info] Backup complete: 0 files, 0 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterAllExcluded (0 ms) +[ RUN ] BackupEngineTest.BackupWithTarPacker +[2026-07-16 00:02:24.070] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithTarPacker/source +[2026-07-16 00:02:24.070] [info] BackupEngine: packing 4 entries as tar +[2026-07-16 00:02:24.070] [info] Backup complete (archive mode): 3 files, 1 dirs, 21 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithTarPacker (0 ms) +[ RUN ] BackupEngineTest.BackupWithFilterAndPacker +[2026-07-16 00:02:24.071] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterAndPacker/source +[2026-07-16 00:02:24.071] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-16 00:02:24.071] [info] BackupEngine: packing 2 entries as tar +[2026-07-16 00:02:24.071] [info] Backup complete (archive mode): 2 files, 0 dirs, 23 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterAndPacker (0 ms) +[----------] 22 tests from BackupEngineTest (24 ms total) + +[----------] 18 tests from RestoreEngineTest +[ RUN ] RestoreEngineTest.RestoreBasic +[2026-07-16 00:02:24.071] [info] BackupEngine: found 5 entries in /tmp/backer_test/RestoreBasic/source +[2026-07-16 00:02:24.072] [info] Backup complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[2026-07-16 00:02:24.072] [info] RestoreEngine: found 5 entries in /tmp/backer_test/RestoreBasic/backup +[2026-07-16 00:02:24.072] [info] Restore complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreBasic (1 ms) +[ RUN ] RestoreEngineTest.RestoreContentMatches +[2026-07-16 00:02:24.073] [info] BackupEngine: found 5 entries in /tmp/backer_test/RestoreContentMatches/source +[2026-07-16 00:02:24.073] [info] Backup complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[2026-07-16 00:02:24.073] [info] RestoreEngine: found 5 entries in /tmp/backer_test/RestoreContentMatches/backup +[2026-07-16 00:02:24.073] [info] Restore complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreContentMatches (1 ms) +[ RUN ] RestoreEngineTest.RestorePreservesEmptyDirs +[2026-07-16 00:02:24.074] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestorePreservesEmptyDirs/source +[2026-07-16 00:02:24.074] [info] Backup complete: 0 files, 1 dirs, 0 bytes in 0.0s +[2026-07-16 00:02:24.074] [info] RestoreEngine: found 1 entries in /tmp/backer_test/RestorePreservesEmptyDirs/backup +[2026-07-16 00:02:24.074] [info] Restore complete: 0 files, 1 dirs, 0 bytes in 0.0s +[ OK ] RestoreEngineTest.RestorePreservesEmptyDirs (0 ms) +[ RUN ] RestoreEngineTest.RestoreNonExistentSource +[2026-07-16 00:02:24.074] [error] Backup source does not exist: /tmp/backer_test/RestoreNonExistentSource/nonexistent_backup +[ OK ] RestoreEngineTest.RestoreNonExistentSource (0 ms) +[ RUN ] RestoreEngineTest.BackupRestoreEndToEnd +[2026-07-16 00:02:24.075] [info] BackupEngine: found 9 entries in /tmp/backer_test/BackupRestoreEndToEnd/source +[2026-07-16 00:02:24.076] [info] Backup complete: 5 files, 4 dirs, 87 bytes in 0.0s +[2026-07-16 00:02:24.076] [info] RestoreEngine: found 9 entries in /tmp/backer_test/BackupRestoreEndToEnd/backup +[2026-07-16 00:02:24.076] [info] Restore complete: 5 files, 4 dirs, 87 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreEndToEnd (1 ms) +[ RUN ] RestoreEngineTest.BackupRestoreComplexTree +[2026-07-16 00:02:24.078] [info] BackupEngine: found 18 entries in /tmp/backer_test/BackupRestoreComplexTree/source +[2026-07-16 00:02:24.079] [info] Backup complete: 4 files, 14 dirs, 47 bytes in 0.0s +[2026-07-16 00:02:24.079] [info] RestoreEngine: found 18 entries in /tmp/backer_test/BackupRestoreComplexTree/backup +[2026-07-16 00:02:24.081] [info] Restore complete: 4 files, 14 dirs, 47 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreComplexTree (5 ms) +[ RUN ] RestoreEngineTest.RestoreBinaryFile +[2026-07-16 00:02:24.082] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestoreBinaryFile/source +[2026-07-16 00:02:24.082] [info] Backup complete: 1 files, 0 dirs, 131072 bytes in 0.0s +[2026-07-16 00:02:24.082] [info] RestoreEngine: found 1 entries in /tmp/backer_test/RestoreBinaryFile/backup +[2026-07-16 00:02:24.083] [info] Restore complete: 1 files, 0 dirs, 131072 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreBinaryFile (0 ms) +[ RUN ] RestoreEngineTest.RestoreUnicodeFilenames +[2026-07-16 00:02:24.083] [info] BackupEngine: found 3 entries in /tmp/backer_test/RestoreUnicodeFilenames/source +[2026-07-16 00:02:24.083] [info] Backup complete: 3 files, 0 dirs, 43 bytes in 0.0s +[2026-07-16 00:02:24.083] [info] RestoreEngine: found 3 entries in /tmp/backer_test/RestoreUnicodeFilenames/backup +[2026-07-16 00:02:24.083] [info] Restore complete: 3 files, 0 dirs, 43 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreUnicodeFilenames (0 ms) +[ RUN ] RestoreEngineTest.RestoreLargeFile +[2026-07-16 00:02:24.084] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestoreLargeFile/source +[2026-07-16 00:02:24.085] [info] Backup complete: 1 files, 0 dirs, 1048576 bytes in 0.0s +[2026-07-16 00:02:24.085] [info] RestoreEngine: found 1 entries in /tmp/backer_test/RestoreLargeFile/backup +[2026-07-16 00:02:24.086] [info] Restore complete: 1 files, 0 dirs, 1048576 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreLargeFile (4 ms) +[ RUN ] RestoreEngineTest.RestoreIdempotency +[2026-07-16 00:02:24.088] [info] BackupEngine: found 5 entries in /tmp/backer_test/RestoreIdempotency/source +[2026-07-16 00:02:24.089] [info] Backup complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[2026-07-16 00:02:24.089] [info] RestoreEngine: found 5 entries in /tmp/backer_test/RestoreIdempotency/backup +[2026-07-16 00:02:24.089] [info] Restore complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[2026-07-16 00:02:24.090] [info] RestoreEngine: found 5 entries in /tmp/backer_test/RestoreIdempotency/backup +[2026-07-16 00:02:24.090] [info] Restore complete: 3 files, 2 dirs, 4120 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreIdempotency (2 ms) +[ RUN ] RestoreEngineTest.RestoreOverwriteDifferentContent +[2026-07-16 00:02:24.090] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestoreOverwriteDifferentContent/source +[2026-07-16 00:02:24.091] [info] Backup complete: 1 files, 0 dirs, 9 bytes in 0.0s +[2026-07-16 00:02:24.091] [info] RestoreEngine: found 1 entries in /tmp/backer_test/RestoreOverwriteDifferentContent/backup +[2026-07-16 00:02:24.091] [info] Restore complete: 1 files, 0 dirs, 9 bytes in 0.0s +[2026-07-16 00:02:24.091] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestoreOverwriteDifferentContent/source +[2026-07-16 00:02:24.091] [info] Backup complete: 1 files, 0 dirs, 9 bytes in 0.0s +[2026-07-16 00:02:24.091] [info] RestoreEngine: found 1 entries in /tmp/backer_test/RestoreOverwriteDifferentContent/backup +[2026-07-16 00:02:24.091] [info] Restore complete: 1 files, 0 dirs, 9 bytes in 0.0s +[ OK ] RestoreEngineTest.RestoreOverwriteDifferentContent (1 ms) +[ RUN ] RestoreEngineTest.BackupRestoreRoundTripLargeTree +[2026-07-16 00:02:24.093] [info] BackupEngine: found 20 entries in /tmp/backer_test/BackupRestoreRoundTripLargeTree/source +[2026-07-16 00:02:24.095] [info] Backup complete: 10 files, 10 dirs, 98 bytes in 0.0s +[2026-07-16 00:02:24.095] [info] RestoreEngine: found 20 entries in /tmp/backer_test/BackupRestoreRoundTripLargeTree/backup +[2026-07-16 00:02:24.097] [info] Restore complete: 10 files, 10 dirs, 98 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreRoundTripLargeTree (6 ms) +[ RUN ] RestoreEngineTest.BackupRestoreWithSymlinks +[2026-07-16 00:02:24.098] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupRestoreWithSymlinks/source +[2026-07-16 00:02:24.098] [info] Backup complete: 3 files, 1 dirs, 14 bytes in 0.0s +[2026-07-16 00:02:24.098] [info] RestoreEngine: found 4 entries in /tmp/backer_test/BackupRestoreWithSymlinks/backup +[2026-07-16 00:02:24.099] [info] Restore complete: 3 files, 1 dirs, 14 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreWithSymlinks (1 ms) +[ RUN ] RestoreEngineTest.BackupRestoreDanglingSymlink +[2026-07-16 00:02:24.099] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupRestoreDanglingSymlink/source +[2026-07-16 00:02:24.099] [info] Backup complete: 1 files, 0 dirs, 0 bytes in 0.0s +[2026-07-16 00:02:24.099] [info] RestoreEngine: found 1 entries in /tmp/backer_test/BackupRestoreDanglingSymlink/backup +[2026-07-16 00:02:24.100] [info] Restore complete: 1 files, 0 dirs, 0 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreDanglingSymlink (0 ms) +[ RUN ] RestoreEngineTest.BackupRestorePreservesPermissions +[2026-07-16 00:02:24.100] [info] BackupEngine: found 2 entries in /tmp/backer_test/BackupRestorePreservesPermissions/source +[2026-07-16 00:02:24.100] [info] Backup complete: 2 files, 0 dirs, 25 bytes in 0.0s +[2026-07-16 00:02:24.100] [info] RestoreEngine: found 2 entries in /tmp/backer_test/BackupRestorePreservesPermissions/backup +[2026-07-16 00:02:24.100] [info] Restore complete: 2 files, 0 dirs, 25 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestorePreservesPermissions (0 ms) +[ RUN ] RestoreEngineTest.BackupRestoreWithFifo +[2026-07-16 00:02:24.100] [info] BackupEngine: found 2 entries in /tmp/backer_test/BackupRestoreWithFifo/source +[2026-07-16 00:02:24.101] [info] Backup complete: 2 files, 0 dirs, 14 bytes in 0.0s +[2026-07-16 00:02:24.101] [info] RestoreEngine: found 2 entries in /tmp/backer_test/BackupRestoreWithFifo/backup +[2026-07-16 00:02:24.101] [info] Restore complete: 2 files, 0 dirs, 14 bytes in 0.0s +[ OK ] RestoreEngineTest.BackupRestoreWithFifo (0 ms) +[ RUN ] RestoreEngineTest.RestoreFromTarArchive +[2026-07-16 00:02:24.101] [info] BackupEngine: found 3 entries in /tmp/backer_test/RestoreFromTarArchive/source +[2026-07-16 00:02:24.101] [info] BackupEngine: packing 3 entries as tar +[2026-07-16 00:02:24.101] [info] Backup complete (archive mode): 2 files, 1 dirs, 28 bytes in 0.0s +[2026-07-16 00:02:24.102] [info] RestoreEngine: unpacking /tmp/backer_test/RestoreFromTarArchive/backup/backup.tar as tar +[2026-07-16 00:02:24.102] [info] Restore complete (archive mode): /tmp/backer_test/RestoreFromTarArchive/backup/backup.tar in 0.0s +[ OK ] RestoreEngineTest.RestoreFromTarArchive (1 ms) +[ RUN ] RestoreEngineTest.RestoreFromTarArchiveEmptyDir +[2026-07-16 00:02:24.102] [info] BackupEngine: found 1 entries in /tmp/backer_test/RestoreFromTarArchiveEmptyDir/source +[2026-07-16 00:02:24.102] [info] BackupEngine: packing 1 entries as tar +[2026-07-16 00:02:24.102] [info] Backup complete (archive mode): 0 files, 1 dirs, 0 bytes in 0.0s +[2026-07-16 00:02:24.102] [info] RestoreEngine: unpacking /tmp/backer_test/RestoreFromTarArchiveEmptyDir/backup/backup.tar as tar +[2026-07-16 00:02:24.102] [info] Restore complete (archive mode): /tmp/backer_test/RestoreFromTarArchiveEmptyDir/backup/backup.tar in 0.0s +[ OK ] RestoreEngineTest.RestoreFromTarArchiveEmptyDir (0 ms) +[----------] 18 tests from RestoreEngineTest (31 ms total) + +[----------] 9 tests from MetadataTest +[ RUN ] MetadataTest.ReadMetadataRegular +[ OK ] MetadataTest.ReadMetadataRegular (0 ms) +[ RUN ] MetadataTest.ReadMetadataNonExistent +[2026-07-16 00:02:24.103] [error] readMetadata: lstat(/tmp/backer_test/ReadMetadataNonExistent/no_such_file) failed: No such file or directory +[ OK ] MetadataTest.ReadMetadataNonExistent (0 ms) +[ RUN ] MetadataTest.ReadMetadataDirectory +[ OK ] MetadataTest.ReadMetadataDirectory (0 ms) +[ RUN ] MetadataTest.RestorePermissions +[ OK ] MetadataTest.RestorePermissions (0 ms) +[ RUN ] MetadataTest.MetadataJsonRoundTrip +[ OK ] MetadataTest.MetadataJsonRoundTrip (0 ms) +[ RUN ] MetadataTest.RestoreTimestamps +[ OK ] MetadataTest.RestoreTimestamps (0 ms) +[ RUN ] MetadataTest.RestoreSetuidBit +[ OK ] MetadataTest.RestoreSetuidBit (0 ms) +[ RUN ] MetadataTest.canRestoreOwnership +[ OK ] MetadataTest.canRestoreOwnership (0 ms) +[ RUN ] MetadataTest.ReadMetadataSymlink +[ OK ] MetadataTest.ReadMetadataSymlink (0 ms) +[----------] 9 tests from MetadataTest (1 ms total) + +[----------] 12 tests from SpecialFileTest +[ RUN ] SpecialFileTest.DetectRegularFile +[ OK ] SpecialFileTest.DetectRegularFile (0 ms) +[ RUN ] SpecialFileTest.DetectDirectory +[ OK ] SpecialFileTest.DetectDirectory (0 ms) +[ RUN ] SpecialFileTest.DetectNonExistent +[2026-07-16 00:02:24.104] [error] detectFileType: lstat(/tmp/backer_test/DetectNonExistent/noexist) failed: No such file or directory +[ OK ] SpecialFileTest.DetectNonExistent (0 ms) +[ RUN ] SpecialFileTest.SymlinkRoundTrip +[ OK ] SpecialFileTest.SymlinkRoundTrip (0 ms) +[ RUN ] SpecialFileTest.CreateSymlinkInNestedDir +[ OK ] SpecialFileTest.CreateSymlinkInNestedDir (0 ms) +[ RUN ] SpecialFileTest.DetectSymlink +[ OK ] SpecialFileTest.DetectSymlink (0 ms) +[ RUN ] SpecialFileTest.DetectFifo +[ OK ] SpecialFileTest.DetectFifo (0 ms) +[ RUN ] SpecialFileTest.ReadSymlinkDangling +[ OK ] SpecialFileTest.ReadSymlinkDangling (0 ms) +[ RUN ] SpecialFileTest.CreateFifoAndDetect +[ OK ] SpecialFileTest.CreateFifoAndDetect (0 ms) +[ RUN ] SpecialFileTest.CreateFifoWithPermissions +[ OK ] SpecialFileTest.CreateFifoWithPermissions (0 ms) +[ RUN ] SpecialFileTest.CreateDeviceAsNonRoot +[2026-07-16 00:02:24.106] [error] createDevice: mknod(/tmp/backer_test/CreateDeviceAsNonRoot/null_clone, major=1, minor=3) failed: Operation not permitted +[ OK ] SpecialFileTest.CreateDeviceAsNonRoot (0 ms) +[ RUN ] SpecialFileTest.DetectUnicodeFilename +[ OK ] SpecialFileTest.DetectUnicodeFilename (0 ms) +[----------] 12 tests from SpecialFileTest (2 ms total) + +[----------] 30 tests from CriteriaFilterTest +[ RUN ] CriteriaFilterTest.IncludePathGlob +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 4 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludePathGlob (0 ms) +[ RUN ] CriteriaFilterTest.IncludePathGlobRecursive +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludePathGlobRecursive (0 ms) +[ RUN ] CriteriaFilterTest.IncludeNameGlob +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.IncludeNameGlob (0 ms) +[ RUN ] CriteriaFilterTest.IncludeFileType +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.IncludeFileType (0 ms) +[ RUN ] CriteriaFilterTest.IncludeTimeRange +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeTimeRange (0 ms) +[ RUN ] CriteriaFilterTest.IncludeTimeRangeBefore +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeTimeRangeBefore (0 ms) +[ RUN ] CriteriaFilterTest.IncludeSizeRange +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeSizeRange (0 ms) +[ RUN ] CriteriaFilterTest.IncludeOwner +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeOwner (0 ms) +[ RUN ] CriteriaFilterTest.ExcludeType +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.ExcludeType (0 ms) +[ RUN ] CriteriaFilterTest.ExcludePathGlob +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.ExcludePathGlob (0 ms) +[ RUN ] CriteriaFilterTest.ExcludeOverridesInclude +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.ExcludeOverridesInclude (0 ms) +[ RUN ] CriteriaFilterTest.IncludeAcrossDimensionsAnd +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeAcrossDimensionsAnd (0 ms) +[ RUN ] CriteriaFilterTest.IncludeSameDimensionOr +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 4 → 2 entries after filtering +[ OK ] CriteriaFilterTest.IncludeSameDimensionOr (0 ms) +[ RUN ] CriteriaFilterTest.SingleCriterionAndFields +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.SingleCriterionAndFields (0 ms) +[ RUN ] CriteriaFilterTest.NoIncludeCriteriaAllPass +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.NoIncludeCriteriaAllPass (0 ms) +[ RUN ] CriteriaFilterTest.EmptyCriteriaPassesAll +[ OK ] CriteriaFilterTest.EmptyCriteriaPassesAll (0 ms) +[ RUN ] CriteriaFilterTest.EmptyInput +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 0 → 0 entries after filtering +[ OK ] CriteriaFilterTest.EmptyInput (0 ms) +[ RUN ] CriteriaFilterTest.AllFilteredOut +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 0 entries after filtering +[ OK ] CriteriaFilterTest.AllFilteredOut (0 ms) +[ RUN ] CriteriaFilterTest.NoopFilterPassesAll +[ OK ] CriteriaFilterTest.NoopFilterPassesAll (0 ms) +[ RUN ] CriteriaFilterTest.NoopFilterEmptyInput +[ OK ] CriteriaFilterTest.NoopFilterEmptyInput (0 ms) +[ RUN ] CriteriaFilterTest.IncludeWildcardQuestionMark +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 4 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeWildcardQuestionMark (0 ms) +[ RUN ] CriteriaFilterTest.IncludeBracketGlob +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.IncludeBracketGlob (0 ms) +[ RUN ] CriteriaFilterTest.SizeExactlyAtMin +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.SizeExactlyAtMin (0 ms) +[ RUN ] CriteriaFilterTest.SizeExactlyAtMax +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.SizeExactlyAtMax (0 ms) +[ RUN ] CriteriaFilterTest.SizeZeroBytes +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 2 entries after filtering +[ OK ] CriteriaFilterTest.SizeZeroBytes (0 ms) +[ RUN ] CriteriaFilterTest.TimeExactlyAtBoundary +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 2 entries after filtering +[ OK ] CriteriaFilterTest.TimeExactlyAtBoundary (0 ms) +[ RUN ] CriteriaFilterTest.IncludeAcrossSomeMatch +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 4 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludeAcrossSomeMatch (0 ms) +[ RUN ] CriteriaFilterTest.IncludePathWithSpaces +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 2 → 1 entries after filtering +[ OK ] CriteriaFilterTest.IncludePathWithSpaces (0 ms) +[ RUN ] CriteriaFilterTest.ExcludeMultipleCriteria +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 3 → 1 entries after filtering +[ OK ] CriteriaFilterTest.ExcludeMultipleCriteria (0 ms) +[ RUN ] CriteriaFilterTest.LargeEntryList +[2026-07-16 00:02:24.106] [info] CriteriaFilter: 1000 → 500 entries after filtering +[ OK ] CriteriaFilterTest.LargeEntryList (0 ms) +[----------] 30 tests from CriteriaFilterTest (0 ms total) + +[----------] 20 tests from TarPackerTest +[ RUN ] TarPackerTest.PackSingleRegularFile +[ OK ] TarPackerTest.PackSingleRegularFile (0 ms) +[ RUN ] TarPackerTest.PackUnpackRoundTrip +[ OK ] TarPackerTest.PackUnpackRoundTrip (0 ms) +[ RUN ] TarPackerTest.PackDirectory +[ OK ] TarPackerTest.PackDirectory (0 ms) +[ RUN ] TarPackerTest.PackSymlink +[ OK ] TarPackerTest.PackSymlink (0 ms) +[ RUN ] TarPackerTest.PackFifo +[ OK ] TarPackerTest.PackFifo (0 ms) +[ RUN ] TarPackerTest.PackDevice +[ OK ] TarPackerTest.PackDevice (0 ms) +[ RUN ] TarPackerTest.PackEmptyFile +[ OK ] TarPackerTest.PackEmptyFile (0 ms) +[ RUN ] TarPackerTest.PackLongPath +[ OK ] TarPackerTest.PackLongPath (0 ms) +[ RUN ] TarPackerTest.PackMultipleEntries +[2026-07-16 00:02:24.106] [warning] TarPacker: unreadable file /test/src/dir1/f1.txt, skipping content: Path not found +[2026-07-16 00:02:24.106] [warning] TarPacker: unreadable file /test/src/dir2/f2.txt, skipping content: Path not found +[ OK ] TarPackerTest.PackMultipleEntries (0 ms) +[ RUN ] TarPackerTest.EmptyEntryList +[ OK ] TarPackerTest.EmptyEntryList (0 ms) +[ RUN ] TarPackerTest.ValidChecksum +[ OK ] TarPackerTest.ValidChecksum (0 ms) +[ RUN ] TarPackerTest.RejectInvalidArchive +[2026-07-16 00:02:24.106] [error] TarPacker: truncated or invalid archive +[ OK ] TarPackerTest.RejectInvalidArchive (0 ms) +[ RUN ] TarPackerTest.FormatName +[ OK ] TarPackerTest.FormatName (0 ms) +[ RUN ] TarPackerTest.PackFileSpanningMultipleBlocks +[ OK ] TarPackerTest.PackFileSpanningMultipleBlocks (0 ms) +[ RUN ] TarPackerTest.PackExactBlockSizeFile +[ OK ] TarPackerTest.PackExactBlockSizeFile (0 ms) +[ RUN ] TarPackerTest.PackBinaryDataAllBytes +[ OK ] TarPackerTest.PackBinaryDataAllBytes (0 ms) +[ RUN ] TarPackerTest.PackDeeplyNestedStructure +[ OK ] TarPackerTest.PackDeeplyNestedStructure (0 ms) +[ RUN ] TarPackerTest.PackFileNameBoundary +[ OK ] TarPackerTest.PackFileNameBoundary (0 ms) +[ RUN ] TarPackerTest.MetadataPreservedInRoundTrip +[ OK ] TarPackerTest.MetadataPreservedInRoundTrip (0 ms) +[ RUN ] TarPackerTest.PackManySmallFiles +[ OK ] TarPackerTest.PackManySmallFiles (0 ms) +[----------] 20 tests from TarPackerTest (0 ms total) + +[----------] 19 tests from ZipPackerTest +[ RUN ] ZipPackerTest.FormatName +[ OK ] ZipPackerTest.FormatName (0 ms) +[ RUN ] ZipPackerTest.PackSingleRegularFile +[ OK ] ZipPackerTest.PackSingleRegularFile (0 ms) +[ RUN ] ZipPackerTest.PackUnpackRoundTrip +[ OK ] ZipPackerTest.PackUnpackRoundTrip (0 ms) +[ RUN ] ZipPackerTest.PackDirectory +[ OK ] ZipPackerTest.PackDirectory (0 ms) +[ RUN ] ZipPackerTest.PackSymlink +[ OK ] ZipPackerTest.PackSymlink (0 ms) +[ RUN ] ZipPackerTest.PackFifo +[ OK ] ZipPackerTest.PackFifo (0 ms) +[ RUN ] ZipPackerTest.PackDevice +[ OK ] ZipPackerTest.PackDevice (0 ms) +[ RUN ] ZipPackerTest.PackEmptyFile +[ OK ] ZipPackerTest.PackEmptyFile (0 ms) +[ RUN ] ZipPackerTest.EmptyEntryList +[ OK ] ZipPackerTest.EmptyEntryList (0 ms) +[ RUN ] ZipPackerTest.RejectInvalidArchive +[2026-07-16 00:02:24.107] [error] ZipPacker: invalid or corrupted zip archive +[ OK ] ZipPackerTest.RejectInvalidArchive (0 ms) +[ RUN ] ZipPackerTest.RejectZipWithoutMetadata +[2026-07-16 00:02:24.107] [error] ZipPacker: archive missing .backer_zip_meta entry +[ OK ] ZipPackerTest.RejectZipWithoutMetadata (0 ms) +[ RUN ] ZipPackerTest.PackMultipleEntries +[2026-07-16 00:02:24.107] [warning] ZipPacker: unreadable file /test/src/dir1/f1.txt, skipping content: Path not found +[2026-07-16 00:02:24.107] [warning] ZipPacker: unreadable file /test/src/dir2/f2.txt, skipping content: Path not found +[ OK ] ZipPackerTest.PackMultipleEntries (0 ms) +[ RUN ] ZipPackerTest.PackBinaryDataAllBytes +[ OK ] ZipPackerTest.PackBinaryDataAllBytes (0 ms) +[ RUN ] ZipPackerTest.MetadataPreservedInRoundTrip +[ OK ] ZipPackerTest.MetadataPreservedInRoundTrip (0 ms) +[ RUN ] ZipPackerTest.SymlinkWithMetadata +[ OK ] ZipPackerTest.SymlinkWithMetadata (0 ms) +[ RUN ] ZipPackerTest.PackLargeFile +[ OK ] ZipPackerTest.PackLargeFile (35 ms) +[ RUN ] ZipPackerTest.PackDeeplyNestedStructure +[ OK ] ZipPackerTest.PackDeeplyNestedStructure (0 ms) +[ RUN ] ZipPackerTest.PackManySmallFiles +[ OK ] ZipPackerTest.PackManySmallFiles (0 ms) +[ RUN ] ZipPackerTest.PackAllTypes +[ OK ] ZipPackerTest.PackAllTypes (0 ms) +[----------] 19 tests from ZipPackerTest (36 ms total) + +[----------] 8 tests from BuildCompressorTest +[ RUN ] BuildCompressorTest.CreateGzip +[ OK ] BuildCompressorTest.CreateGzip (0 ms) +[ RUN ] BuildCompressorTest.CreateZstd +[ OK ] BuildCompressorTest.CreateZstd (0 ms) +[ RUN ] BuildCompressorTest.CreateLzma +[ OK ] BuildCompressorTest.CreateLzma (0 ms) +[ RUN ] BuildCompressorTest.UnknownAlgorithmReturnsNull +[ OK ] BuildCompressorTest.UnknownAlgorithmReturnsNull (0 ms) +[ RUN ] BuildCompressorTest.CaseSensitiveLookup +[ OK ] BuildCompressorTest.CaseSensitiveLookup (0 ms) +[ RUN ] BuildCompressorTest.PartialNameRejected +[ OK ] BuildCompressorTest.PartialNameRejected (0 ms) +[ RUN ] BuildCompressorTest.DefaultLevelZero +[ OK ] BuildCompressorTest.DefaultLevelZero (0 ms) +[ RUN ] BuildCompressorTest.RoundTrip +[ OK ] BuildCompressorTest.RoundTrip (0 ms) +[----------] 8 tests from BuildCompressorTest (0 ms total) + +[----------] 8 tests from BuildEncryptorTest +[ RUN ] BuildEncryptorTest.CreateAes256 +[ OK ] BuildEncryptorTest.CreateAes256 (0 ms) +[ RUN ] BuildEncryptorTest.CreateAes256FullName +[ OK ] BuildEncryptorTest.CreateAes256FullName (0 ms) +[ RUN ] BuildEncryptorTest.CreateSm4 +[ OK ] BuildEncryptorTest.CreateSm4 (0 ms) +[ RUN ] BuildEncryptorTest.UnknownAlgorithmReturnsNull +[ OK ] BuildEncryptorTest.UnknownAlgorithmReturnsNull (0 ms) +[ RUN ] BuildEncryptorTest.UnknownAlgorithmEmpty +[ OK ] BuildEncryptorTest.UnknownAlgorithmEmpty (0 ms) +[ RUN ] BuildEncryptorTest.CaseSensitiveLookup +[ OK ] BuildEncryptorTest.CaseSensitiveLookup (0 ms) +[ RUN ] BuildEncryptorTest.PartialNameRejected +[ OK ] BuildEncryptorTest.PartialNameRejected (0 ms) +[ RUN ] BuildEncryptorTest.RoundTrip +[ OK ] BuildEncryptorTest.RoundTrip (121 ms) +[----------] 8 tests from BuildEncryptorTest (121 ms total) + +[----------] 10 tests from CcronexprTest +[ RUN ] CcronexprTest.DailyAt2am +[ OK ] CcronexprTest.DailyAt2am (0 ms) +[ RUN ] CcronexprTest.DailyAt2amBeforeMidnight +[ OK ] CcronexprTest.DailyAt2amBeforeMidnight (0 ms) +[ RUN ] CcronexprTest.EveryHour +[ OK ] CcronexprTest.EveryHour (0 ms) +[ RUN ] CcronexprTest.Every15Min +[ OK ] CcronexprTest.Every15Min (0 ms) +[ RUN ] CcronexprTest.Every15MinFromOffset +[ OK ] CcronexprTest.Every15MinFromOffset (0 ms) +[ RUN ] CcronexprTest.WeekdaysOnly +[ OK ] CcronexprTest.WeekdaysOnly (0 ms) +[ RUN ] CcronexprTest.WeeklyOnSunday +[ OK ] CcronexprTest.WeeklyOnSunday (0 ms) +[ RUN ] CcronexprTest.RangeHours +[ OK ] CcronexprTest.RangeHours (0 ms) +[ RUN ] CcronexprTest.InvalidExpression +[2026-07-16 00:02:24.265] [error] Failed to parse cron expression 'not-a-cron': Invalid number of fields, expression must consist of 6 fields +[ OK ] CcronexprTest.InvalidExpression (0 ms) +[ RUN ] CcronexprTest.NeverFires +[2026-07-16 00:02:24.266] [warning] Cron expression '0 0 30 2 *' will never fire again +[ OK ] CcronexprTest.NeverFires (0 ms) +[----------] 10 tests from CcronexprTest (0 ms total) + +[----------] 1 test from SnapshotPathTest +[ RUN ] SnapshotPathTest.ProducesTimestampedName +[ OK ] SnapshotPathTest.ProducesTimestampedName (0 ms) +[----------] 1 test from SnapshotPathTest (0 ms total) + +[----------] 13 tests from RetentionTest +[ RUN ] RetentionTest.ParseTimestampValid +[ OK ] RetentionTest.ParseTimestampValid (0 ms) +[ RUN ] RetentionTest.ParseTimestampInvalidFormat +[ OK ] RetentionTest.ParseTimestampInvalidFormat (0 ms) +[ RUN ] RetentionTest.ParseTimestampWrongLength +[ OK ] RetentionTest.ParseTimestampWrongLength (0 ms) +[ RUN ] RetentionTest.KeepAllWhenUnlimited +[ OK ] RetentionTest.KeepAllWhenUnlimited (0 ms) +[ RUN ] RetentionTest.KeepAllWhenDisabled +[ OK ] RetentionTest.KeepAllWhenDisabled (0 ms) +[ RUN ] RetentionTest.RemoveOldestWhenExceedingCount +[ OK ] RetentionTest.RemoveOldestWhenExceedingCount (0 ms) +[ RUN ] RetentionTest.RemoveMultipleOldest +[ OK ] RetentionTest.RemoveMultipleOldest (0 ms) +[ RUN ] RetentionTest.KeepExactCount +[ OK ] RetentionTest.KeepExactCount (0 ms) +[ RUN ] RetentionTest.RemoveOlderThanDays +[ OK ] RetentionTest.RemoveOlderThanDays (0 ms) +[ RUN ] RetentionTest.MixedBothConstraints +[ OK ] RetentionTest.MixedBothConstraints (0 ms) +[ RUN ] RetentionTest.EmptyList +[ OK ] RetentionTest.EmptyList (0 ms) +[ RUN ] RetentionTest.SingleSnapshot +[ OK ] RetentionTest.SingleSnapshot (0 ms) +[ RUN ] RetentionTest.NonMatchingNamesAreSkipped +[ OK ] RetentionTest.NonMatchingNamesAreSkipped (0 ms) +[----------] 13 tests from RetentionTest (0 ms total) + +[----------] 8 tests from SchedulerTest +[ RUN ] SchedulerTest.AddAndListJobs +[ OK ] SchedulerTest.AddAndListJobs (0 ms) +[ RUN ] SchedulerTest.RemoveJob +[ OK ] SchedulerTest.RemoveJob (0 ms) +[ RUN ] SchedulerTest.RemoveNonExistent +[ OK ] SchedulerTest.RemoveNonExistent (0 ms) +[ RUN ] SchedulerTest.EnableDisableJob +[ OK ] SchedulerTest.EnableDisableJob (0 ms) +[ RUN ] SchedulerTest.FindJob +[ OK ] SchedulerTest.FindJob (0 ms) +[ RUN ] SchedulerTest.StopWithoutRun +[ OK ] SchedulerTest.StopWithoutRun (0 ms) +[ RUN ] SchedulerTest.RunAndStop +[2026-07-16 00:02:24.266] [info] [Scheduler] Event loop started +[2026-07-16 00:02:24.372] [info] [Scheduler] Event loop stopped +[ OK ] SchedulerTest.RunAndStop (106 ms) +[ RUN ] SchedulerTest.AddJobWithCustomId +[ OK ] SchedulerTest.AddJobWithCustomId (0 ms) +[----------] 8 tests from SchedulerTest (106 ms total) + +[----------] 3 tests from ScheduleStoreTest +[ RUN ] ScheduleStoreTest.SaveAndLoad +[ OK ] ScheduleStoreTest.SaveAndLoad (0 ms) +[ RUN ] ScheduleStoreTest.LoadNonExistent +[2026-07-16 00:02:24.373] [info] Schedule file not found (first run): /tmp/backer_schedule_test.json +[ OK ] ScheduleStoreTest.LoadNonExistent (0 ms) +[ RUN ] ScheduleStoreTest.SaveMultipleAndLoad +[ OK ] ScheduleStoreTest.SaveMultipleAndLoad (0 ms) +[----------] 3 tests from ScheduleStoreTest (0 ms total) + +[----------] 2 tests from RetentionScanTest +[ RUN ] RetentionScanTest.ScansTimestampedDirs +[ OK ] RetentionScanTest.ScansTimestampedDirs (0 ms) +[ RUN ] RetentionScanTest.EmptyDir +[ OK ] RetentionScanTest.EmptyDir (0 ms) +[----------] 2 tests from RetentionScanTest (0 ms total) + +[----------] 45 tests from AllCompressors/CompressorTest +[ RUN ] AllCompressors/CompressorTest.RoundTripSmall/0 +[ OK ] AllCompressors/CompressorTest.RoundTripSmall/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripSmall/1 +[ OK ] AllCompressors/CompressorTest.RoundTripSmall/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripSmall/2 +[ OK ] AllCompressors/CompressorTest.RoundTripSmall/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripEmpty/0 +[ OK ] AllCompressors/CompressorTest.RoundTripEmpty/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripEmpty/1 +[ OK ] AllCompressors/CompressorTest.RoundTripEmpty/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripEmpty/2 +[ OK ] AllCompressors/CompressorTest.RoundTripEmpty/2 (4 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripSingleByte/0 +[ OK ] AllCompressors/CompressorTest.RoundTripSingleByte/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripSingleByte/1 +[ OK ] AllCompressors/CompressorTest.RoundTripSingleByte/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripSingleByte/2 +[ OK ] AllCompressors/CompressorTest.RoundTripSingleByte/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1KB/0 +[ OK ] AllCompressors/CompressorTest.RoundTrip1KB/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1KB/1 +[ OK ] AllCompressors/CompressorTest.RoundTrip1KB/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1KB/2 +[ OK ] AllCompressors/CompressorTest.RoundTrip1KB/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip64KB/0 +[ OK ] AllCompressors/CompressorTest.RoundTrip64KB/0 (1 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip64KB/1 +[ OK ] AllCompressors/CompressorTest.RoundTrip64KB/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip64KB/2 +[ OK ] AllCompressors/CompressorTest.RoundTrip64KB/2 (8 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1MiB/0 +[ OK ] AllCompressors/CompressorTest.RoundTrip1MiB/0 (25 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1MiB/1 +[ OK ] AllCompressors/CompressorTest.RoundTrip1MiB/1 (2 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTrip1MiB/2 +[ OK ] AllCompressors/CompressorTest.RoundTrip1MiB/2 (187 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/0 +[ OK ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/0 (2 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/1 +[ OK ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/2 +[ OK ] AllCompressors/CompressorTest.RoundTripCompressible1MiB/2 (12 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripBinary/0 +[ OK ] AllCompressors/CompressorTest.RoundTripBinary/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripBinary/1 +[ OK ] AllCompressors/CompressorTest.RoundTripBinary/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.RoundTripBinary/2 +[ OK ] AllCompressors/CompressorTest.RoundTripBinary/2 (1 ms) +[ RUN ] AllCompressors/CompressorTest.DefaultLevelIsValid/0 +[ OK ] AllCompressors/CompressorTest.DefaultLevelIsValid/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DefaultLevelIsValid/1 +[ OK ] AllCompressors/CompressorTest.DefaultLevelIsValid/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DefaultLevelIsValid/2 +[ OK ] AllCompressors/CompressorTest.DefaultLevelIsValid/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.NegativeLevelInvalid/0 +[ OK ] AllCompressors/CompressorTest.NegativeLevelInvalid/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.NegativeLevelInvalid/1 +[ OK ] AllCompressors/CompressorTest.NegativeLevelInvalid/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.NegativeLevelInvalid/2 +[ OK ] AllCompressors/CompressorTest.NegativeLevelInvalid/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.ExtremeLevelInvalid/0 +[ OK ] AllCompressors/CompressorTest.ExtremeLevelInvalid/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.ExtremeLevelInvalid/1 +[ OK ] AllCompressors/CompressorTest.ExtremeLevelInvalid/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.ExtremeLevelInvalid/2 +[ OK ] AllCompressors/CompressorTest.ExtremeLevelInvalid/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/0 +[ OK ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/0 (4 ms) +[ RUN ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/1 +[ OK ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/1 (16 ms) +[ RUN ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/2 +[ OK ] AllCompressors/CompressorTest.FactoryAppliesCompressionLevel/2 (61 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressGarbageFails/0 +[ OK ] AllCompressors/CompressorTest.DecompressGarbageFails/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressGarbageFails/1 +[ OK ] AllCompressors/CompressorTest.DecompressGarbageFails/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressGarbageFails/2 +[ OK ] AllCompressors/CompressorTest.DecompressGarbageFails/2 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressTruncatedFails/0 +[ OK ] AllCompressors/CompressorTest.DecompressTruncatedFails/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressTruncatedFails/1 +[ OK ] AllCompressors/CompressorTest.DecompressTruncatedFails/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.DecompressTruncatedFails/2 +[ OK ] AllCompressors/CompressorTest.DecompressTruncatedFails/2 (1 ms) +[ RUN ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/0 +[ OK ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/0 (0 ms) +[ RUN ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/1 +[ OK ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/1 (0 ms) +[ RUN ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/2 +[ OK ] AllCompressors/CompressorTest.CompressAppendsToExistingOutput/2 (0 ms) +[----------] 45 tests from AllCompressors/CompressorTest (335 ms total) + +[----------] 34 tests from AllEncryptors/EncryptorTest +[ RUN ] AllEncryptors/EncryptorTest.RoundTripSmall/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTripSmall/0 (37 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripSmall/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTripSmall/1 (84 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripEmpty/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTripEmpty/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripEmpty/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTripEmpty/1 (85 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripSingleByte/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTripSingleByte/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripSingleByte/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTripSingleByte/1 (82 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip1KB/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip1KB/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip1KB/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip1KB/1 (84 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip64KB/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip64KB/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip64KB/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip64KB/1 (86 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip1MiB/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip1MiB/0 (39 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTrip1MiB/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTrip1MiB/1 (96 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTripCompressible1MiB/1 (95 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripBinary/0 +[ OK ] AllEncryptors/EncryptorTest.RoundTripBinary/0 (35 ms) +[ RUN ] AllEncryptors/EncryptorTest.RoundTripBinary/1 +[ OK ] AllEncryptors/EncryptorTest.RoundTripBinary/1 (82 ms) +[ RUN ] AllEncryptors/EncryptorTest.WrongPasswordFails/0 +[2026-07-16 00:02:25.740] [error] Decryption failed: wrong password or corrupted data +[ OK ] AllEncryptors/EncryptorTest.WrongPasswordFails/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.WrongPasswordFails/1 +[2026-07-16 00:02:25.823] [error] Decryption failed: wrong password or corrupted data +[ OK ] AllEncryptors/EncryptorTest.WrongPasswordFails/1 (82 ms) +[ RUN ] AllEncryptors/EncryptorTest.EmptyPassword/0 +[2026-07-16 00:02:25.823] [error] Key derivation: password is empty +[ OK ] AllEncryptors/EncryptorTest.EmptyPassword/0 (0 ms) +[ RUN ] AllEncryptors/EncryptorTest.EmptyPassword/1 +[2026-07-16 00:02:25.823] [error] Key derivation: password is empty +[ OK ] AllEncryptors/EncryptorTest.EmptyPassword/1 (0 ms) +[ RUN ] AllEncryptors/EncryptorTest.PasswordWithSpaces/0 +[ OK ] AllEncryptors/EncryptorTest.PasswordWithSpaces/0 (36 ms) +[ RUN ] AllEncryptors/EncryptorTest.PasswordWithSpaces/1 +[ OK ] AllEncryptors/EncryptorTest.PasswordWithSpaces/1 (81 ms) +[ RUN ] AllEncryptors/EncryptorTest.CorruptedCiphertextFails/0 +[2026-07-16 00:02:25.976] [error] Decryption failed: wrong password or corrupted data +[ OK ] AllEncryptors/EncryptorTest.CorruptedCiphertextFails/0 (34 ms) +[ RUN ] AllEncryptors/EncryptorTest.CorruptedCiphertextFails/1 +[ OK ] AllEncryptors/EncryptorTest.CorruptedCiphertextFails/1 (81 ms) +[ RUN ] AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/0 +[2026-07-16 00:02:26.075] [error] Decryption: invalid magic bytes — not an encrypted file +[ OK ] AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/0 (17 ms) +[ RUN ] AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/1 +[2026-07-16 00:02:26.116] [error] Decryption: invalid magic bytes — not an encrypted file +[ OK ] AllEncryptors/EncryptorTest.CorruptedHeaderMagicFails/1 (41 ms) +[ RUN ] AllEncryptors/EncryptorTest.TruncatedInputFails/0 +[2026-07-16 00:02:26.134] [error] Decryption: input too small for header (23 bytes) +[ OK ] AllEncryptors/EncryptorTest.TruncatedInputFails/0 (17 ms) +[ RUN ] AllEncryptors/EncryptorTest.TruncatedInputFails/1 +[2026-07-16 00:02:26.178] [error] Decryption: input too small for header (23 bytes) +[ OK ] AllEncryptors/EncryptorTest.TruncatedInputFails/1 (44 ms) +[ RUN ] AllEncryptors/EncryptorTest.GarbageInputFails/0 +[2026-07-16 00:02:26.179] [error] Decryption: input too small for header (38 bytes) +[ OK ] AllEncryptors/EncryptorTest.GarbageInputFails/0 (0 ms) +[ RUN ] AllEncryptors/EncryptorTest.GarbageInputFails/1 +[2026-07-16 00:02:26.179] [error] Decryption: input too small for header (38 bytes) +[ OK ] AllEncryptors/EncryptorTest.GarbageInputFails/1 (0 ms) +[ RUN ] AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/0 +[ OK ] AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/0 (17 ms) +[ RUN ] AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/1 +[ OK ] AllEncryptors/EncryptorTest.EncryptAppendsToExistingOutput/1 (40 ms) +[ RUN ] AllEncryptors/EncryptorTest.UnicodePassword/0 +[ OK ] AllEncryptors/EncryptorTest.UnicodePassword/0 (35 ms) +[ RUN ] AllEncryptors/EncryptorTest.UnicodePassword/1 +[ OK ] AllEncryptors/EncryptorTest.UnicodePassword/1 (86 ms) +[----------] 34 tests from AllEncryptors/EncryptorTest (1650 ms total) + +[----------] Global test environment tear-down +[==========] 262 tests from 17 test suites ran. (2312 ms total) +[ PASSED ] 262 tests. diff --git a/logs/valgrind.log b/logs/valgrind.log new file mode 100644 index 0000000..7ebbfa1 --- /dev/null +++ b/logs/valgrind.log @@ -0,0 +1,118 @@ +==36164== Memcheck, a memory error detector +==36164== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. +==36164== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info +==36164== Command: ./build/backer_test --gtest_filter=BackupEngineTest.* +==36164== +Running main() from /home/airprofly/codeFolder/backer/build/_deps/googletest-src/googletest/src/gtest_main.cc +Note: Google Test filter = BackupEngineTest.* +[==========] Running 22 tests from 1 test suite. +[----------] Global test environment set-up. +[----------] 22 tests from BackupEngineTest +[ RUN ] BackupEngineTest.BackupBasic +[2026-07-15 23:59:46.259] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupBasic/source +[2026-07-15 23:59:46.303] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.1s +[ OK ] BackupEngineTest.BackupBasic (118 ms) +[ RUN ] BackupEngineTest.BackupContentMatches +[2026-07-15 23:59:46.316] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupContentMatches/source +[2026-07-15 23:59:46.319] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[ OK ] BackupEngineTest.BackupContentMatches (12 ms) +[ RUN ] BackupEngineTest.BackupWithEmptyDir +[2026-07-15 23:59:46.328] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupWithEmptyDir/source +[2026-07-15 23:59:46.329] [info] Backup complete: 0 files, 1 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithEmptyDir (4 ms) +[ RUN ] BackupEngineTest.BackupNonExistentSource +[2026-07-15 23:59:46.333] [error] Source path does not exist: /tmp/backer_test/BackupNonExistentSource/nonexistent +[ OK ] BackupEngineTest.BackupNonExistentSource (3 ms) +[ RUN ] BackupEngineTest.BackupEmptyDirectory +[2026-07-15 23:59:46.336] [info] BackupEngine: found 0 entries in /tmp/backer_test/BackupEmptyDirectory/source +[2026-07-15 23:59:46.336] [info] Backup complete: 0 files, 0 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupEmptyDirectory (3 ms) +[ RUN ] BackupEngineTest.BackupBinaryFile +[2026-07-15 23:59:46.341] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupBinaryFile/source +[2026-07-15 23:59:46.343] [info] Backup complete: 1 files, 0 dirs, 65537 bytes in 0.0s +[ OK ] BackupEngineTest.BackupBinaryFile (9 ms) +[ RUN ] BackupEngineTest.BackupDeepNestedDirectories +[2026-07-15 23:59:46.358] [info] BackupEngine: found 21 entries in /tmp/backer_test/BackupDeepNestedDirectories/source +[2026-07-15 23:59:46.362] [info] Backup complete: 1 files, 20 dirs, 9 bytes in 0.0s +[ OK ] BackupEngineTest.BackupDeepNestedDirectories (27 ms) +[ RUN ] BackupEngineTest.BackupFileAsSourceFails +[2026-07-15 23:59:46.377] [error] Source is not a directory: /tmp/backer_test/BackupFileAsSourceFails/source/afile.txt +[ OK ] BackupEngineTest.BackupFileAsSourceFails (4 ms) +[ RUN ] BackupEngineTest.BackupUnicodeFilenames +[2026-07-15 23:59:46.382] [info] BackupEngine: found 3 entries in /tmp/backer_test/BackupUnicodeFilenames/source +[2026-07-15 23:59:46.383] [info] Backup complete: 3 files, 0 dirs, 43 bytes in 0.0s +[ OK ] BackupEngineTest.BackupUnicodeFilenames (8 ms) +[ RUN ] BackupEngineTest.BackupIdempotency +[2026-07-15 23:59:46.390] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupIdempotency/source +[2026-07-15 23:59:46.392] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[2026-07-15 23:59:46.393] [info] BackupEngine: found 7 entries in /tmp/backer_test/BackupIdempotency/source +[2026-07-15 23:59:46.394] [info] Backup complete: 4 files, 3 dirs, 4129 bytes in 0.0s +[ OK ] BackupEngineTest.BackupIdempotency (11 ms) +[ RUN ] BackupEngineTest.BackupLargeFile +[2026-07-15 23:59:46.406] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupLargeFile/source +[2026-07-15 23:59:46.410] [info] Backup complete: 1 files, 0 dirs, 1048576 bytes in 0.0s +[ OK ] BackupEngineTest.BackupLargeFile (39 ms) +[ RUN ] BackupEngineTest.BackupMixedContent +[2026-07-15 23:59:46.445] [info] BackupEngine: found 9 entries in /tmp/backer_test/BackupMixedContent/source +[2026-07-15 23:59:46.447] [info] Backup complete: 4 files, 5 dirs, 25 bytes in 0.0s +[ OK ] BackupEngineTest.BackupMixedContent (12 ms) +[ RUN ] BackupEngineTest.BackupSingleFile +[2026-07-15 23:59:46.453] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupSingleFile/source +[2026-07-15 23:59:46.453] [info] Backup complete: 1 files, 0 dirs, 8 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSingleFile (4 ms) +[ RUN ] BackupEngineTest.BackupNestedEmptyDirs +[2026-07-15 23:59:46.460] [info] BackupEngine: found 5 entries in /tmp/backer_test/BackupNestedEmptyDirs/source +[2026-07-15 23:59:46.461] [info] Backup complete: 0 files, 5 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupNestedEmptyDirs (10 ms) +[ RUN ] BackupEngineTest.BackupSymlinks +[2026-07-15 23:59:46.472] [info] BackupEngine: found 3 entries in /tmp/backer_test/BackupSymlinks/source +[2026-07-15 23:59:46.473] [info] Backup complete: 2 files, 1 dirs, 14 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSymlinks (11 ms) +[ RUN ] BackupEngineTest.BackupSymlinkToFileInSameDir +[2026-07-15 23:59:46.481] [info] BackupEngine: found 2 entries in /tmp/backer_test/BackupSymlinkToFileInSameDir/source +[2026-07-15 23:59:46.481] [info] Backup complete: 2 files, 0 dirs, 8 bytes in 0.0s +[ OK ] BackupEngineTest.BackupSymlinkToFileInSameDir (6 ms) +[ RUN ] BackupEngineTest.BackupPreservesPermissions +[2026-07-15 23:59:46.488] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupPreservesPermissions/source +[2026-07-15 23:59:46.488] [info] Backup complete: 1 files, 0 dirs, 20 bytes in 0.0s +[ OK ] BackupEngineTest.BackupPreservesPermissions (5 ms) +[ RUN ] BackupEngineTest.BackupWithFilterIncludeType +[2026-07-15 23:59:46.496] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterIncludeType/source +[2026-07-15 23:59:46.503] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-15 23:59:46.504] [info] Backup complete: 2 files, 0 dirs, 9 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterIncludeType (17 ms) +[ RUN ] BackupEngineTest.BackupWithFilterExcludePath +[2026-07-15 23:59:46.512] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterExcludePath/source +[2026-07-15 23:59:46.514] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-15 23:59:46.515] [info] Backup complete: 1 files, 1 dirs, 4 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterExcludePath (9 ms) +[ RUN ] BackupEngineTest.BackupWithFilterAllExcluded +[2026-07-15 23:59:46.521] [info] BackupEngine: found 1 entries in /tmp/backer_test/BackupWithFilterAllExcluded/source +[2026-07-15 23:59:46.521] [info] CriteriaFilter: 1 → 0 entries after filtering +[2026-07-15 23:59:46.522] [info] Backup complete: 0 files, 0 dirs, 0 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterAllExcluded (5 ms) +[ RUN ] BackupEngineTest.BackupWithTarPacker +[2026-07-15 23:59:46.527] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithTarPacker/source +[2026-07-15 23:59:46.528] [info] BackupEngine: packing 4 entries as tar +[2026-07-15 23:59:46.542] [info] Backup complete (archive mode): 3 files, 1 dirs, 21 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithTarPacker (35 ms) +[ RUN ] BackupEngineTest.BackupWithFilterAndPacker +[2026-07-15 23:59:46.564] [info] BackupEngine: found 4 entries in /tmp/backer_test/BackupWithFilterAndPacker/source +[2026-07-15 23:59:46.565] [info] CriteriaFilter: 4 → 2 entries after filtering +[2026-07-15 23:59:46.565] [info] BackupEngine: packing 2 entries as tar +[2026-07-15 23:59:46.566] [info] Backup complete (archive mode): 2 files, 0 dirs, 23 bytes in 0.0s +[ OK ] BackupEngineTest.BackupWithFilterAndPacker (13 ms) +[----------] 22 tests from BackupEngineTest (380 ms total) + +[----------] Global test environment tear-down +[==========] 22 tests from 1 test suite ran. (399 ms total) +[ PASSED ] 22 tests. +==36164== +==36164== HEAP SUMMARY: +==36164== in use at exit: 0 bytes in 0 blocks +==36164== total heap usage: 7,852 allocs, 7,852 frees, 19,829,185 bytes allocated +==36164== +==36164== All heap blocks were freed -- no leaks are possible +==36164== +==36164== For lists of detected and suppressed errors, rerun with: -s +==36164== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)