def test_direct_counter_entry_invalid(self): ce = sh.DirectCounterEntry("ExactOne_counter") with self.assertRaisesRegex(UserError, "table_entry must be an instance of TableEntry"): ce.table_entry = 0xbad with self.assertRaisesRegex(UserError, "This DirectCounterEntry is for table"): ce.table_entry = sh.TableEntry("TernaryOne") with self.assertRaisesRegex(UserError, "Direct counters are not index-based"): ce.index = 1 te = sh.TableEntry("LpmOne")(action="actionA") with self.assertRaisesRegex(UserError, "Table has no direct counter"): te.counter_data.packet_count = 100 te = sh.TableEntry("ExactOne")(action="actionA") with self.assertRaisesRegex(UserError, "Counter 'ExactOne_counter' is of type 'PACKETS"): te.counter_data.byte_count = 100
def test_direct_counter_entry(self): ce = sh.DirectCounterEntry("ExactOne_counter") ce.table_entry.match["header_test.field32"] = "10.0.0.0" ce.packet_count = 100 expected_entry = """ table_entry { table_id: 33582705 match { field_id: 1 exact { value: "\\x0a\\x00\\x00\\x00" } } } data { packet_count: 100 } """ expected_req = self.make_write_request( p4runtime_pb2.Update.MODIFY, P4RuntimeEntity.direct_counter_entry, expected_entry) ce.modify() self.servicer.Write.assert_called_with(ProtoCmp(expected_req), ANY) self.simple_read_check(expected_req.updates[0].entity, ce, P4RuntimeEntity.direct_counter_entry) ce.table_entry = None expected_entry = """ table_entry { table_id: 33582705 } data { packet_count: 100 } """ expected_req = self.make_write_request( p4runtime_pb2.Update.MODIFY, P4RuntimeEntity.direct_counter_entry, expected_entry) ce.modify() self.servicer.Write.assert_called_with(ProtoCmp(expected_req), ANY)