On Thu, Nov 12, 2015 at 05:30:47PM +0300, Maxim Uvarov wrote: > On 11/10/2015 21:30, Stuart Haslam wrote: > >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. > > ok, I can hide to error case. It was easy for me to debug when I see > numbers. > > > > >>+ > >>+ 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. > > Opps. I planned to write: > > + CU_ASSERT(stats[0].out_octets >= > + (pkt_size * (uint64_t)pkts)); >
OK, that makes sense. > > For loop it's ==. But for other virtual dev some packets may be on > network (like dhcp), > so it will be >=. > > > >>+ } 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. > yes, it's the same think. Calling 2 times odp_pktio_stats() for the > same device > but different index in array a little bit confusing (complicates > code understanding). > At least for me. The main point was to avoid having two different sets of CU_ASSERT()s depending on whether you're using one or two interfaces, the test should be exactly the same in both cases. > >>+ 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. > Ok. My plan was that current counters are not well tested. When we > will add tests > for them then we can exclude from that group. But I can do test case > per counter, > it's not a problem. > > > > >>+ > >>+ 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 > >> > -- Stuart. _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp