Squashed commit of the following: commit dc3a1bf07b5e7afdfd45e56f34596300dab6fd70 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 13 15:15:28 2021 -0300 Updating documentation a bit commit 8ec9c8c74f587368b32d034d3240a5537a69d4b1 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 13 15:11:23 2021 -0300 Completing tests for redis commit a6308dfa35b40b5a147394af8e3322ada871eb92 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 13 14:56:22 2021 -0300 Resolving some errors with forking environment commit 34691b6f85abae67001f4a4c234a4f7314407331 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 13 10:53:55 2021 -0300 Checkpointing work on unit tests commit 44c2b50fde30348938d901703ead9e279c3cd237 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 13 09:09:58 2021 -0300 Checkpointing work on redis commit a8051b725257087e25bc452673633ba6b40e3985 Author: Ian Roddis <gitlab@ie2r.com> Date: Fri Oct 8 13:31:41 2021 -0300 Checkpointing progress, changing state updates to a single record type commit 456b84ad8c7dee0ff0dd39d5a7caead1ccd1126c Author: Ian Roddis <gitlab@ie2r.com> Date: Thu Oct 7 16:43:48 2021 -0300 Checkpointing progress commit f19dcaa4e417c3f2f6e527c288fe51401c9fe1d7 Author: Ian Roddis <gitlab@ie2r.com> Date: Thu Oct 7 11:53:35 2021 -0300 Moving back to hiredis to avoid boost dependency commit e4bea6c589e82c82fd41476f164d946d77677193 Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 6 10:41:16 2021 -0300 fixing comments commit 807a73c2a406817001eec048483938545a60194c Author: Ian Roddis <gitlab@ie2r.com> Date: Wed Oct 6 10:40:38 2021 -0300 Switching to redis-cpp commit d060c008d4d96bf3a81a19d35067f95f3638b8ca Author: Ian Roddis <gitlab@ie2r.com> Date: Tue Oct 5 17:54:06 2021 -0300 Adding hiredis dep
130 lines
3.9 KiB
C++
130 lines
3.9 KiB
C++
#include <catch2/catch.hpp>
|
|
#include <filesystem>
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <sstream>
|
|
|
|
#include "daggy/Serialization.hpp"
|
|
#include "daggy/loggers/dag_run/OStreamLogger.hpp"
|
|
#include "daggy/loggers/dag_run/RedisLogger.hpp"
|
|
|
|
using namespace daggy;
|
|
using namespace daggy::loggers::dag_run;
|
|
|
|
const TaskSet SAMPLE_TASKS{
|
|
{"work_a",
|
|
Task{.definedName{"work_a"},
|
|
.job{{"command", std::vector<std::string>{"/bin/echo", "a"}}},
|
|
.children{"c"}}},
|
|
{"work_b",
|
|
Task{.definedName{"work_b"},
|
|
.job{{"command", std::vector<std::string>{"/bin/echo", "b"}}},
|
|
.children{"c"}}},
|
|
{"work_c",
|
|
Task{.definedName{"work_c"},
|
|
.job{{"command", std::vector<std::string>{"/bin/echo", "c"}}}}}};
|
|
|
|
namespace {
|
|
void testDAGRunInit(DAGRunLogger &logger, const std::string &tag,
|
|
const TaskSet &tasks)
|
|
{
|
|
auto runID = logger.startDAGRun(DAGSpec{.tag = tag, .tasks = tasks});
|
|
|
|
// Verify run shows up in the list
|
|
SECTION("New run shows up in list of runs")
|
|
{
|
|
auto runs = logger.queryDAGRuns();
|
|
REQUIRE(!runs.empty());
|
|
auto it = std::find_if(runs.begin(), runs.end(), [runID](const auto &r) {
|
|
return r.runID == runID;
|
|
});
|
|
REQUIRE(it != runs.end());
|
|
REQUIRE(it->tag == tag);
|
|
REQUIRE(it->runState == +RunState::QUEUED);
|
|
}
|
|
|
|
// Verify dagSpec matches
|
|
SECTION("Can retrieve DAG Spec")
|
|
{
|
|
auto spec = logger.getDAGSpec(runID);
|
|
REQUIRE(spec.tag == tag);
|
|
REQUIRE(spec.tasks == tasks);
|
|
}
|
|
|
|
// Verify states
|
|
SECTION("DAG State matches expectations")
|
|
{
|
|
REQUIRE(logger.getDAGRunState(runID) == +RunState::QUEUED);
|
|
for (const auto &[k, _] : tasks) {
|
|
REQUIRE(logger.getTaskState(runID, k) == +RunState::QUEUED);
|
|
}
|
|
}
|
|
|
|
// Verify integrity of run
|
|
SECTION("Can retrieve the full run")
|
|
{
|
|
auto dagRun = logger.getDAGRun(runID);
|
|
|
|
REQUIRE(dagRun.dagSpec.tag == tag);
|
|
REQUIRE(dagRun.dagSpec.tasks == tasks);
|
|
|
|
REQUIRE(dagRun.taskRunStates.size() == tasks.size());
|
|
auto nonQueuedTask = std::find_if(
|
|
dagRun.taskRunStates.begin(), dagRun.taskRunStates.end(),
|
|
[](const auto &a) { return a.second != +RunState::QUEUED; });
|
|
|
|
REQUIRE(nonQueuedTask == dagRun.taskRunStates.end());
|
|
REQUIRE(dagRun.dagStateChanges.size() == 1);
|
|
REQUIRE(dagRun.dagStateChanges.back().state == +RunState::QUEUED);
|
|
}
|
|
|
|
// Update DAG state and ensure that it's updated;
|
|
SECTION("Can update DAG state and retrieve new state")
|
|
{
|
|
logger.updateDAGRunState(runID, RunState::RUNNING);
|
|
auto dagRun = logger.getDAGRun(runID);
|
|
REQUIRE(dagRun.dagStateChanges.back().state == +RunState::RUNNING);
|
|
}
|
|
|
|
// Update a task state
|
|
SECTION("Can update task state and retrieve new state")
|
|
{
|
|
for (const auto &[k, v] : tasks)
|
|
logger.updateTaskState(runID, k, RunState::RUNNING);
|
|
auto dagRun = logger.getDAGRun(runID);
|
|
for (const auto &[k, v] : tasks) {
|
|
REQUIRE(dagRun.taskRunStates.at(k) == +RunState::RUNNING);
|
|
}
|
|
}
|
|
|
|
SECTION("Log task attempt and retrieve it")
|
|
{
|
|
std::cout << "Task attempts" << std::endl;
|
|
logger.logTaskAttempt(runID, "work_a",
|
|
AttemptRecord{.rc = 2, .errorLog = "help"});
|
|
auto dagRun = logger.getDAGRun(runID);
|
|
|
|
REQUIRE(dagRun.taskAttempts["work_a"].size() == 1);
|
|
REQUIRE(dagRun.taskAttempts["work_a"][0].errorLog == "help");
|
|
REQUIRE(dagRun.taskAttempts["work_a"][0].rc == 2);
|
|
}
|
|
}
|
|
} // namespace
|
|
|
|
TEST_CASE("ostream_logger", "[ostream_logger]")
|
|
{
|
|
std::stringstream ss;
|
|
daggy::loggers::dag_run::OStreamLogger logger(ss);
|
|
|
|
testDAGRunInit(logger, "init_test", SAMPLE_TASKS);
|
|
}
|
|
|
|
#ifdef DAGGY_ENABLE_REDIS
|
|
TEST_CASE("redis_logger", "[redis_logger]")
|
|
{
|
|
daggy::loggers::dag_run::RedisLogger logger;
|
|
|
|
testDAGRunInit(logger, "init_test", SAMPLE_TASKS);
|
|
}
|
|
#endif
|