From ae6028c74990b1ea418ebc52cb2b5fcea869d1cc Mon Sep 17 00:00:00 2001
From: Alexandre Abadie <alexandre.abadie@inria.fr>
Date: Mon, 1 Oct 2018 15:23:29 +0200
Subject: [PATCH] tests/periph_eeprom: refactor test application + fix bounds

---
 tests/periph_eeprom/main.c | 92 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 89 insertions(+), 3 deletions(-)

diff --git a/tests/periph_eeprom/main.c b/tests/periph_eeprom/main.c
index 0de526c83a..0eac47877f 100644
--- a/tests/periph_eeprom/main.c
+++ b/tests/periph_eeprom/main.c
@@ -21,6 +21,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <assert.h>
 
 #include "shell.h"
 
@@ -65,7 +66,7 @@ static int cmd_read(int argc, char **argv)
         return 1;
     }
 
-    if (pos + count >= EEPROM_SIZE) {
+    if (pos + count > EEPROM_SIZE) {
         puts("Failed: cannot read out of eeprom bounds");
         return 1;
     }
@@ -78,6 +79,26 @@ static int cmd_read(int argc, char **argv)
     return 0;
 }
 
+static int cmd_read_byte(int argc, char **argv)
+{
+    if (argc < 2) {
+        printf("usage: %s <pos>\n", argv[0]);
+        return 1;
+    }
+
+    uint32_t pos = atoi(argv[1]);
+
+    if (pos >= EEPROM_SIZE) {
+        puts("Failed: cannot read out of eeprom bounds");
+        return 1;
+    }
+
+    uint8_t byte = eeprom_read_byte(pos);
+    printf("Byte read from EEPROM: 0x%02X (%c)\n", byte, byte);
+
+    return 0;
+}
+
 static int cmd_write(int argc, char **argv)
 {
     if (argc < 3) {
@@ -87,7 +108,7 @@ static int cmd_write(int argc, char **argv)
 
     uint32_t pos = atoi(argv[1]);
 
-    if (pos + strlen(argv[2]) >= EEPROM_SIZE) {
+    if (pos + strlen(argv[2]) > EEPROM_SIZE) {
         puts("Failed: cannot write out of eeprom bounds");
         return 1;
     }
@@ -98,10 +119,75 @@ static int cmd_write(int argc, char **argv)
     return 0;
 }
 
+static int cmd_write_byte(int argc, char **argv)
+{
+    if (argc < 3) {
+        printf("usage: %s <pos> <byte>\n", argv[0]);
+        return 1;
+    }
+
+    uint32_t pos = atoi(argv[1]);
+
+    if (pos >= EEPROM_SIZE) {
+        puts("Failed: cannot write out of eeprom bounds");
+        return 1;
+    }
+
+    eeprom_write_byte(pos, *(uint8_t *)argv[2]);
+    printf("Byte written to EEPROM\n");
+
+    return 0;
+}
+
+static int cmd_test(int argc, char **argv)
+{
+    (void)argv;
+
+    if (argc != 1) {
+        puts("FAILED");
+        return 1;
+    }
+
+    const char *test = "test";
+
+    /* test read/write function */
+
+    /* read/write from beginning of EEPROM */
+    size_t ret = eeprom_write(0, (uint8_t *)test, 4);
+    assert(ret == 4);
+
+    char *expected[4];
+    ret = eeprom_read(0, (uint8_t *)expected, 4);
+    assert(strncmp((const char *)expected, (const char *)test, 4) == 0);
+    assert(ret == 4);
+
+    /* read/write at end of EEPROM */
+    ret = eeprom_write(EEPROM_SIZE - 4, (uint8_t *)test, 4);
+    assert(ret == 4);
+    ret = eeprom_read(EEPROM_SIZE - 4, (uint8_t *)expected, 4);
+    assert(strncmp((const char *)expected, test, 4) == 0);
+    assert(ret == 4);
+
+    /* read/write single byte */
+    eeprom_write_byte(0, 'A');
+    assert(eeprom_read_byte(0) == 'A');
+    eeprom_write_byte(EEPROM_SIZE - 1, 'A');
+    assert(eeprom_read_byte(EEPROM_SIZE - 1) == 'A');
+    eeprom_write_byte(EEPROM_SIZE / 2, 'A');
+    assert(eeprom_read_byte(EEPROM_SIZE / 2) == 'A');
+
+    puts("SUCCESS");
+    return 0;
+}
+
+
 static const shell_command_t shell_commands[] = {
     { "info", "Print information about eeprom", cmd_info },
     { "read", "Read bytes from eeprom", cmd_read },
-    { "write", "Write bytes to eeprom", cmd_write},
+    { "write", "Write bytes to eeprom", cmd_write },
+    { "read_byte", "Read a single byte from eeprom", cmd_read_byte },
+    { "write_byte", "Write a single byte to eeprom", cmd_write_byte },
+    { "test", "Test the EEPROM implementation", cmd_test },
     { NULL, NULL, NULL }
 };
 
-- 
GitLab