X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/66e4277badef8f22852720b79a78e1f091c3b679..2ffca84edbea56d2142bda01affe79fdb4747851:/src/kernel/resource/profile/trace_mgr_test.cpp diff --git a/src/kernel/resource/profile/trace_mgr_test.cpp b/src/kernel/resource/profile/trace_mgr_test.cpp new file mode 100644 index 0000000000..53920352ce --- /dev/null +++ b/src/kernel/resource/profile/trace_mgr_test.cpp @@ -0,0 +1,149 @@ +/* Copyright (c) 2017-2019. The SimGrid Team. All rights reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#define CATCH_CONFIG_MAIN // This tells Catch to provide a main() - only do this in one cpp file +#include "src/include/catch.hpp" + +#include "simgrid/kernel/resource/Resource.hpp" +#include "src/kernel/resource/profile/trace_mgr.hpp" +#include "src/surf/surf_interface.hpp" + +#include "xbt/log.h" +#include "xbt/misc.h" + +#include + +XBT_LOG_NEW_DEFAULT_CATEGORY(unit, "Unit tests of the Trace Manager"); + +double thedate; +class MockedResource : public simgrid::kernel::resource::Resource { +public: + explicit MockedResource() : simgrid::kernel::resource::Resource(nullptr, "fake", nullptr) {} + void apply_event(simgrid::kernel::profile::Event* event, double value) override + { + XBT_VERB("t=%.1f: Change value to %lg (idx: %u)", thedate, value, event->idx); + tmgr_trace_event_unref(&event); + } + bool is_used() override { return true; } +}; + +static std::vector trace2vector(const char* str) +{ + std::vector res; + + simgrid::kernel::profile::Profile* trace = tmgr_trace_new_from_string("TheName", str, 0); + XBT_VERB("---------------------------------------------------------"); + XBT_VERB("data>>\n%s<event_list) + XBT_VERB("event: d:%lg v:%lg", evt.date_, evt.value_); + + MockedResource daResource; + simgrid::kernel::profile::FutureEvtSet fes; + simgrid::kernel::profile::Event* insertedIt = fes.add_trace(trace, &daResource); + + while (fes.next_date() <= 20.0 && fes.next_date() >= 0) { + thedate = fes.next_date(); + double value; + simgrid::kernel::resource::Resource* resource; + simgrid::kernel::profile::Event* it = fes.pop_leq(thedate, &value, &resource); + if (it == nullptr) + continue; + + REQUIRE(it == insertedIt); // Check that we find what we've put + if (value >= 0) { + resource->apply_event(it, value); + res.push_back(simgrid::kernel::profile::DatedValue(thedate, value)); + } else { + XBT_DEBUG("%.1f: ignore an event (idx: %u)\n", thedate, it->idx); + } + } + tmgr_finalize(); + return res; +} + +/* Fails in a way that is difficult to test: xbt_assert should become throw +BOOST_AUTO_TEST_CASE(no_evt_noloop) { +}*/ +TEST_CASE("kernel::profile: Resource profiles, defining the external load", "kernel::profile") +{ + + SECTION("No event, no loop") + { + std::vector got = trace2vector(""); + std::vector want; + REQUIRE(want == got); + } + + SECTION("One event no loop") + { + std::vector got = trace2vector("9.0 3.0\n"); + + std::vector want; + want.push_back(simgrid::kernel::profile::DatedValue(9, 3)); + REQUIRE(want == got); + } + + SECTION("Two events, no loop") + { + std::vector got = trace2vector("3.0 1.0\n" + "9.0 3.0\n"); + + std::vector want; + want.push_back(simgrid::kernel::profile::DatedValue(3, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(9, 3)); + + REQUIRE(want == got); + } + + SECTION("Three events, no loop") + { + + std::vector got = trace2vector("3.0 1.0\n" + "5.0 2.0\n" + "9.0 3.0\n"); + + std::vector want; + want.push_back(simgrid::kernel::profile::DatedValue(3, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(5, 2)); + want.push_back(simgrid::kernel::profile::DatedValue(9, 3)); + + REQUIRE(want == got); + } + + SECTION("Two events, looping") + { + std::vector got = trace2vector("1.0 1.0\n" + "3.0 3.0\n" + "LOOPAFTER 2\n"); + + std::vector want; + want.push_back(simgrid::kernel::profile::DatedValue(1, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(3, 3)); + want.push_back(simgrid::kernel::profile::DatedValue(6, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(8, 3)); + want.push_back(simgrid::kernel::profile::DatedValue(11, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(13, 3)); + want.push_back(simgrid::kernel::profile::DatedValue(16, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(18, 3)); + + REQUIRE(want == got); + } + + SECTION("Two events, looping, start at 0") + { + std::vector got = trace2vector("0.0 1\n" + "5.0 2\n" + "LOOPAFTER 5\n"); + + std::vector want; + want.push_back(simgrid::kernel::profile::DatedValue(0, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(5, 2)); + want.push_back(simgrid::kernel::profile::DatedValue(10, 1)); + want.push_back(simgrid::kernel::profile::DatedValue(15, 2)); + want.push_back(simgrid::kernel::profile::DatedValue(20, 1)); + + REQUIRE(want == got); + } +}