On Mon, Nov 09, 2015 at 02:21:53PM +0300, Maxim Uvarov wrote:
> Signed-off-by: Maxim Uvarov <maxim.uva...@linaro.org>
> ---
>  test/validation/pktio/pktio.c | 130 
> ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 130 insertions(+)
> 
> diff --git a/test/validation/pktio/pktio.c b/test/validation/pktio/pktio.c
> index 6320b77..c591c94 100644
> --- a/test/validation/pktio/pktio.c
> +++ b/test/validation/pktio/pktio.c
> @@ -690,6 +690,135 @@ void pktio_test_inq(void)
>       CU_ASSERT(odp_pktio_close(pktio) == 0);
>  }
>  
> +static void _print_pktio_stats(odp_pktio_stats_t *s, const char *name)
> +{
> +     printf("\n%s:\n"
> +             "  in_octets %"PRIu64"\n"
> +             "  in_ucast_pkts %"PRIu64"\n"
> +             "  in_discards %"PRIu64"\n"
> +             "  in_errors %"PRIu64"\n"
> +             "  in_unknown_protos %"PRIu64"\n"
> +             "  out_octets %"PRIu64"\n"
> +             "  out_ucast_pkts %"PRIu64"\n"
> +             "  out_discards %"PRIu64"\n"
> +             "  out_errors %"PRIu64"\n",
> +             name,
> +             s->in_octets,
> +             s->in_ucast_pkts,
> +             s->in_discards,
> +             s->in_errors,
> +             s->in_unknown_protos,
> +             s->out_octets,
> +             s->out_ucast_pkts,
> +             s->out_discards,
> +             s->out_errors);
> +}
> +
> +static void pktio_test_statistics_counters(void)
> +{
> +     odp_pktio_t pktio[MAX_NUM_IFACES];
> +     odp_packet_t pkt;
> +     odp_event_t tx_ev[1000];
> +     odp_event_t ev;
> +     int i, pkts, ret, alloc = 0;
> +     odp_queue_t outq;
> +     uint64_t wait = odp_schedule_wait_time(ODP_TIME_MSEC);
> +     odp_pktio_stats_t stats[2];
> +
> +     for (i = 0; i < num_ifaces; i++) {
> +             pktio[i] = create_pktio(i, ODP_PKTIN_MODE_SCHED);
> +             CU_ASSERT_FATAL(pktio[i] != ODP_PKTIO_INVALID);
> +             create_inq(pktio[i],  ODP_QUEUE_TYPE_SCHED);
> +     }
> +
> +     outq = odp_pktio_outq_getdef(pktio[0]);
> +
> +     ret = odp_pktio_start(pktio[0]);
> +     CU_ASSERT(ret == 0);
> +     if (num_ifaces > 1) {
> +             ret = odp_pktio_start(pktio[1]);
> +             CU_ASSERT(ret == 0);
> +     }
> +
> +     /* flush packets with magic number in pipes */
> +     for (i = 0; i < 1000; i++) {
> +             ev = odp_schedule(NULL, wait);
> +             if (ev != ODP_EVENT_INVALID)
> +                     odp_event_free(ev);
> +     }
> +
> +     /* alloc */
> +     for (alloc = 0; alloc < 1000; alloc++) {
> +             pkt = odp_packet_alloc(default_pkt_pool, packet_len);
> +             if (pkt == ODP_PACKET_INVALID)
> +                     break;
> +             pktio_init_packet(pkt);
> +             tx_ev[alloc] = odp_packet_to_event(pkt);
> +     }
> +
> +     ret = odp_pktio_stats_reset(pktio[0]);
> +     CU_ASSERT(ret == 0);
> +     if (num_ifaces > 1) {
> +             ret = odp_pktio_stats_reset(pktio[1]);
> +             CU_ASSERT(ret == 0);
> +     }
> +
> +     /* send */
> +     for (pkts = 0; pkts != alloc; ) {
> +             ret = odp_queue_enq_multi(outq, &tx_ev[pkts], alloc - pkts);
> +             if (ret < 0) {
> +                     CU_FAIL("unable to enqueue packet\n");
> +                     break;
> +             }
> +             pkts += ret;
> +     }
> +
> +     /* get */
> +     for (i = 0, pkts = 0; i < 1000; i++) {
> +             ev = odp_schedule(NULL, wait);
> +             if (ev != ODP_EVENT_INVALID) {
> +                     if (odp_event_type(ev) == ODP_EVENT_PACKET) {
> +                             pkt = odp_packet_from_event(ev);
> +                             if (pktio_pkt_seq(pkt) != TEST_SEQ_INVALID)
> +                                     pkts++;
> +                     }
> +                     odp_event_free(ev);
> +             }
> +     }
> +
> +     ret = odp_pktio_stats(pktio[0], &stats[0]);
> +     CU_ASSERT(ret == 0);
> +     _print_pktio_stats(&stats[0], iface_name[0]);

I don't like tests printing to stdout, it clutters the output and makes
it harder to see what's passed/failed. If all of the asserts pass then
it doesn't matter what the actual values are, that's a detail of the
test, if something fails though it's reasonable to dump to stderr.

> +
> +     if (num_ifaces > 1) {
> +             ret = odp_pktio_stats(pktio[1], &stats[1]);
> +             CU_ASSERT(ret == 0);
> +             _print_pktio_stats(&stats[1], iface_name[1]);
> +
> +             CU_ASSERT(stats[1].in_ucast_pkts >= (uint64_t)pkts);
> +             CU_ASSERT(stats[0].out_ucast_pkts == stats[1].in_ucast_pkts);
> +             CU_ASSERT(stats[0].out_octets == stats[1].in_octets);
> +             CU_ASSERT(stats[0].out_octets >=
> +                       (stats[0].out_ucast_pkts * (uint64_t)pkts));

What's this check for?.. seems to assert that average pkt size >= 2
octets.

> +     } else {

Why not check out_octets and out_ucast_pkts in this case?

The logic would be simpler with something like:

if (num_ifaces == 1)
        pktio[1] = pktio[0];

stats[0] = odp_pktio_stats(pktio[0], &stats[0]);
stats[1] = odp_pktio_stats(pktio[1], &stats[1]);

Then all the asserts would be the same regardless of whether you have 1
or 2 interfaces.

> +             CU_ASSERT(stats[0].in_ucast_pkts == (uint64_t)pkts);
> +             CU_ASSERT(stats[0].in_octets ==
> +                       (PKT_LEN_NORMAL * (uint64_t)pkts));
> +     }
> +
> +     CU_ASSERT(pkts == alloc);
> +     CU_ASSERT((stats[0].in_discards |
> +             stats[0].in_errors |
> +             stats[0].in_unknown_protos |
> +             stats[0].out_discards |
> +             stats[0].out_errors) == 0);

It would be better to have separate asserts for each of these so you
can tell from the logs which failed.

> +
> +     for (i = 0; i < num_ifaces; i++) {
> +             destroy_inq(pktio[i]);
> +             CU_ASSERT(odp_pktio_close(pktio[i]) == 0);
> +     }
> +}
> +
>  static void pktio_test_start_stop(void)
>  {
>       odp_pktio_t pktio[MAX_NUM_IFACES];
> @@ -1057,6 +1186,7 @@ odp_testinfo_t pktio_suite_unsegmented[] = {
>       ODP_TEST_INFO(pktio_test_mac),
>       ODP_TEST_INFO(pktio_test_inq_remdef),
>       ODP_TEST_INFO(pktio_test_start_stop),
> +     ODP_TEST_INFO(pktio_test_statistics_counters),
>       ODP_TEST_INFO_NULL
>  };
>  
> -- 
> 1.9.1
> 
_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to