diff --git a/.travis.yml b/.travis.yml
index 5aefc0db8..7f92c751c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -163,3 +163,4 @@ env:
- BUILD_TYPE='llsec' MAKE_TARGETS='cooja'
- BUILD_TYPE='compile-avr' BUILD_CATEGORY='compile' BUILD_ARCH='avr-rss2'
- BUILD_TYPE='ieee802154'
+ - BUILD_TYPE='tsch'
diff --git a/core/lib/ringbufindex.c b/core/lib/ringbufindex.c
index 0b2149ff7..a30e85f74 100644
--- a/core/lib/ringbufindex.c
+++ b/core/lib/ringbufindex.c
@@ -83,7 +83,7 @@ ringbufindex_peek_put(const struct ringbufindex *r)
if(((r->put_ptr - r->get_ptr) & r->mask) == r->mask) {
return -1;
}
- return (r->put_ptr + 1) & r->mask;
+ return r->put_ptr;
}
/* Remove the first element and return its index */
int
@@ -118,7 +118,7 @@ ringbufindex_peek_get(const struct ringbufindex *r)
first one. If there are no bytes left, we return -1.
*/
if(((r->put_ptr - r->get_ptr) & r->mask) > 0) {
- return (r->get_ptr + 1) & r->mask;
+ return r->get_ptr;
} else {
return -1;
}
diff --git a/core/lib/ringbufindex.h b/core/lib/ringbufindex.h
index c39f99d18..6fa07b966 100644
--- a/core/lib/ringbufindex.h
+++ b/core/lib/ringbufindex.h
@@ -48,25 +48,72 @@ struct ringbufindex {
uint8_t put_ptr, get_ptr;
};
-/* Initialize a ring buffer. The size must be a power of two */
+/**
+ * \brief Initialize a ring buffer. The size must be a power of two
+ * \param r Pointer to ringbufindex
+ * \param size Size of ring buffer
+ */
void ringbufindex_init(struct ringbufindex *r, uint8_t size);
-/* Put one element to the ring buffer */
+
+/**
+ * \brief Put one element to the ring buffer
+ * \param r Pointer to ringbufindex
+ * \retval 0 Failure; the ring buffer is full
+ * \retval 1 Success; an element is added
+ */
int ringbufindex_put(struct ringbufindex *r);
-/* Check if there is space to put an element.
- * Return the index where the next element is to be added */
+
+/**
+ * \brief Check if there is space to put an element.
+ * \param r Pinter to ringbufindex
+ * \retval >= 0 The index where the next element is to be added.
+ * \retval -1 Failure; the ring buffer is full
+ */
int ringbufindex_peek_put(const struct ringbufindex *r);
-/* Remove the first element and return its index */
+
+/**
+ * \brief Remove the first element and return its index
+ * \param r Pinter to ringbufindex
+ * \retval >= 0 The index of the first element
+ * \retval -1 No element in the ring buffer
+ */
int ringbufindex_get(struct ringbufindex *r);
-/* Return the index of the first element
- * (which will be removed if calling ringbufindex_peek) */
+
+/**
+ * \brief Return the index of the first element which will be removed if calling
+ * ringbufindex_get.
+ * \param r Pinter to ringbufindex
+ * \retval >= 0 The index of the first element
+ * \retval -1 No element in the ring buffer
+ */
int ringbufindex_peek_get(const struct ringbufindex *r);
-/* Return the ring buffer size */
+
+/**
+ * \brief Return the ring buffer size
+ * \param r Pinter to ringbufindex
+ * \return The size of the ring buffer
+ */
int ringbufindex_size(const struct ringbufindex *r);
-/* Return the number of elements currently in the ring buffer */
+
+/**
+ * \brief Return the number of elements currently in the ring buffer.
+ * \param r Pinter to ringbufindex
+ * \return The number of elements in the ring buffer
+ */
int ringbufindex_elements(const struct ringbufindex *r);
-/* Is the ring buffer full? */
+
+/**
+ * \brief Is the ring buffer full?
+ * \retval 0 Not full
+ * \retval 1 Full
+ */
int ringbufindex_full(const struct ringbufindex *r);
-/* Is the ring buffer empty? */
+
+/**
+ * \brief Is the ring buffer empty?
+ * \retval 0 Not empty
+ * \retval 1 Empty
+ */
int ringbufindex_empty(const struct ringbufindex *r);
#endif /* __RINGBUFINDEX_H__ */
diff --git a/regression-tests/03-base/04-ringbufindex.csc b/regression-tests/03-base/04-ringbufindex.csc
new file mode 100644
index 000000000..bdc2cc3ab
--- /dev/null
+++ b/regression-tests/03-base/04-ringbufindex.csc
@@ -0,0 +1,148 @@
+
+
+ [APPS_DIR]/mrm
+ [APPS_DIR]/mspsim
+ [APPS_DIR]/avrora
+ [APPS_DIR]/serial_socket
+ [APPS_DIR]/collect-view
+ [APPS_DIR]/powertracker
+ [APPS_DIR]/radiologger-headless
+
+ Test ringbufindex
+ 123456
+ 1000000
+
+ org.contikios.cooja.radiomediums.UDGM
+ 50.0
+ 100.0
+ 1.0
+ 1.0
+
+
+ 40000
+
+
+ org.contikios.cooja.contikimote.ContikiMoteType
+ mtype297
+ ringbufindex testee
+
+ make test-ringbufindex.cooja TARGET=cooja
+ org.contikios.cooja.interfaces.Position
+ org.contikios.cooja.interfaces.Battery
+ org.contikios.cooja.contikimote.interfaces.ContikiVib
+ org.contikios.cooja.contikimote.interfaces.ContikiMoteID
+ org.contikios.cooja.contikimote.interfaces.ContikiRS232
+ org.contikios.cooja.contikimote.interfaces.ContikiBeeper
+ org.contikios.cooja.interfaces.RimeAddress
+ org.contikios.cooja.contikimote.interfaces.ContikiIPAddress
+ org.contikios.cooja.contikimote.interfaces.ContikiRadio
+ org.contikios.cooja.contikimote.interfaces.ContikiButton
+ org.contikios.cooja.contikimote.interfaces.ContikiPIR
+ org.contikios.cooja.contikimote.interfaces.ContikiClock
+ org.contikios.cooja.contikimote.interfaces.ContikiLED
+ org.contikios.cooja.contikimote.interfaces.ContikiCFS
+ org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
+ org.contikios.cooja.interfaces.Mote2MoteRelations
+ org.contikios.cooja.interfaces.MoteAttributes
+ false
+
+
+
+ org.contikios.cooja.interfaces.Position
+ 0.0
+ 0.0
+ 0.0
+
+
+ org.contikios.cooja.contikimote.interfaces.ContikiMoteID
+ 1
+
+
+ org.contikios.cooja.contikimote.interfaces.ContikiRadio
+ 250.0
+
+
+ org.contikios.cooja.contikimote.interfaces.ContikiEEPROM
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
+
+ mtype297
+
+
+
+ org.contikios.cooja.plugins.SimControl
+ 280
+ 1
+ 160
+ 400
+ 0
+
+
+ org.contikios.cooja.plugins.Visualizer
+
+ true
+ org.contikios.cooja.plugins.skins.IDVisualizerSkin
+ org.contikios.cooja.plugins.skins.GridVisualizerSkin
+ org.contikios.cooja.plugins.skins.TrafficVisualizerSkin
+ org.contikios.cooja.plugins.skins.UDGMVisualizerSkin
+ 0.9090909090909091 0.0 0.0 0.9090909090909091 194.0 173.0
+
+ 400
+ 4
+ 400
+ 1
+ 1
+
+
+ org.contikios.cooja.plugins.LogListener
+
+
+
+
+
+ 1320
+ 3
+ 240
+ 400
+ 160
+
+
+ org.contikios.cooja.plugins.TimeLine
+
+ 0
+
+
+
+ 500.0
+
+ 1720
+ 2
+ 166
+ 0
+ 957
+
+
+ org.contikios.cooja.plugins.Notes
+
+ Enter notes here
+ true
+
+ 1040
+ 5
+ 160
+ 680
+ 0
+
+
+ org.contikios.cooja.plugins.ScriptRunner
+
+ [CONTIKI_DIR]/regression-tests/03-base/js/04-ringbufindex.js
+ true
+
+ 495
+ 0
+ 525
+ 663
+ 105
+
+
+
diff --git a/regression-tests/03-base/code/Makefile b/regression-tests/03-base/code/Makefile
new file mode 100644
index 000000000..2445ab386
--- /dev/null
+++ b/regression-tests/03-base/code/Makefile
@@ -0,0 +1,8 @@
+all: test-ringbufindex
+
+CFLAGS += -D PROJECT_CONF_H=\"project-conf.h\"
+APPS += unit-test
+
+CONTIKI = ../../..
+CONTIKI_WITH_IPV6 = 1
+include $(CONTIKI)/Makefile.include
diff --git a/regression-tests/03-base/code/project-conf.h b/regression-tests/03-base/code/project-conf.h
new file mode 100644
index 000000000..a7683dbb5
--- /dev/null
+++ b/regression-tests/03-base/code/project-conf.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2017, Yasuyuki Tanaka
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _PROJECT_CONF_H_
+#define _PROJECT_CONF_H_
+
+#define UNIT_TEST_PRINT_FUNCTION test_print_report
+
+#endif /* !_PROJECT_CONF_H_ */
diff --git a/regression-tests/03-base/code/test-ringbufindex.c b/regression-tests/03-base/code/test-ringbufindex.c
new file mode 100644
index 000000000..0f9d1c701
--- /dev/null
+++ b/regression-tests/03-base/code/test-ringbufindex.c
@@ -0,0 +1,366 @@
+/*
+ * Copyright (c) 2017, Yasuyuki Tanaka
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include
+
+#include "contiki.h"
+#include "unit-test.h"
+
+#include "lib/ringbufindex.h"
+
+PROCESS(test_process, "ringbuf-index.c test");
+AUTOSTART_PROCESSES(&test_process);
+
+static struct ringbufindex ri;
+static const uint8_t ri_size = 2;
+
+static void
+test_print_report(const unit_test_t *utp)
+{
+ printf("=check-me= ");
+ if(utp->result == unit_test_failure) {
+ printf("FAILED - %s: exit at L%u\n", utp->descr, utp->exit_line);
+ } else {
+ printf("SUCCEEDED - %s\n", utp->descr);
+ }
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_init, "Init");
+UNIT_TEST(test_ringbufindex_init)
+{
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ UNIT_TEST_ASSERT(ri.mask == ri_size - 1 &&
+ ri.put_ptr == 0 &&
+ ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_put, "Put");
+UNIT_TEST(test_ringbufindex_put)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /*
+ * This one must fail because the ringbuf is full. The ringbuf can have one
+ * item (size - 1) at most.
+ */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_peek_put, "PeekPut");
+UNIT_TEST(test_ringbufindex_peek_put)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Get index for the first item */
+ ret = ringbufindex_peek_put(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get index for the second item; should be -1 because it's full */
+ ret = ringbufindex_peek_put(&ri);
+ UNIT_TEST_ASSERT(ret == -1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_get, "Get");
+UNIT_TEST(test_ringbufindex_get)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Get the first item; it's been not put yet. */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == -1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get the first item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Put the second item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get the second item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_peek_get, "PeekGet");
+UNIT_TEST(test_ringbufindex_peek_get)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Get the index of the first item; it's been not put yet. */
+ ret = ringbufindex_peek_get(&ri);
+ UNIT_TEST_ASSERT(ret == -1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get the index of the first item */
+ ret = ringbufindex_peek_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get and remove the first item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Put the second item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get the index of the second item */
+ ret = ringbufindex_peek_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get and remove the second item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_size, "Size");
+UNIT_TEST(test_ringbufindex_size)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ ret = ringbufindex_size(&ri);
+ UNIT_TEST_ASSERT(ret == ri_size);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_elements, "Elements");
+UNIT_TEST(test_ringbufindex_elements)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Nothing in ringbuf */
+ ret = ringbufindex_elements(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* One item in ringbuf */
+ ret = ringbufindex_elements(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get the first item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Nothing in ringbuf */
+ ret = ringbufindex_elements(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Put the second item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* One item in ringbuf */
+ ret = ringbufindex_elements(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get the second item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Nothing in ringbuf */
+ ret = ringbufindex_elements(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_full, "Full");
+UNIT_TEST(test_ringbufindex_full)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Nothing in ringbuf; not full */
+ ret = ringbufindex_full(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* One item in ringbuf; full */
+ ret = ringbufindex_full(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get the first item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Nothing in ringbuf; not full */
+ ret = ringbufindex_full(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Put the second item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* One item in ringbuf; full */
+ ret = ringbufindex_full(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get the second item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Nothing in ringbuf; not full */
+ ret = ringbufindex_full(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+UNIT_TEST_REGISTER(test_ringbufindex_empty, "Empty");
+UNIT_TEST(test_ringbufindex_empty)
+{
+ int ret;
+
+ UNIT_TEST_BEGIN();
+
+ ringbufindex_init(&ri, ri_size);
+
+ /* Nothing in ringbuf; empty */
+ ret = ringbufindex_empty(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Put the first item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* One item in ringbuf; not empty */
+ ret = ringbufindex_empty(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 0);
+
+ /* Get the first item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Nothing in ringbuf; empty */
+ ret = ringbufindex_empty(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 1 && ri.get_ptr == 1);
+
+ /* Put the second item */
+ ret = ringbufindex_put(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* One item in ringbuf; not empty */
+ ret = ringbufindex_empty(&ri);
+ UNIT_TEST_ASSERT(ret == 0 && ri.put_ptr == 0 && ri.get_ptr == 1);
+
+ /* Get the second item */
+ ret = ringbufindex_get(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ /* Nothing in ringbuf; empty */
+ ret = ringbufindex_empty(&ri);
+ UNIT_TEST_ASSERT(ret == 1 && ri.put_ptr == 0 && ri.get_ptr == 0);
+
+ UNIT_TEST_END();
+}
+
+PROCESS_THREAD(test_process, ev, data)
+{
+ PROCESS_BEGIN();
+ printf("Run unit-test\n");
+ printf("---\n");
+
+ UNIT_TEST_RUN(test_ringbufindex_init);
+ UNIT_TEST_RUN(test_ringbufindex_put);
+ UNIT_TEST_RUN(test_ringbufindex_peek_put);
+ UNIT_TEST_RUN(test_ringbufindex_get);
+ UNIT_TEST_RUN(test_ringbufindex_peek_get);
+ UNIT_TEST_RUN(test_ringbufindex_size);
+ UNIT_TEST_RUN(test_ringbufindex_elements);
+ UNIT_TEST_RUN(test_ringbufindex_full);
+ UNIT_TEST_RUN(test_ringbufindex_empty);
+
+ printf("=check-me= DONE\n");
+ PROCESS_END();
+}
diff --git a/regression-tests/03-base/js/04-ringbufindex.js b/regression-tests/03-base/js/04-ringbufindex.js
new file mode 100644
index 000000000..153f920af
--- /dev/null
+++ b/regression-tests/03-base/js/04-ringbufindex.js
@@ -0,0 +1,26 @@
+TIMEOUT(10000, log.testFailed());
+
+var failed = false;
+
+while(true) {
+ YIELD();
+
+ log.log(time + " " + "node-" + id + " "+ msg + "\n");
+
+ if(msg.contains("=check-me=") == false) {
+ continue;
+ }
+
+ if(msg.contains("FAILED")) {
+ failed = true;
+ }
+
+ if(msg.contains("DONE")) {
+ break;
+ }
+}
+if(failed) {
+ log.testFailed();
+}
+log.testOK();
+