Commit 8686c691 authored by Lucas Romero's avatar Lucas Romero Committed by Johan Hedberg
Browse files

tests: subsys: lorawan: add more test cases



for different numbers of lost fragments.

Signed-off-by: default avatarLucas Romero <luqasn@gmail.com>
parent 3a00ae48
Loading
Loading
Loading
Loading
+80 −31
Original line number Diff line number Diff line
@@ -45,9 +45,6 @@ static void fuota_finished(void)
	k_sem_give(&fuota_finished_sem);
}

ZTEST(frag_decoder, test_frag_transport)
{
	uint8_t buf[256]; /* maximum size of one LoRaWAN message */
uint8_t frag_session_setup_req[] = {
	CMD_FRAG_SESSION_SETUP,
	0x1f,
@@ -61,16 +58,44 @@ ZTEST(frag_decoder, test_frag_transport)
	0x00,
	0x00,
};

static void run_test(size_t lost_packets, bool expected_success)
{
	uint8_t buf[256]; /* maximum size of one LoRaWAN message */
	int ret;
	size_t num_packets = sizeof(fw_coded) / FRAG_SIZE;
	size_t packets_to_lose[num_packets];
	size_t tmp;
	bool skip;

	k_sem_reset(&fuota_finished_sem);
	for (size_t i = 0; i < num_packets; i++) {
		packets_to_lose[i] = i;
	}
	/* Shuffle array */
	for (size_t i = num_packets - 1; i > 0; i--) {
		int j = sys_rand32_get() % (i + 1);

		if (i != j) {
			tmp = packets_to_lose[j];
			packets_to_lose[j] = packets_to_lose[i];
			packets_to_lose[i] = tmp;
		}
	}

	k_sem_reset(&fuota_finished_sem);
	lorawan_emul_send_downlink(FRAG_TRANSPORT_PORT, false, 0, 0, sizeof(frag_session_setup_req),
				   frag_session_setup_req);

	for (int i = 0; i < sizeof(fw_coded) / FRAG_SIZE; i++) {
		if (i % 10 == 9) {
			/* loose every 10th packet */
	for (size_t i = 0; i < num_packets; i++) {
		skip = false;
		for (int j = 0; j < lost_packets; j++) {
			if (packets_to_lose[j] == i) {
				skip = true;
				break;
			}
		}
		if (skip) {
			/* lose packet */
			continue;
		}
		buf[0] = CMD_DATA_FRAGMENT;
@@ -80,16 +105,40 @@ ZTEST(frag_decoder, test_frag_transport)
		lorawan_emul_send_downlink(FRAG_TRANSPORT_PORT, false, 0, 0, FRAG_SIZE + 3, buf);
	}

	ret = k_sem_take(&fuota_finished_sem, K_MSEC(100));
	if (expected_success) {
		zassert_equal(ret, 0, "FUOTA finish timed out");
		for (int i = 0; i < UNCODED_FRAGS; i++) {
		size_t num_bytes = (i == UNCODED_FRAGS - 1) ? (FRAG_SIZE - PADDING) : FRAG_SIZE;
			size_t num_bytes =
				(i == UNCODED_FRAGS - 1) ? (FRAG_SIZE - PADDING) : FRAG_SIZE;

			flash_area_read(fa, i * FRAG_SIZE, buf, num_bytes);
		zassert_mem_equal(buf, fw_coded + i * FRAG_SIZE, num_bytes, "fragment %d invalid",
				  i + 1);
			zassert_mem_equal(buf, fw_coded + i * FRAG_SIZE, num_bytes,
					  "fragment %d invalid", i + 1);
		}
	} else {
		zassert_not_equal(ret, 0, "FUOTA should have failed");
	}
}

	ret = k_sem_take(&fuota_finished_sem, K_MSEC(100));
	zassert_equal(ret, 0, "FUOTA finish timed out");
ZTEST(frag_decoder, test_frag_transport_lose_none)
{
	run_test(0, true);
}

ZTEST(frag_decoder, test_frag_transport_lose_one)
{
	run_test(1, true);
}

ZTEST(frag_decoder, test_frag_transport_lose_close_to_max_redundancy)
{
	run_test(REDUNDANT_FRAGS * 0.95, true);
}

ZTEST(frag_decoder, test_frag_transport_lose_more_than_max_redundancy)
{
	run_test(REDUNDANT_FRAGS + 1, false);
}

static void *frag_decoder_setup(void)