add a basic libmain test for the progress bar rendering

Hooray for leaky abstraction allowing us to test this particular part of
the render pipeline.

Change-Id: Ie0f251ff874f63324e6a9c6388b84ec6507eeae2
This commit is contained in:
Qyriad 2024-06-19 22:12:24 -06:00
parent e44dcd63c4
commit fd250c51ed
3 changed files with 66 additions and 4 deletions

View file

@ -13,9 +13,8 @@ constexpr const auto A_LONG_TIME = std::chrono::duration_cast<std::chrono::milli
100 * 365 * std::chrono::seconds(86400)
);
class ProgressBar : public Logger
struct ProgressBar : public Logger
{
private:
struct ActInfo
{
using TimePoint = std::chrono::time_point<std::chrono::steady_clock>;
@ -66,8 +65,6 @@ private:
bool printBuildLogs = false;
bool isTTY;
public:
ProgressBar(bool isTTY)
: isTTY(isTTY)
{

View file

@ -0,0 +1,43 @@
#include <gtest/gtest.h>
#include "eval.hh"
#include "progress-bar.hh"
#include "logging.hh"
#include "shared.hh"
constexpr std::string_view TEST_URL = "https://github.com/NixOS/nixpkgs/archive/master.tar.gz";
// Arbitrary number. We picked the size of a Nixpkgs tarball that we downloaded.
constexpr uint64_t TEST_EXPECTED = 43'370'307;
// Arbitrary number. We picked the progress made on a Nixpkgs tarball download we interrupted.
constexpr uint64_t TEST_DONE = 1'787'251;
constexpr std::string_view EXPECTED = ANSI_GREEN "1.7" ANSI_NORMAL "/41.4 MiB DL";
// Mostly here for informational purposes, but also if we change the way the escape codes
// are defined this test might break in some annoying to debug way.
constexpr std::string_view EXPECTED_RAW = "\x1b[32;1m1.7\x1b[0m/41.4 MiB DL";
static_assert(EXPECTED == EXPECTED_RAW, "Hey, hey, the ANSI escape code definitions prolly changed");
namespace nix
{
TEST(ProgressBar, basicStatusRender) {
initNix();
initGC();
startProgressBar();
ASSERT_NE(dynamic_cast<ProgressBar *>(logger), nullptr);
ProgressBar & progressBar = dynamic_cast<ProgressBar &>(*logger);
Activity act(
progressBar,
lvlDebug,
actFileTransfer,
fmt("downloading '%s'", TEST_URL),
{ "https://github.com/NixOS/nixpkgs/archive/master.tar.gz" }
);
act.progress(TEST_DONE, TEST_EXPECTED);
auto state = progressBar.state_.lock();
std::string const renderedStatus = progressBar.getStatus(*state);
ASSERT_EQ(renderedStatus, EXPECTED);
}
}

View file

@ -249,3 +249,25 @@ test(
suite : 'check',
protocol : 'gtest',
)
libmain_tester = executable(
'liblixmain-tests',
files('libmain/progress-bar.cc'),
dependencies : [
liblixmain,
liblixexpr,
liblixutil,
liblixstore,
gtest,
boost,
],
cpp_pch : cpp_pch,
)
test(
'libmain-unit-tests',
libmain_tester,
args : tests_args,
suite : 'check',
protocol : 'gtest',
)