summaryrefslogtreecommitdiffstats
path: root/tests/queue_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/queue_test.cpp')
-rw-r--r--tests/queue_test.cpp278
1 files changed, 0 insertions, 278 deletions
diff --git a/tests/queue_test.cpp b/tests/queue_test.cpp
deleted file mode 100644
index 28d06d8..0000000
--- a/tests/queue_test.cpp
+++ /dev/null
@@ -1,278 +0,0 @@
-#include <iostream>
-#include <string>
-#include <vector>
-#include <algorithm>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <termios.h>
-#include "raul/SRSWQueue.hpp"
-#include "raul/SRMWQueue.hpp"
-#include "raul/Thread.hpp"
-#include "raul/AtomicInt.hpp"
-
-using namespace std;
-using namespace Raul;
-
-static const unsigned NUM_DATA = 10;
-static const unsigned QUEUE_SIZE = 1024*1024;
-static const unsigned NUM_WRITERS = 2;
-static const unsigned PUSHES_PER_ITERATION = 2;
-
-// Data to read/write using actions pumped through the queue
-struct Record {
- Record() : read_count(0), write_count(0) {}
-
- AtomicInt read_count;
- AtomicInt write_count;
-};
-
-Record data[NUM_DATA];
-
-
-// Actions pumped through the queue to manipulate data
-struct WriteAction {
- WriteAction(unsigned idx)
- : index(idx)/*, has_read(false)*/ {}
-
- inline void read() const {
- //cout << "READ " << index << "\r\n";
- //assert(!has_read);
- ++(data[index].read_count);
- //has_read = true;
- };
-
- unsigned index;
- //bool has_read;
-};
-
-
-// The victim
-SRMWQueue<WriteAction> queue(QUEUE_SIZE);
-
-
-class WriteThread : public Thread {
-protected:
- void _run() {
-
- cout << "Writer starting.\r\n";
-
- // Wait for everything to get ready
- sleep(2);
-
- while (true) {
- for (unsigned j=0; j < PUSHES_PER_ITERATION; ++j) {
- unsigned i = rand() % NUM_DATA;
- if (queue.push(WriteAction(i))) {
- ++(data[i].write_count);
- //cout << "WRITE " << i << "\r\n";
- } else {
- cerr << "FAILED WRITE\r\n";
- }
- }
-
- // FIXME: remove!
- //if (rand() % 20)
- // usleep(1);
-
- // This thread will never cancel without this here since
- // all the stuff about is cancellation point free
- // (good! RT safe)
- pthread_testcancel();
- }
-
- cout << "Writer exiting." << endl;
- }
-};
-
-
-// Returns 0 if all read count/write count pairs are equal,
-// otherwise how far off total count was
-unsigned
-data_is_sane()
-{
- unsigned ret = 0;
- for (unsigned i=0; i < NUM_DATA; ++i) {
- unsigned diff = abs(data[i].read_count.get() - data[i].write_count.get());
- ret += diff;
- }
-
- return ret;
-}
-
-
-void
-dump_data()
-{
- for (unsigned i=0; i < NUM_DATA; ++i) {
- cout << i << ":\t" << data[i].read_count.get()
- << "\t : \t" << data[i].write_count.get();
- if (data[i].read_count.get() == data[i].write_count.get())
- cout << "\t OK" << endl;
- else
- cout << "\t FAIL" << endl;
- }
-}
-
-
-
-int main()
-{
- unsigned long total_processed = 0;
-
- cout << "Testing size" << endl;
- for (unsigned i=0; i < queue.capacity(); ++i) {
- queue.push(i);
- if (i == queue.capacity()-1) {
- if (!queue.full()) {
- cerr << "ERROR: Should be full at " << i
- << " (size " << queue.capacity() << ")" << endl;
- return -1;
- }
- } else {
- if (queue.full()) {
- cerr << "ERROR: Prematurely full at " << i
- << " (size " << queue.capacity() << ")" << endl;
- return -1;
- }
- }
- }
-
- for (unsigned i=0; i < queue.capacity(); ++i)
- queue.pop();
-
- if (!queue.empty()) {
- cerr << "ERROR: Should be empty" << endl;
- return -1;
- }
-
- cout << "Testing concurrent reading/writing" << endl;
- vector<WriteThread*> writers(NUM_WRITERS, new WriteThread());
-
- struct termios orig_term;
- struct termios raw_term;
-
- cfmakeraw(&raw_term);
- if (tcgetattr(0, &orig_term) != 0) return 1; //save terminal settings
- if (tcsetattr(0, TCSANOW, &raw_term) != 0) return 1; //set to raw
- fcntl(0, F_SETFL, O_NONBLOCK); //set to nonblocking IO on stdin
-
-
- for (unsigned i=0; i < NUM_WRITERS; ++i) {
- writers[i]->set_name(string("Writer ") + (char)('0' + i));
- writers[i]->start();
- }
-
- // Read
- while (getchar() == -1) {
- unsigned count = 0;
- while (count < queue.capacity() && !queue.empty()) {
- WriteAction action = queue.front();
- queue.pop();
- action.read();
- ++count;
- ++total_processed;
- }
-
- /*if (count > 0)
- cout << "Processed " << count << " requests\t\t"
- << "(total " << total_processed << ")\r\n";*/
-
- //if (total_processed > 0 && total_processed % 128l == 0)
- // cout << "Total processed: " << total_processed << "\r\n";
- }
-
- if (tcsetattr(0, TCSANOW, &orig_term) != 0) return 1; //restore
-
- cout << "Finishing." << endl;
-
- // Stop the writers
- for (unsigned i=0; i < NUM_WRITERS; ++i)
- writers[i]->stop();
-
- cout << "\n\n****************** DONE *********************\n\n";
-
- unsigned leftovers = 0;
-
- // Drain anything left in the queue
- while (!queue.empty()) {
- WriteAction action = queue.front();
- queue.pop();
- action.read();
- leftovers++;
- ++total_processed;
- }
-
- if (leftovers > 0)
- cout << "Processed " << leftovers << " leftovers." << endl;
-
-
- cout << "\n\n*********************************************\n\n";
-
- cout << "Total processed: " << total_processed << endl;
- if (total_processed > INT_MAX)
- cout << "(Counter had to wrap)" << endl;
- else
- cout << "(Counter did NOT have to wrap)" << endl;
-
-
- unsigned diff = data_is_sane();
-
- if (diff == 0) {
- cout << "PASS" << endl;
- } else {
- cout << "FAILED BY " << diff << endl;
- // dump_data();
- }
-
- dump_data();
-
- return 0;
-}
-
-
-#if 0
-int main()
-{
- //SRSWQueue<int> q(10);
- SRMWQueue<int> q(10);
-
- cout << "New queue. Should be empty: " << q.empty() << endl;
- cout << "Capacity: " << q.capacity() << endl;
- //cout << "Fill: " << q.fill() << endl;
-
- for (uint i=0; i < 5; ++i) {
- q.push(i);
- assert(!q.full());
- q.pop();
- }
- cout << "Pushed and popped 5 elements. Queue should be empty: " << q.empty() << endl;
- //cout << "Fill: " << q.fill() << endl;
-
- for (uint i=10; i < 20; ++i) {
- assert(q.push(i));
- }
- cout << "Pushed 10 elements. Queue should be full: " << q.full() << endl;
- //cout << "Fill: " << q.fill() << endl;
-
- cout << "The digits 10->19 should print: " << endl;
- while (!q.empty()) {
- int foo = q.front();
- q.pop();
- cout << "Popped: " << foo << endl;
- }
- cout << "Queue should be empty: " << q.empty() << endl;
- //cout << "Fill: " << q.fill() << endl;
-
- cout << "Attempting to add eleven elements to queue of size 10. Only first 10 should succeed:" << endl;
- for (uint i=20; i <= 39; ++i) {
- cout << i;
- //cout << " - Fill: " << q.fill();
- cout << " - full: " << q.full();
- cout << ", succeeded: " << q.push(i) << endl;
- }
-
- return 0;
-}
-#endif
-