Activity-Lang: build activation detector
...using a HOOK-Activity as prepended adaptor, optionally forwarding the activation to the inferior
This commit is contained in:
parent
9cdfdf3d18
commit
3784bd7252
4 changed files with 118 additions and 4 deletions
|
|
@ -136,6 +136,17 @@ namespace gear {
|
||||||
virtual Proc activation ( Activity& thisHook
|
virtual Proc activation ( Activity& thisHook
|
||||||
, Time now
|
, Time now
|
||||||
, void* executionCtx) =0;
|
, void* executionCtx) =0;
|
||||||
|
|
||||||
|
virtual std::string
|
||||||
|
diagnostic() const
|
||||||
|
{
|
||||||
|
return "Activity::Hook";
|
||||||
|
}
|
||||||
|
|
||||||
|
operator std::string() const
|
||||||
|
{
|
||||||
|
return diagnostic();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@
|
||||||
#include "activity-detector.hpp"
|
#include "activity-detector.hpp"
|
||||||
#include "lib/test/test-helper.hpp"
|
#include "lib/test/test-helper.hpp"
|
||||||
#include "lib/time/timevalue.hpp"
|
#include "lib/time/timevalue.hpp"
|
||||||
#include "lib/format-cout.hpp"
|
#include "lib/format-cout.hpp" /////////////////////////////TODO
|
||||||
//#include "lib/util.hpp"
|
//#include "lib/util.hpp"
|
||||||
|
|
||||||
//#include <utility>
|
//#include <utility>
|
||||||
|
|
@ -39,6 +39,8 @@
|
||||||
//using lib::time::FSecs;
|
//using lib::time::FSecs;
|
||||||
//using std::move;
|
//using std::move;
|
||||||
//using util::isSameObject;
|
//using util::isSameObject;
|
||||||
|
using lib::test::randStr;
|
||||||
|
using lib::test::randTime;
|
||||||
|
|
||||||
|
|
||||||
namespace vault{
|
namespace vault{
|
||||||
|
|
@ -193,7 +195,7 @@ namespace test {
|
||||||
// an otherwise opaque object fulfilling the "Concept"
|
// an otherwise opaque object fulfilling the "Concept"
|
||||||
activity::_verify_usable_as_ExecutionContext<decltype(detector.executionCtx)>();
|
activity::_verify_usable_as_ExecutionContext<decltype(detector.executionCtx)>();
|
||||||
|
|
||||||
Time t = lib::test::randTime();
|
Time t = randTime();
|
||||||
size_t x = rand();
|
size_t x = rand();
|
||||||
Activity a;
|
Activity a;
|
||||||
|
|
||||||
|
|
@ -229,11 +231,15 @@ namespace test {
|
||||||
|
|
||||||
|
|
||||||
/** @test TODO diagnostic setup to detect Activity activation and propagation
|
/** @test TODO diagnostic setup to detect Activity activation and propagation
|
||||||
* @todo WIP 8/23 🔁 define ⟶ implement
|
* @todo WIP 8/23 🔁 define 🔁 implement
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
detect_activation()
|
detect_activation()
|
||||||
{
|
{
|
||||||
|
auto someID = "trap-" + randStr(4);
|
||||||
|
ActivityDetector detector;
|
||||||
|
Activity& probe = detector.buildActivationProbe (someID);
|
||||||
|
cout << probe << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,8 @@ namespace test {
|
||||||
return std::move (*this);
|
return std::move (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// default copyable
|
||||||
|
|
||||||
/** mock function call operator: logs all invocations */
|
/** mock function call operator: logs all invocations */
|
||||||
RET
|
RET
|
||||||
operator() (ARGS ...args)
|
operator() (ARGS ...args)
|
||||||
|
|
@ -293,6 +295,11 @@ namespace test {
|
||||||
.addAttrib (MARK_SEQ, util::toString(*seqNr_));
|
.addAttrib (MARK_SEQ, util::toString(*seqNr_));
|
||||||
return *retVal_;
|
return *retVal_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
operator string() const
|
||||||
|
{
|
||||||
|
return log_->getID()+"."+id_;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/** @internal type rebinding helper */
|
/** @internal type rebinding helper */
|
||||||
|
|
@ -307,6 +314,8 @@ namespace test {
|
||||||
using Type = typename RebindVariadic<DiagnosticFun, SigTypes>::Type;
|
using Type = typename RebindVariadic<DiagnosticFun, SigTypes>::Type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using Logger = _DiagnosticFun<void(string)>::Type;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A Mocked job operation to detect any actual invocation
|
* A Mocked job operation to detect any actual invocation
|
||||||
|
|
@ -334,9 +343,59 @@ namespace test {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A rigged CALLBACK-Activity to watch passing of activations.
|
||||||
|
*/
|
||||||
|
class ActivityProbe
|
||||||
|
: public Activity
|
||||||
|
, activity::Hook
|
||||||
|
{
|
||||||
|
Logger log_;
|
||||||
|
|
||||||
|
activity::Proc
|
||||||
|
activation ( Activity& thisHook
|
||||||
|
, Time now
|
||||||
|
, void* executionCtx) override
|
||||||
|
{
|
||||||
|
REQUIRE (Activity::HOOK == thisHook.verb_);
|
||||||
|
if (data_.callback.arg == 0)
|
||||||
|
{// no adapted target; just record this activation
|
||||||
|
log_(util::toString(now) + " ⧐ ");
|
||||||
|
return activity::PASS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{// forward activation to the adapted target Activity
|
||||||
|
Activity& target = *reinterpret_cast<Activity*> (data_.callback.arg);
|
||||||
|
auto ctx = *static_cast<FakeExecutionCtx*> (executionCtx);
|
||||||
|
log_(util::toString(now) + " ⧐ " + util::toString (target));
|
||||||
|
return target.activate (now, ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
diagnostic() const override
|
||||||
|
{
|
||||||
|
return "Probe("+string{log_}+")";
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit
|
||||||
|
ActivityProbe (string id, EventLog& masterLog, uint const& invocationSeqNr)
|
||||||
|
: Activity{*this, 0}
|
||||||
|
, log_{id, masterLog, invocationSeqNr}
|
||||||
|
{ }
|
||||||
|
|
||||||
|
operator string() const
|
||||||
|
{
|
||||||
|
return diagnostic();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* ===== Maintain throw-away mock instances ===== */
|
/* ===== Maintain throw-away mock instances ===== */
|
||||||
|
|
||||||
std::deque<MockJobFunctor> mockOps_{};
|
std::deque<MockJobFunctor> mockOps_{};
|
||||||
|
std::deque<ActivityProbe> mockActs_{};
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -405,6 +464,11 @@ namespace test {
|
||||||
buildDiagnosticFun<SIG_JobDiagnostic> (id));
|
buildDiagnosticFun<SIG_JobDiagnostic> (id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Activity&
|
||||||
|
buildActivationProbe (string id)
|
||||||
|
{
|
||||||
|
return mockActs_.emplace_back (id, eventLog_, invocationSeq_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct FakeExecutionCtx;
|
struct FakeExecutionCtx;
|
||||||
|
|
|
||||||
|
|
@ -82173,8 +82173,41 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
||||||
<icon BUILTIN="help"/>
|
<icon BUILTIN="help"/>
|
||||||
</node>
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205263970" ID="ID_43321196" MODIFIED="1689205277049" TEXT="activationProbe">
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689205263970" ID="ID_43321196" MODIFIED="1692372280856" TEXT="activationProbe">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node COLOR="#338800" CREATED="1692372010821" ID="ID_607483737" MODIFIED="1692380006038" TEXT="ist zugleich CALLBACK-Activity und Adapter">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node COLOR="#338800" CREATED="1692372106295" ID="ID_1204006498" MODIFIED="1692372277279" TEXT="wird intern vom ActivityDetector verwaltet">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
</node>
|
||||||
|
<node CREATED="1692372170118" ID="ID_1107069049" MODIFIED="1692372271039" TEXT="verschiedene Verdrahtungs-Möglichkeiten">
|
||||||
|
<icon BUILTIN="forward"/>
|
||||||
|
<node COLOR="#338800" CREATED="1692372197889" ID="ID_1824930461" MODIFIED="1692379992948" TEXT="als reine Detector-Activity">
|
||||||
|
<icon BUILTIN="button_ok"/>
|
||||||
|
<node CREATED="1692372210456" ID="ID_1081495304" MODIFIED="1692372233546" TEXT="lediglich als Activity& zu verwenden"/>
|
||||||
|
<node CREATED="1692372234342" ID="ID_1676209419" MODIFIED="1692372247496" TEXT="hängt über den Callback eine Log-Funktion ein"/>
|
||||||
|
<node CREATED="1692372252979" ID="ID_473155449" MODIFIED="1692372256575" TEXT="macht aber sonst nichts"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692372261546" ID="ID_1271161818" MODIFIED="1692372266426" TEXT="als Detector-Adapter">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
<node CREATED="1692372400775" ID="ID_1270041890" MODIFIED="1692372420536" TEXT="wird dann dem Überwachungsgegenstand vorgeschaltet"/>
|
||||||
|
<node CREATED="1692372433498" ID="ID_1038407160" MODIFIED="1692372443405" TEXT="übernimmt (doppelt) auch dessen next-Pointer"/>
|
||||||
|
<node CREATED="1692372445273" ID="ID_1169755490" MODIFIED="1692372481928" TEXT="reicht Aktivierung an die überwachte Activity weiter"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1692380008794" ID="ID_1667310608" MODIFIED="1692380053308" TEXT="diagnostic / toString">
|
||||||
|
<icon BUILTIN="pencil"/>
|
||||||
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1692380099390" ID="ID_851484000" MODIFIED="1692380120878" TEXT="soll die angegebene ID mit ausgeben">
|
||||||
|
<icon BUILTIN="yes"/>
|
||||||
|
</node>
|
||||||
|
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1692380024576" ID="ID_1476915138" MODIFIED="1692380051034" TEXT="custom string-conv wird nicht aufgerufen">
|
||||||
|
<icon BUILTIN="broken-line"/>
|
||||||
|
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1692380071745" ID="ID_708893412" MODIFIED="1692380087144" TEXT="das enable_if greift nicht... warum?">
|
||||||
|
<icon BUILTIN="help"/>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
|
</node>
|
||||||
</node>
|
</node>
|
||||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205295574" ID="ID_1666280196" MODIFIED="1689205299838" TEXT="activationTap">
|
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689205295574" ID="ID_1666280196" MODIFIED="1689205299838" TEXT="activationTap">
|
||||||
<icon BUILTIN="flag-yellow"/>
|
<icon BUILTIN="flag-yellow"/>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue