From a99361e0b664bc4ca837a600750ea0f993ba8af2 Mon Sep 17 00:00:00 2001
From: Matthew Blue <matthew.blue.neuro@gmail.com>
Date: Mon, 27 Aug 2018 18:56:00 -0400
Subject: [PATCH] tests/eepreg: Initial test support

---
 tests/eepreg/Makefile        |   7 ++
 tests/eepreg/README.md       |   6 ++
 tests/eepreg/main.c          | 203 +++++++++++++++++++++++++++++++++++
 tests/eepreg/tests/01-run.py |  26 +++++
 4 files changed, 242 insertions(+)
 create mode 100644 tests/eepreg/Makefile
 create mode 100644 tests/eepreg/README.md
 create mode 100644 tests/eepreg/main.c
 create mode 100755 tests/eepreg/tests/01-run.py

diff --git a/tests/eepreg/Makefile b/tests/eepreg/Makefile
new file mode 100644
index 0000000000..12b93f0374
--- /dev/null
+++ b/tests/eepreg/Makefile
@@ -0,0 +1,7 @@
+include ../Makefile.tests_common
+
+FEATURES_REQUIRED = periph_eeprom
+
+USEMODULE += eepreg
+
+include $(RIOTBASE)/Makefile.include
diff --git a/tests/eepreg/README.md b/tests/eepreg/README.md
new file mode 100644
index 0000000000..e53b28f005
--- /dev/null
+++ b/tests/eepreg/README.md
@@ -0,0 +1,6 @@
+# EEPROM registry (eepreg) test
+
+This test will verify the functionality of the eepreg module.
+
+WARNING: This will write to your EEPROM and probably corrupt any data that is
+there!
diff --git a/tests/eepreg/main.c b/tests/eepreg/main.c
new file mode 100644
index 0000000000..b56f24df3f
--- /dev/null
+++ b/tests/eepreg/main.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (C) 2018 Acutam Automation, LLC
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @ingroup     tests
+ * @{
+ *
+ * @file
+ * @brief       eepreg test application
+ *
+ * @author      Matthew Blue <matthew.blue.neuro@gmail.com>
+ * @}
+ */
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "eepreg.h"
+#include "periph/eeprom.h"
+
+#define DAT_START    (EEPROM_SIZE - EEPROM_RESERV_CPU_HI \
+                      - EEPROM_RESERV_BOARD_HI - 1)
+
+#define ENT1_NAME    "foo"
+#define ENT1_SIZE    (12U)
+#define ENT2_NAME    "bar"
+#define ENT2_SIZE    (34U)
+#define DATA         "spam and eggs"
+
+int eepreg_iter_cb(char *name, void *arg)
+{
+    (void)arg;
+
+    printf("%s ", name);
+
+    return 0;
+}
+
+int main(void)
+{
+    int ret;
+    uint32_t tmp1, tmp2, tmp3;
+    char data[sizeof(DATA)];
+
+    puts("EEPROM registry (eepreg) test routine");
+
+    printf("Testing new registry creation: ");
+
+    printf("reset ");
+    ret = eepreg_reset();
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("check ");
+    ret = eepreg_check();
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing writing and reading entries: ");
+
+    printf("add ");
+    ret = eepreg_add(&tmp1, ENT1_NAME, ENT1_SIZE);
+    if (ret < 0 || tmp1 != DAT_START - ENT1_SIZE) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("write ");
+    ret = eepreg_write(&tmp2, ENT2_NAME, ENT2_SIZE);
+    if (ret < 0 || tmp2 != DAT_START - ENT1_SIZE - ENT2_SIZE) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    /* read via add */
+    printf("add ");
+    ret = eepreg_add(&tmp3, ENT1_NAME, ENT1_SIZE);
+    if (ret < 0 || tmp1 != tmp3) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("read ");
+    ret = eepreg_read(&tmp1, ENT2_NAME);
+    if (ret < 0 || tmp1 != tmp2) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing detection of conflicting size: ");
+
+    printf("add ");
+    ret = eepreg_add(&tmp1, ENT1_NAME, ENT1_SIZE + 1);
+    if (ret != -EADDRINUSE) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing calculation of lengths: ");
+
+    printf("len ");
+    ret = eepreg_len(&tmp1, ENT1_NAME);
+    if (ret < 0 || tmp1 != ENT1_SIZE) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("len ");
+    ret = eepreg_len(&tmp2, ENT2_NAME);
+    if (ret < 0 || tmp2 != ENT2_SIZE) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing of successful data move after rm: ");
+
+    printf("rm ");
+    eepreg_read(&tmp1, ENT1_NAME);
+    eepreg_read(&tmp2, ENT2_NAME);
+    eeprom_write(tmp2, (uint8_t *)DATA, sizeof(DATA));
+    ret = eepreg_rm(ENT1_NAME);
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("read ");
+    ret = eepreg_read(&tmp3, ENT2_NAME);
+    if (ret < 0 || tmp3 != (DAT_START - ENT2_SIZE)) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("data ");
+    eeprom_read(tmp3, (uint8_t *)data, sizeof(DATA));
+    if (strcmp(data, DATA) != 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing of free space change after write: ");
+
+    printf("free ");
+    ret = eepreg_free(&tmp1);
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("add ");
+    ret = eepreg_add(&tmp3, ENT1_NAME, ENT1_SIZE);
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    printf("free ");
+    ret = eepreg_free(&tmp2);
+    if (ret < 0
+        || tmp1 != (tmp2 + ENT1_SIZE + sizeof(ENT1_NAME) + EEPREG_PTR_LEN)) {
+
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    printf("Testing of iteration over registry: ");
+
+    printf("iter ");
+    ret = eepreg_iter(eepreg_iter_cb, NULL);
+    if (ret < 0) {
+        puts("[FAILED]");
+        return 1;
+    }
+
+    puts("[SUCCESS]");
+
+    puts("Tests complete!");
+
+    return 0;
+}
diff --git a/tests/eepreg/tests/01-run.py b/tests/eepreg/tests/01-run.py
new file mode 100755
index 0000000000..d26ab489ab
--- /dev/null
+++ b/tests/eepreg/tests/01-run.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2018 Acutam Automation, LLC
+#
+# This file is subject to the terms and conditions of the GNU Lesser
+# General Public License v2.1. See the file LICENSE in the top level
+# directory for more details.
+
+import sys
+from testrunner import run
+
+
+def testfunc(child):
+    child.expect_exact("EEPROM registry (eepreg) test routine")
+    child.expect_exact("Testing new registry creation: reset check [SUCCESS]")
+    child.expect_exact("Testing writing and reading entries: add write add read [SUCCESS]")
+    child.expect_exact("Testing detection of conflicting size: add [SUCCESS]")
+    child.expect_exact("Testing calculation of lengths: len len [SUCCESS]")
+    child.expect_exact("Testing of successful data move after rm: rm read data [SUCCESS]")
+    child.expect_exact("Testing of free space change after write: free add free [SUCCESS]")
+    child.expect_exact("Testing of iteration over registry: iter bar foo [SUCCESS]")
+    child.expect_exact("Tests complete!")
+
+
+if __name__ == "__main__":
+    sys.exit(run(testfunc))
-- 
GitLab