Skip to content

Commit 58e5557

Browse files
authored
Fix reporting check for EXPR and evaluation (#217)
1 parent 3cfeb7f commit 58e5557

File tree

2 files changed

+113
-42
lines changed

2 files changed

+113
-42
lines changed

item-test/test_refda_socket.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,77 @@ def test_exec_report_on_no_destination(self):
337337
# items of the report
338338
self.assertEqual([ari.LiteralARI(None)], rpt.items)
339339

340+
def test_exec_report_on_variations(self):
341+
self._start()
342+
343+
# macro to configure preconditions:
344+
# ../!odm/const/rptt-two contains RPTT with two counter items
345+
# ../!odm/const/expr contains EXPR resolving to one counter
346+
# ../!odm/var/rptt-sum contains EXPR resolving to one counter
347+
self._send_msg(
348+
[self._ari_text_to_obj(
349+
'ari:/EXECSET/n=123;(/ac/('
350+
+ '//ietf/dtnma-agent/CTRL/ensure-odm(ietf,1,!odm,-1),'
351+
+ '//ietf/dtnma-agent/CTRL/ensure-const(//ietf/!odm,rptt-two,1,//ietf/amm-semtype/IDENT/type-use(//ietf/amm-base/typedef/rptt),/ac/(//ietf/dtnma-agent/EDD/num-msg-rx,//ietf/dtnma-agent/EDD/num-msg-rx-failed)),'
352+
+ '//ietf/dtnma-agent/CTRL/ensure-const(//ietf/!odm,expr-sum,2,//ietf/amm-semtype/IDENT/type-use(//ietf/amm-base/typedef/expr),/ac/(//ietf/dtnma-agent/EDD/num-msg-rx,//ietf/dtnma-agent/EDD/num-msg-rx-failed,//ietf/dtnma-agent/oper/add)),'
353+
+ '//ietf/dtnma-agent/CTRL/ensure-var(//ietf/!odm,rptt-sum,3,//ietf/amm-semtype/IDENT/type-use(//ietf/amm-base/typedef/rptt),/ac/(//ietf/!odm/const/expr-sum))'
354+
+ '))',
355+
nn=False
356+
)]
357+
)
358+
rpts = self._wait_reports(mgr_ix=0, nonce=ari.LiteralARI(123), stop_count=4)
359+
self.assertEqual(4, len(rpts))
360+
361+
self._send_msg(
362+
[self._ari_text_to_obj(
363+
'ari:/EXECSET/n=null;('
364+
+ '//ietf/dtnma-agent/CTRL/report-on(/ac/(undefined,//ietf/dtnma-agent/EDD/num-msg-rx-failed)),'
365+
+ '//ietf/dtnma-agent/CTRL/report-on(/ac/(//ietf/dtnma-agent/EDD/num-msg-rx,//ietf/dtnma-agent/EDD/num-msg-rx-failed)),'
366+
+ '//ietf/dtnma-agent/CTRL/report-on(//ietf/!odm/const/rptt-two),'
367+
+ '//ietf/dtnma-agent/CTRL/report-on(/ac/(//ietf/!odm/const/expr-sum)),'
368+
+ '//ietf/dtnma-agent/CTRL/report-on(//ietf/!odm/var/rptt-sum)'
369+
+ ')',
370+
nn=False
371+
)]
372+
)
373+
374+
rpts = self._wait_reports(mgr_ix=0, nonce=ari.LiteralARI(None), stop_count=5)
375+
self.assertEqual(5, len(rpts))
376+
377+
rpt = rpts.pop(0)
378+
self.assertEqual(
379+
self._ari_text_to_obj('/ac/(undefined,//ietf/dtnma-agent/EDD/num-msg-rx-failed)'),
380+
rpt.source
381+
)
382+
self.assertEqual(2, len(rpt.items))
383+
self.assertEqual(ari.UNDEFINED, rpt.items[0])
384+
self.assertIsInstance(rpt.items[1].value, int)
385+
386+
rpt = rpts.pop(0)
387+
self.assertEqual(
388+
self._ari_text_to_obj('/ac/(//ietf/dtnma-agent/EDD/num-msg-rx,//ietf/dtnma-agent/EDD/num-msg-rx-failed)'),
389+
rpt.source
390+
)
391+
self.assertEqual(2, len(rpt.items))
392+
self.assertIsInstance(rpt.items[0].value, int)
393+
self.assertIsInstance(rpt.items[1].value, int)
394+
395+
rpt = rpts.pop(0)
396+
self.assertEqual(self._ari_text_to_obj('//ietf/!odm/const/rptt-two', nn=False), rpt.source)
397+
self.assertEqual(2, len(rpt.items))
398+
self.assertIsInstance(rpt.items[0].value, int)
399+
self.assertIsInstance(rpt.items[1].value, int)
400+
401+
rpt = rpts.pop(0)
402+
self.assertEqual(self._ari_text_to_obj('/ac/(//ietf/!odm/const/expr-sum)', nn=False), rpt.source)
403+
self.assertEqual(1, len(rpt.items))
404+
# self.assertIsInstance(rpt.items[0].value, int)
405+
406+
rpt = rpts.pop(0)
407+
self.assertEqual(self._ari_text_to_obj('//ietf/!odm/var/rptt-sum', nn=False), rpt.source)
408+
self.assertEqual(1, len(rpt.items))
409+
self.assertIsInstance(rpt.items[0].value, int)
410+
340411
def test_exec_delayed(self):
341412
self._start()
342413

src/refda/reporting.c

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -53,32 +53,10 @@ int refda_reporting_ctrl(refda_runctx_t *runctx, const cace_ari_t *target, cace_
5353
return 0;
5454
}
5555

56-
/** Require any literal to be an EXPR and evaluate the expression.
57-
*/
58-
static int refda_reporting_item_lit(refda_runctx_t *parent, cace_ari_t *rpt_item, const cace_ari_t *rptt_item)
59-
{
60-
int retval = 0;
61-
if (CACE_AMM_TYPE_MATCH_POSITIVE != cace_amm_type_match(parent->agent->expr_type, rptt_item))
62-
{
63-
CACE_LOG_WARNING("Attempted reporting on a non-EXPR literal");
64-
retval = REFDA_REPORTING_ERR_BAD_TYPE;
65-
}
66-
else
67-
{
68-
CACE_LOG_DEBUG("Reporting on item literal");
69-
if (refda_eval_target(parent, rpt_item, rptt_item))
70-
{
71-
cace_ari_reset(rpt_item);
72-
retval = REFDA_REPORTING_ERR_EVAL_FAILED;
73-
}
74-
}
75-
return retval;
76-
}
77-
7856
/** Treat any object reference as a value-producing activity, with the
7957
* produced value reported on directly.
8058
*/
81-
static int refda_reporting_item_ref(refda_runctx_t *runctx, cace_ari_t *rpt_item, const cace_ari_t *rptt_item)
59+
static int refda_reporting_item_ref(refda_runctx_t *runctx, cace_ari_t *prod_val, const cace_ari_t *rptt_item)
8260
{
8361
CACE_LOG_DEBUG("Reporting on item reference");
8462
int retval = 0;
@@ -107,7 +85,7 @@ static int refda_reporting_item_ref(refda_runctx_t *runctx, cace_ari_t *rpt_item
10785
if (!retval)
10886
{
10987
// include the produced value directly
110-
cace_ari_set_copy(rpt_item, &(prodctx.value));
88+
cace_ari_set_move(prod_val, &(prodctx.value));
11189
}
11290
refda_valprod_ctx_deinit(&prodctx);
11391
break;
@@ -133,37 +111,59 @@ static int refda_reporting_rptt_val(refda_reporting_ctx_t *rptctx, const cace_ar
133111
for (cace_ari_list_it(rptt_it, tgt_ac->items); !cace_ari_list_end_p(rptt_it); cace_ari_list_next(rptt_it))
134112
{
135113
const cace_ari_t *rptt_item = cace_ari_list_cref(rptt_it);
136-
cace_ari_t rpt_item = CACE_ARI_INIT_UNDEFINED;
137114

138-
int res = 0;
115+
// intermediate item from the template
116+
cace_ari_t inter_item = CACE_ARI_INIT_UNDEFINED;
139117
if (rptt_item->is_ref)
140118
{
141-
// item is a reference to be produced
142-
res = refda_reporting_item_ref(rptctx->runctx, &rpt_item, rptt_item);
119+
// item is a reference to be produced, then possibly evaluated
120+
if (refda_reporting_item_ref(rptctx->runctx, &inter_item, rptt_item))
121+
{
122+
// failures in individual items result in undefined value
123+
CACE_LOG_WARNING("failed to dereference item");
124+
cace_ari_reset(&inter_item);
125+
}
143126
}
144127
else
145128
{
146-
// item is an expression to be evaluated
147-
res = refda_reporting_item_lit(rptctx->runctx, &rpt_item, rptt_item);
129+
// just use the template item
130+
cace_ari_set_copy(&inter_item, rptt_item);
148131
}
149-
150-
if (res)
132+
if (cace_log_is_enabled_for(LOG_DEBUG))
151133
{
152-
// failures in individual items result in undefined value
153-
CACE_LOG_WARNING("reporting failed for a single item with result %d", res);
154-
cace_ari_reset(&rpt_item);
134+
string_t buf;
135+
string_init(buf);
136+
cace_ari_text_encode(buf, &inter_item, CACE_ARI_TEXT_ENC_OPTS_DEFAULT);
137+
CACE_LOG_DEBUG("intermediate item %s", string_get_cstr(buf));
138+
string_clear(buf);
155139
}
156-
else
140+
141+
cace_ari_t rpt_item = CACE_ARI_INIT_UNDEFINED;
142+
if (CACE_AMM_TYPE_MATCH_POSITIVE == cace_amm_type_match(rptctx->runctx->agent->expr_type, &inter_item))
157143
{
158-
if (cace_log_is_enabled_for(LOG_DEBUG))
144+
// item is an expression to be evaluated
145+
CACE_LOG_DEBUG("Reporting on expression");
146+
if (refda_eval_target(rptctx->runctx, &rpt_item, &inter_item))
159147
{
160-
string_t buf;
161-
string_init(buf);
162-
cace_ari_text_encode(buf, &rpt_item, CACE_ARI_TEXT_ENC_OPTS_DEFAULT);
163-
CACE_LOG_DEBUG("report item result %s", string_get_cstr(buf));
164-
string_clear(buf);
148+
CACE_LOG_WARNING("reporting failed to evaluate expression");
149+
cace_ari_reset(&rpt_item);
165150
}
166151
}
152+
else
153+
{
154+
// intermediate is directly reported
155+
CACE_LOG_DEBUG("Reporting on literal");
156+
cace_ari_set_move(&rpt_item, &inter_item);
157+
}
158+
if (cace_log_is_enabled_for(LOG_DEBUG))
159+
{
160+
string_t buf;
161+
string_init(buf);
162+
cace_ari_text_encode(buf, &rpt_item, CACE_ARI_TEXT_ENC_OPTS_DEFAULT);
163+
CACE_LOG_DEBUG("reporting intermediate %s", string_get_cstr(buf));
164+
string_clear(buf);
165+
}
166+
cace_ari_deinit(&inter_item);
167167

168168
cace_ari_list_push_back_move(rptctx->items, &rpt_item);
169169
}

0 commit comments

Comments
 (0)