diff --git a/newbrt/tests/dbufio-test-destroy.c b/newbrt/tests/dbufio-test-destroy.c new file mode 100644 index 0000000000000000000000000000000000000000..9c745b4f28dc9980b2a05c7422dea82dda09c331 --- /dev/null +++ b/newbrt/tests/dbufio-test-destroy.c @@ -0,0 +1,92 @@ +#include "dbufio.h" +#include <stdio.h> +#include <fcntl.h> +#include <toku_assert.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> + +enum { N = 5 }; +enum { M = 10 }; +static void test1 (size_t chars_per_file, size_t bytes_per_read) { + int fds[N]; + char fnames[N][100]; + size_t n_read[N]; + int still_live[N]; + int n_live=N; + for (int i=0; i<N; i++) { + snprintf(fnames[i], 100, "dbufio-test-file%d.data", i); + unlink(fnames[i]); + fds[i] = open(fnames[i], O_CREAT|O_RDWR, S_IRWXU); + //printf("fds[%d]=%d is %s\n", i, fds[i], fnames[i]); + assert(fds[i]>=0); + n_read[i]=0; + still_live[i]=i; + for (size_t j=0; j<chars_per_file; j++) { + unsigned char c = (i+j)%256; + int r = toku_os_write(fds[i], &c, 1); + if (r!=0) printf("fds[%d]=%d r=%d errno=%d (%s)\n", i, fds[i], r, errno, strerror(errno)); + assert(r==0); + } + { + int r = lseek(fds[i], 0, SEEK_SET); + assert(r==0); + } + + } + DBUFIO_FILESET bfs; + { + int r = create_dbufio_fileset(&bfs, N, fds, M); + assert(r==0); + } +#if 0 + while (n_live>0) { + int indirectnum = random()%n_live; + int filenum = still_live[indirectnum]; + char buf[bytes_per_read]; + size_t n_read_here=0; + int r = dbufio_fileset_read(bfs, filenum, buf, bytes_per_read, &n_read_here); + //printf("read(%d) -> %d (%ld) (old n_read=%ld)\n", filenum, r, n_read_here, n_read[filenum]); + if (r==0) { + // did read something + assert(n_read_here==bytes_per_read); + n_read[filenum]+=n_read_here; + //printf(" new n_read=%ld\n", n_read[filenum]); + assert(n_read[filenum]<=chars_per_file); + } else { + assert(r==EOF); + assert(n_read[filenum]==chars_per_file); + still_live[indirectnum] = still_live[n_live-1]; + n_live--; + } + } +#else + n_live = n_live; bytes_per_read = bytes_per_read; +#endif + { + int r = destroy_dbufio_fileset(bfs); + assert(r==0); + } + for (int i=0; i<N; i++) { + { + int r = unlink(fnames[i]); + assert(r==0); + } + { + int r = close(fds[i]); + assert(r==0); + } + assert(n_read[i]==chars_per_file); + } +} + + + +int main (int argc __attribute__((__unused__)), char *argv[]__attribute__((__unused__))) { +// test1(0, 1); +// test1(1, 1); +// test1(15, 1); +// test1(100, 1); + test1(30, 3); // 3 and M are relatively prime. But 3 divides the file size. + return 0; +}