diff --git a/debian/changelog b/debian/changelog index 3d0c411..4fb083d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +snapd-extra-utils (1.0.5) UNRELEASED; urgency=medium + + * [autopkgtest] Convert the snapd-seed-glue autopkgtest to C++. + + -- Simon Quigley Sun, 24 Nov 2024 23:07:39 -0600 + snapd-extra-utils (1.0.4) plucky; urgency=medium * [autopkgtest] Use snaps that are available on all arches, to fix armhf, diff --git a/debian/rules b/debian/rules index 1db62a3..0a840d4 100755 --- a/debian/rules +++ b/debian/rules @@ -9,4 +9,5 @@ export GOCACHE=$(CURDIR)/.gocache override_dh_auto_build: (cd snapd-seed-glue && go build -gcflags="all=-N -l" -ldflags="-compressdwarf=false" -o snapd-seed-glue) - (cd snapd-installation-monitor && cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo . && make) + (cd snapd-seed-glue/tests && cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo . && make -j2 && mv snapd_seed_glue_test ../../debian/tests/snapd-seed-glue) + (cd snapd-installation-monitor && cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo . && make -j2) diff --git a/debian/tests/snapd-seed-glue b/debian/tests/snapd-seed-glue deleted file mode 100755 index 20a8e89..0000000 --- a/debian/tests/snapd-seed-glue +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -set -e - -# File to track command output, so we can check for successful completion -OUTPUT_FILE=$(mktemp) - -# If the command output does not contain a final confirmation of success, exit 1 -confirm_success () { - if grep -q "Cleanup and validation completed" "$OUTPUT_FILE"; then - rm -f "$OUTPUT_FILE" - else - exit 1 - fi -} - -# Function to run snapd-seed-glue with given arguments -run_snapd_seed_glue () { - /usr/bin/snapd-seed-glue --verbose --seed hello_test "$@" > >(tee -a "$OUTPUT_FILE") 2>&1 - confirm_success -} - -echo "[snapd-seed-glue autopkgtest] Testing snapd-seed-glue with hello..." - -run_snapd_seed_glue hello - -echo "[snapd-seed-glue autopkgtest] Add htop to the same seed..." - -run_snapd_seed_glue hello htop - -echo "[snapd-seed-glue autopkgtest] Remove htop and replace it with btop..." - -run_snapd_seed_glue hello btop - -echo "[snapd-seed-glue autopkgtest] Confirm that non-existent snaps will fail..." - -/usr/bin/snapd-seed-glue --verbose --seed test_dir absolutelyridiculouslongnamethatwilldefinitelyneverexist > >(tee -a "$OUTPUT_FILE") 2>&1 || echo "Fail expected" -if ! grep -q "cannot install snap \"absolutelyridiculouslongnamethatwilldefinitelyneverexist\": snap not found" "$OUTPUT_FILE"; then - exit 1 -fi diff --git a/snapd-seed-glue/tests/CMakeLists.txt b/snapd-seed-glue/tests/CMakeLists.txt new file mode 100644 index 0000000..99b42e1 --- /dev/null +++ b/snapd-seed-glue/tests/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.14) +project(snapd_seed_glue_test) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +add_executable(snapd_seed_glue_test cli-tests.cpp) diff --git a/snapd-seed-glue/tests/cli-tests.cpp b/snapd-seed-glue/tests/cli-tests.cpp new file mode 100644 index 0000000..c21553f --- /dev/null +++ b/snapd-seed-glue/tests/cli-tests.cpp @@ -0,0 +1,88 @@ +// Copyright (C) 2024 Simon Quigley +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 3 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +#include +#include +#include +#include +#include +#include +#include +#include + +std::string OUTPUT_FILE_CONTENTS; + +std::pair execute_command(const std::string& cmd) { + std::array buffer{}; + std::string result; + // Redirect stderr to stdout + std::string cmd_with_redirect = cmd + " 2>&1"; + FILE* pipe = popen(cmd_with_redirect.c_str(), "r"); + if (!pipe) throw std::runtime_error("popen() failed!"); + while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) { + result += buffer.data(); + // Also echo the output to stdout + std::cout << buffer.data(); + } + int rc = pclose(pipe); + int exit_code = WEXITSTATUS(rc); + return {result, exit_code}; +} + +void confirm_success() { + if (OUTPUT_FILE_CONTENTS.find("Cleanup and validation completed") != std::string::npos) { + // Success, clear OUTPUT_FILE_CONTENTS + OUTPUT_FILE_CONTENTS.clear(); + } else { + exit(1); + } +} + +void run_snapd_seed_glue(const std::vector& args) { + std::string cmd = "/usr/bin/snapd-seed-glue --verbose --seed hello_test"; + for (const auto& arg : args) { + cmd += " " + arg; + } + auto [output, exit_code] = execute_command(cmd); + // Append output to OUTPUT_FILE_CONTENTS + OUTPUT_FILE_CONTENTS += output; + if (exit_code != 0) { + exit(1); + } + confirm_success(); +} + +int main() { + std::cout << "[snapd-seed-glue autopkgtest] Testing snapd-seed-glue with hello...\n"; + run_snapd_seed_glue({"hello"}); + + std::cout << "[snapd-seed-glue autopkgtest] Add htop to the same seed...\n"; + run_snapd_seed_glue({"hello", "htop"}); + + std::cout << "[snapd-seed-glue autopkgtest] Remove htop and replace it with btop...\n"; + run_snapd_seed_glue({"hello", "btop"}); + + std::cout << "[snapd-seed-glue autopkgtest] Confirm that non-existent snaps will fail...\n"; + std::string invalid_snap = "absolutelyridiculouslongnamethatwilldefinitelyneverexist"; + std::string cmd = "/usr/bin/snapd-seed-glue --verbose --seed test_dir " + invalid_snap; + auto [output, exit_code] = execute_command(cmd); + OUTPUT_FILE_CONTENTS += output; + if (exit_code != 0) { + std::cout << "Fail expected\n"; + } + if (OUTPUT_FILE_CONTENTS.find("cannot install snap \"" + invalid_snap + "\": snap not found") != std::string::npos) { + // Expected error message found + } else { + exit(1); + } + return 0; +}