Exemple #1
0
int main(int argc, const char *argv[])
{
    fd_set allreads;
    fd_set readmask;

    int socket = 0;
    int rc = 0;
    RingBuffer *in_rb = RingBuffer_create(1024 * 10);
    RingBuffer *sock_rb = RingBuffer_create(1024 * 10);

    check(argc == 3, "USAGE: netclient HOST PORT");

    socket = client_connect(argv[1], argv[2]);
    check(socket >= 0, "Connect to %s:%s failed.", argv[1], argv[2]);

    FD_ZERO(&allreads);
    FD_SET(socket, &allreads);
    FD_SET(0, &allreads);

    while(1) {
        readmask = allreads;
        rc = select(socket + 1, &readmask, NULL, NULL, NULL);
        check(rc >= 0, "Select failed");

        if(FD_ISSET(0, &readmask)) {
            rc = read_some(in_rb, 0, 0);
            check_debug(rc != -1, "failed to read from stdin.");
        }

        if(FD_ISSET(socket, &readmask)) {
            rc = read_some(sock_rb, socket, 0);
            check_debug(rc != -1, "failed to read from socket.");
        }

        while(!RingBuffer_empty(sock_rb)) {
            rc = write_some(sock_rb, 1, 0);
            check_debug(rc != -1, "failed to write to stdout.");
        }

        while(!RingBuffer_empty(in_rb)) {
            rc = write_some(in_rb, socket, 1);
            check_debug(rc != -1, "failed to write to socket.");
        }

    }

    RingBuffer_destroy(in_rb);
    RingBuffer_destroy(sock_rb);

    return 0;

error:
    return -1;
}
char *test_read_write()
{
    mu_assert(RingBuffer_empty(buffer), "Should be empty when nothing in it.");

    bstring string = bfromcstr("test string1");
    RingBuffer_puts(buffer,  string);

    mu_assert(!RingBuffer_empty(buffer), "Should have stored string.");
    bstring result = RingBuffer_gets(buffer, sizeof(bdata(string)));

    mu_assert(bstrcmp(string, result), "Strings should be the same.");

    return NULL;
}
char *test_create()
{
  rbuf = RingBuffer_create(64);
  mu_assert(rbuf != NULL, "Failed to create RingBuffer");
  mu_assert(RingBuffer_empty(rbuf) == 1, "RingBuffer not empty");
  mu_assert(rbuf->start == 0, "RingBuffer start is not 0");
  mu_assert(rbuf->end == 0, "RingBuffer end is not 0");
  mu_assert(RingBuffer_available_space(rbuf) == 64, "RingBuffer space not correct");

  return NULL;
}
char *test_read_write()
{
  RingBuffer_puts(rbuf, &test_data_0);
  mu_assert(rbuf->end == 6, "ends at not reset correctly");
  mu_assert(RingBuffer_empty(rbuf) == 0, "not actually empty");

  RingBuffer_puts(rbuf, &test_data_1);
  mu_assert(rbuf->end == 34, "ends at not reset correctly");

  char *data_1 = malloc(sizeof(char) * 6);
  RingBuffer_read(rbuf, data_1, 6);
  mu_assert(bstrcmp(bfromcstr(data_1), &test_data_0) == 0,
            "read did not return proper string"
           );
  mu_assert(rbuf->start == 6, "did not reset start correctly");

  char *data_2 = malloc(sizeof(char) * 28);
  RingBuffer_read(rbuf, data_2, 28);
  mu_assert(bstrcmp(bfromcstr(data_2), &test_data_1) == 0,
            "read did not return proper string"
           );
  mu_assert(rbuf->start == 0, "did not reset start correctly");
  mu_assert(rbuf->end == 0, "did not reset end correctly");


  RingBuffer_puts(rbuf, &test_data_2);
  RingBuffer_puts(rbuf, &test_data_3);
  mu_assert(rbuf->start == 0, "start not maintained");
  mu_assert(rbuf->end == 64, "end not set correctly");
  mu_assert(RingBuffer_full(rbuf) == 1, "RingBuffer actually full");
  mu_assert(RingBuffer_available_space(rbuf) == 0, "RingBuffer has no space");
  mu_assert(RingBuffer_available_data(rbuf) == 64, "RingBuffer has wrong available data");

  bstring data_3 = RingBuffer_get_all(rbuf);
  bstring expected = bformat("%s%s", bdata(&test_data_2), bdata(&test_data_3));
  mu_assert(bstrcmp(data_3, expected) == 0, "data not returned correctly");
  mu_assert(RingBuffer_empty(rbuf) == 1, "RingBuffer should be empty");

  return NULL;
}
Exemple #5
0
/**
 * @brief Gets a byte from ring buffer
 * @return the oldest byte
 * Does not block. Ring buffer shold not be empty.
 */
uint8_t RingBuffer_get(struct RingBuffer *self)
{
	assert(!RingBuffer_empty(self));

	uint8_t tmp;
	tmp = self->buff[self->end++];
	self->end %= BUFF_SIZE;

	if (self->start == self->end)
		self->empty = true;


	return tmp;
}