card_emu_tests: Verify context of USB request contexts

when the emulator has received some data, don't just check that
we see it coming up on teh USB side, but actually also check
the content of those messages
diff --git a/firmware/test/card_emu_tests.c b/firmware/test/card_emu_tests.c
index 120748e..03dcf60 100644
--- a/firmware/test/card_emu_tests.c
+++ b/firmware/test/card_emu_tests.c
@@ -144,11 +144,42 @@
 	}
 }
 
+static void get_and_verify_rctx(int state, const char *data, unsigned int len)
+{
+	struct req_ctx *rctx;
+	struct cardemu_usb_msg_tx_data *td;
+	struct cardemu_usb_msg_rx_data *rd;
+
+	rctx = req_ctx_find_get(0, state, RCTX_S_USB_TX_BUSY);
+	assert(rctx);
+	dump_rctx(rctx);
+
+	/* verify the contents of the rctx */
+	switch (state) {
+	case RCTX_S_USB_TX_PENDING:
+		td = (struct cardemu_usb_msg_tx_data *) rctx->data;
+		assert(td->hdr.msg_type == CEMU_USB_MSGT_DO_RX_DATA);
+		assert(td->hdr.data_len == len);
+		assert(!memcmp(td->data, data, len));
+		break;
+#if 0
+	case RCTX_S_UART_RX_PENDING:
+		rd = (struct cardemu_usb_msg_rx_data *) rctx->data;
+		assert(rd->hdr.data_len == len);
+		assert(!memcmp(rd->data, data, len));
+		break;
+#endif
+	default:
+		assert(0);
+	}
+
+	/* free the req_ctx, indicating it has fully arrived on the host */
+	req_ctx_set_state(rctx, RCTX_S_FREE);
+}
+
 /* emulate a TPDU header being sent by the reader/phone */
 static void rdr_send_tpdu_hdr(struct card_handle *ch, const uint8_t *tpdu_hdr)
 {
-	struct req_ctx *rctx;
-
 	/* we don't want a receive context to become available during
 	 * the first four bytes */
 	reader_send_bytes(ch, tpdu_hdr, 4);
@@ -157,12 +188,7 @@
 	reader_send_bytes(ch, tpdu_hdr+4, 1);
 	/* but then after the final byte of the TPDU header, we want a
 	 * receive context to be available for USB transmission */
-	rctx = req_ctx_find_get(0, RCTX_S_USB_TX_PENDING, RCTX_S_USB_TX_BUSY);
-	assert(rctx);
-	dump_rctx(rctx);
-
-	/* free the req_ctx, indicating it has fully arrived on the host */
-	req_ctx_set_state(rctx, RCTX_S_FREE);
+	get_and_verify_rctx(RCTX_S_USB_TX_PENDING, tpdu_hdr, 5);
 }
 
 /* emulate a CEMU_USB_MSGT_DT_TX_DATA received from USB */
@@ -206,14 +232,13 @@
 static void
 test_tpdu_reader2card(struct card_handle *ch, const uint8_t *hdr, const uint8_t *body, uint8_t body_len)
 {
-	struct req_ctx *rctx;
-
 	printf("\n==> transmitting APDU (HDR + PB + card-RX)\n");
 
 	/* emulate the reader sending a TPDU header */
 	rdr_send_tpdu_hdr(ch, hdr);
 	/* we shouldn't have any pending card-TX yet */
 	assert(!card_tx_print_chars(ch));
+
 	/* card emulator PC sends a singly byte PB response via USB */
 	host_to_device_data(hdr+1, 1, CEMU_DATA_F_FINAL | CEMU_DATA_F_PB_AND_RX);
 	/* card actually sends that single PB */
@@ -223,10 +248,7 @@
 	reader_send_bytes(ch, body, body_len);
 
 	/* check if we have received them on the USB side */
-	rctx = req_ctx_find_get(0, RCTX_S_USB_TX_PENDING, RCTX_S_USB_TX_BUSY);
-	assert(rctx);
-	dump_rctx(rctx);
-	req_ctx_set_state(rctx, RCTX_S_FREE);
+	get_and_verify_rctx(RCTX_S_USB_TX_PENDING, body, body_len);
 
 	/* ensure there is no extra data received on usb */
 	assert(!req_ctx_find_get(0, RCTX_S_USB_TX_PENDING, RCTX_S_USB_TX_BUSY));