Browse Source

faux.buf: Unfinished tests

Serj Kalichev 3 years ago
parent
commit
f385158da8
3 changed files with 330 additions and 11 deletions
  1. 14 11
      faux/buf/buf.c
  2. 312 0
      faux/buf/testc_buf.c
  3. 4 0
      faux/testc_module/testc_module.c

+ 14 - 11
faux/buf/buf.c

@@ -464,21 +464,24 @@ ssize_t faux_buf_dread_unlock(faux_buf_t *buf, size_t really_readed,
 		must_be_read -= data_to_rm;
 
 		// Current chunk was fully readed. So remove it from list.
-		if (
-			// Chunk is not wchunk
-			((iter != buf->wchunk) &&
-			(buf->rpos == buf->chunk_size)) ||
-			// Chunk is wchunk
-			((iter == buf->wchunk) &&
-			(buf->rpos == buf->wpos) &&
-			(!buf->wlocked)) // Chunk can be locked for writing
-			) {
+		// Chunk is not wchunk
+		if ((iter != buf->wchunk) &&
+			(buf->rpos == buf->chunk_size)) {
 			buf->rpos = 0; // 0 position within next chunk
 			faux_list_del(buf->list, iter);
-		}
-		if (faux_buf_chunk_num(buf) == 0) { // Empty list w/o locks
+			if (faux_buf_chunk_num(buf) == 0) { // Empty list w/o locks
+				buf->wchunk = NULL;
+				buf->wpos = buf->chunk_size;
+			}
+		// Chunk is wchunk
+		} else if ((iter == buf->wchunk) &&
+			(buf->rpos == buf->wpos) &&
+			(!buf->wlocked ||  // Chunk can be locked for writing
+			(buf->wpos == buf->chunk_size))) { // Chunk can be filled
+			buf->rpos = 0; // 0 position within next chunk
 			buf->wchunk = NULL;
 			buf->wpos = buf->chunk_size;
+			faux_list_del(buf->list, iter);
 		}
 	}
 

+ 312 - 0
faux/buf/testc_buf.c

@@ -214,3 +214,315 @@ int testc_faux_buf_boundaries(void)
 
 	return 0;
 }
+
+
+int testc_faux_buf_direct(void)
+{
+//	char *src_fn = NULL;
+//	char *dst_fn = NULL;
+	ssize_t len = 0;
+	char *rnd = NULL;
+	char *dst = NULL;
+	faux_buf_t *buf = NULL;
+	ssize_t chunk_num = 0;
+	ssize_t e_chunk_num = 0;
+	ssize_t res = 0;
+	ssize_t wlocked = 0;
+	struct iovec *iov = NULL;
+	size_t iov_num = 0;
+	struct iovec *riov = NULL;
+	size_t riov_num = 0;
+	ssize_t bytes_readed = 0;
+
+	// Prepare files
+	len = CHUNK * 3;
+	e_chunk_num = 3;
+	rnd = faux_testc_rnd_buf(len);
+//	src_fn = faux_testc_tmpfile_deploy(rnd, len);
+
+	// Create buf
+	printf("faux_buf_new()\n");
+	buf = faux_buf_new(CHUNK);
+	if (!buf) {
+		fprintf(stderr, "faux_buf_new() error\n");
+		return -1;
+	}
+
+	// Write to buffer
+	printf("faux_buf_write() len - CHUNK\n");
+	if ((res = faux_buf_write(buf, rnd, len - CHUNK)) != (len - CHUNK)) {
+		fprintf(stderr, "faux_buf_write() error %ld\n", res);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 2) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 2);
+		return -1;
+	}
+
+	// Lock buffer for writing
+	printf("faux_buf_dwrite_lock()\n");
+	if ((wlocked = faux_buf_dwrite_lock(buf, len + 15, &iov, &iov_num)) != (len + 15)) {
+		fprintf(stderr, "faux_buf_dwrite_lock() error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 6) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 6);
+		return -1;
+	}
+
+	// Buf read
+	dst = faux_malloc(len);
+	if (!dst) {
+		fprintf(stderr, "faux_malloc() error\n");
+		return -1;
+	}
+
+	printf("faux_buf_dread_lock()\n");
+	if ((bytes_readed = faux_buf_dread_lock(buf, len, &riov, &riov_num)) != (len - CHUNK)) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need %ld, readed %ld\n",
+			len, bytes_readed);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 6) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 6);
+		return -1;
+	}
+
+	printf("faux_buf_dread_ulock() must be -1\n");
+	if ((bytes_readed = faux_buf_dread_unlock(buf, len, riov)) >= 0) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need -1, readed %ld\n",
+			bytes_readed);
+		return -1;
+	}
+
+	printf("faux_buf_dread_ulock()\n");
+	if ((bytes_readed = faux_buf_dread_unlock(buf, len - CHUNK, riov)) != (len - CHUNK)) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need %ld, readed %ld\n",
+			len, bytes_readed);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != (e_chunk_num + 1)) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%ld\n",
+			chunk_num, e_chunk_num + 1);
+		return -1;
+	}
+
+	// Unlock buffer for writing
+	printf("faux_buf_dwrite_unlock()\n");
+	if ((wlocked = faux_buf_dwrite_unlock(buf, len, iov)) != (len)) {
+		fprintf(stderr, "faux_buf_dwrite_unlock() error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 3) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 3);
+		return -1;
+	}
+
+	printf("faux_buf_read()\n");
+	if ((bytes_readed = faux_buf_read(buf, dst, len)) != len) {
+		fprintf(stderr, "faux_buf_read() error. need %ld, readed %ld\n",
+			len, bytes_readed);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 0) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 0);
+		return -1;
+	}
+
+	printf("faux_buf_write() CHUNK\n");
+	if (faux_buf_write(buf, rnd, CHUNK + 15) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_write() the rest error\n");
+		return -1;
+	}
+
+	// Buf length
+	printf("faux_buf_len()\n");
+	if (faux_buf_len(buf) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_len() error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 2) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 2);
+		return -1;
+	}
+
+	// Buf read
+	printf("faux_buf_read()\n");
+	if (faux_buf_read(buf, dst, len) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_read() error\n");
+		return -1;
+	}
+
+	// Buf length == 0
+	printf("faux_buf_len() 2\n");
+	if (faux_buf_len(buf) != 0) {
+		fprintf(stderr, "faux_buf_len() is not 0: error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 0) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 0);
+		return -1;
+	}
+
+	faux_free(dst);
+	faux_buf_free(buf);
+
+	return 0;
+}
+
+
+int testc_faux_buf_dwrite_unlock0(void)
+{
+//	char *src_fn = NULL;
+//	char *dst_fn = NULL;
+	ssize_t len = 0;
+	char *rnd = NULL;
+	char *dst = NULL;
+	faux_buf_t *buf = NULL;
+	ssize_t chunk_num = 0;
+	ssize_t res = 0;
+	ssize_t wlocked = 0;
+	struct iovec *iov = NULL;
+	size_t iov_num = 0;
+	struct iovec *riov = NULL;
+	size_t riov_num = 0;
+	ssize_t bytes_readed = 0;
+
+	// Prepare files
+	len = CHUNK * 3;
+	rnd = faux_testc_rnd_buf(len);
+//	src_fn = faux_testc_tmpfile_deploy(rnd, len);
+
+	// Create buf
+	printf("faux_buf_new()\n");
+	buf = faux_buf_new(CHUNK);
+	if (!buf) {
+		fprintf(stderr, "faux_buf_new() error\n");
+		return -1;
+	}
+
+	// Write to buffer
+	printf("faux_buf_write() len - CHUNK\n");
+	if ((res = faux_buf_write(buf, rnd, CHUNK + 15)) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_write() error %ld\n", res);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 2) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 2);
+		return -1;
+	}
+
+	// Lock buffer for writing
+	printf("faux_buf_dwrite_lock()\n");
+	if ((wlocked = faux_buf_dwrite_lock(buf, len, &iov, &iov_num)) != len) {
+		fprintf(stderr, "faux_buf_dwrite_lock() error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 5) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 5);
+		return -1;
+	}
+
+	// Buf read
+	dst = faux_malloc(len);
+	if (!dst) {
+		fprintf(stderr, "faux_malloc() error\n");
+		return -1;
+	}
+
+	printf("faux_buf_dread_lock()\n");
+	if ((bytes_readed = faux_buf_dread_lock(buf, len, &riov, &riov_num)) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need %d, readed %ld\n",
+			CHUNK + 15, bytes_readed);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 5) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 5);
+		return -1;
+	}
+
+	printf("faux_buf_dread_ulock() must be -1\n");
+	if ((bytes_readed = faux_buf_dread_unlock(buf, len, riov)) >= 0) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need -1, readed %ld\n",
+			bytes_readed);
+		return -1;
+	}
+
+	printf("faux_buf_dread_ulock()\n");
+	if ((bytes_readed = faux_buf_dread_unlock(buf, CHUNK + 15, riov)) != (CHUNK + 15)) {
+		fprintf(stderr, "faux_buf_dread_lock() error. need %ld, readed %ld\n",
+			len, bytes_readed);
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 4) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 4);
+		return -1;
+	}
+
+	// Unlock buffer for writing
+	printf("faux_buf_dwrite_unlock() with 0 len\n");
+	if ((wlocked = faux_buf_dwrite_unlock(buf, 0, iov)) != (len)) {
+		fprintf(stderr, "faux_buf_dwrite_unlock() error\n");
+		return -1;
+	}
+
+	// Buf chunk num
+	printf("faux_buf_chunk_num()\n");
+	if ((chunk_num = faux_buf_chunk_num(buf)) != 0) {
+		fprintf(stderr, "faux_buf_chunk_num() error. num=%ld e=%d\n",
+			chunk_num, 0);
+		return -1;
+	}
+
+	faux_free(dst);
+	faux_buf_free(buf);
+
+	return 0;
+}

+ 4 - 0
faux/testc_module/testc_module.c

@@ -10,6 +10,7 @@ const char *testc_module[][2] = {
 //	{"testc_faux_ini_signal", "Interrupted by signal"}, // demo
 //	{"testc_faux_ini_good", "INI subsystem good"}, // demo
 
+#if 0
 	// base
 	{"testc_faux_filesize", "Get size of filesystem object"},
 
@@ -45,10 +46,13 @@ const char *testc_module[][2] = {
 	// async
 	{"testc_faux_async_write", "Async write operations"},
 	{"testc_faux_async_read", "Async read operations"},
+#endif
 
 	// buf
 	{"testc_faux_buf", "Dynamic buffer"},
 	{"testc_faux_buf_boundaries", "Dynamic buffer. Check boundaries case"},
+	{"testc_faux_buf_direct", "Dynamic buffer. Direct access"},
+	{"testc_faux_buf_dwrite_unlock0", "Dynamic buffer. Chunk removing"},
 
 	// End of list
 	{NULL, NULL}