blob: 1b8ae1ad9a98bf9b56b7fb2747696f45a3abe52d [file] [log] [blame]
#include "Config.h"
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdarg.h>
#include "Bootstrap.h"
#include "InputStream.h"
#include "File.h"
#include "Str.h"
#include "system/System.h"
/**
* InputStream.c unit tests.
*/
#define DATA "./data/stream.data"
#define TIMEOUT 50
int main(void) {
int fd;
InputStream_T in = NULL;
Bootstrap(); // Need to initialize library
printf("============> Start InputStream Tests\n\n");
printf("=> Test0: create/destroy the file input stream\n");
{
in = InputStream_new(File_open(DATA, "r"));
assert(!InputStream_isClosed(in));
File_close(InputStream_getDescriptor(in));
InputStream_free(&in);
assert(in == NULL);
}
printf("=> Test0: OK\n\n");
printf("=> Test1: get/set timeout\n");
{
assert((fd = File_open(DATA, "r")) >= 0);
in = InputStream_new(fd);
printf("\tCurrent timeout: %ldms\n", InputStream_getTimeout(in));
InputStream_setTimeout(in, TIMEOUT);
assert(InputStream_getTimeout(in) == TIMEOUT);
printf("\tTimeout set to: %dms\n", TIMEOUT);
File_close(fd);
InputStream_free(&in);
}
printf("=> Test1: OK\n\n");
printf("=> Test2: read file by characters\n");
{
int byte;
int byteno = 0;
char content[][1] = {"l", "i", "n", "e", "1", "\n",
"l", "i", "n", "e", "2", "\n",
"l", "i", "n", "e", "3", "\n"};
assert((fd = File_open(DATA, "r")) >= 0);
in = InputStream_new(fd);
while ((byte = InputStream_read(in)) > 0) {
assert(byte == *content[byteno++]);
}
File_close(fd);
InputStream_free(&in);
}
printf("=> Test2: OK\n\n");
printf("=> Test3: read file by lines\n");
{
int lineno = 0;
char line[STRLEN];
char content[][STRLEN] = {"line1\n", "line2\n", "line3\n"};
assert((fd = File_open(DATA, "r")) >= 0);
in = InputStream_new(fd);
while (InputStream_readLine(in, line, sizeof(line))) {
assert(Str_isEqual(content[lineno++], line));
}
File_close(fd);
InputStream_free(&in);
}
printf("=> Test3: OK\n\n");
printf("=> Test4: read file by bytes\n");
{
char array[STRLEN];
char content[] = "line1\nline2\nline3\n";
memset(array, 0, STRLEN);
assert((fd = File_open(DATA, "r")) >= 0);
in = InputStream_new(fd);
while (InputStream_readBytes(in, array, sizeof(array)-1)) {
assert(Str_isEqual(content, array));
}
File_close(fd);
InputStream_free(&in);
}
printf("=> Test4: OK\n\n");
printf("=> Test5: read a large file\n");
{
if ((fd = File_open("/usr/share/dict/words", "r")) >= 0) {
int n = 0;
char array[2][STRLEN + 1];
in = InputStream_new(fd);
for (int i = 0; ((n = InputStream_readBytes(in, array[i], STRLEN)) > 0); i = i ? 0 : 1)
assert(strncmp(array[0], array[1], STRLEN/2) != 0); // ensure that InputStream buffer is filled anew
File_rewind(fd);
// Test read data larger than InputStream's internal buffer
int filesize = (int)File_size("/usr/share/dict/words");
char *bigarray = CALLOC(1, filesize + 1);
n = InputStream_readBytes(in, bigarray, filesize);
assert(n == filesize);
File_close(fd);
InputStream_free(&in);
FREE(bigarray);
} else
ERROR("\t/usr/share/dict/words not available -- skipping test\n");
}
printf("=> Test5: OK\n\n");
printf("=> Test6: wrong descriptor - expecting read fail\n");
{
in = InputStream_new(999);
TRY
assert(InputStream_read(in) != -1);
assert(false); // Should not come here
CATCH(AssertException)
// Passed
END_TRY;
InputStream_free(&in);
}
printf("=> Test6: OK\n\n");
printf("============> InputStream Tests: OK\n\n");
return 0;
}