aboutsummaryrefslogtreecommitdiff
path: root/tests/core/nbio/fs.odin
blob: 1b10c03c9adf8a2ba5ae50d9fd246620981de394 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package tests_nbio

import "core:nbio"
import "core:testing"
import "core:time"
import "core:os"

@(test)
close_invalid_handle :: proc(t: ^testing.T) {
	if event_loop_guard(t) {
		testing.set_fail_timeout(t, time.Minute)

		nbio.close(max(nbio.Handle))

		ev(t, nbio.run(), nil)
	}
}

@(test)
write_read_close :: proc(t: ^testing.T) {
	if event_loop_guard(t) {
		testing.set_fail_timeout(t, time.Minute)

		@static content := [20]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
		@static result: [20]byte

		FILENAME :: "test_write_read_close"

		nbio.open_poly(FILENAME, t, on_open, mode={.Read, .Write, .Create, .Trunc})

		on_open :: proc(op: ^nbio.Operation, t: ^testing.T) {
			ev(t, op.open.err, nil)

			nbio.write_poly(op.open.handle, 0, content[:], t, on_write)
		}

		on_write :: proc(op: ^nbio.Operation, t: ^testing.T) {
			ev(t, op.write.err, nil)
			ev(t, op.write.written, len(content))

			nbio.read_poly(op.write.handle, 0, result[:], t, on_read, all=true)
		}

		on_read :: proc(op: ^nbio.Operation, t: ^testing.T) {
			ev(t, op.read.err, nil)
			ev(t, op.read.read, len(result))
			ev(t, result, content)

			nbio.close_poly(op.read.handle, t, on_close)
		}

		on_close :: proc(op: ^nbio.Operation, t: ^testing.T) {
			ev(t, op.close.err, nil)
			os.remove(FILENAME)
		}

		ev(t, nbio.run(), nil)
	}
}

@(test)
read_empty_file :: proc(t: ^testing.T) {
	if event_loop_guard(t) {
		testing.set_fail_timeout(t, time.Minute)

		FILENAME :: "test_read_empty_file"

		handle, err := nbio.open_sync(FILENAME, mode={.Read, .Write, .Create, .Trunc})
		ev(t, err, nil)

		buf: [128]byte
		nbio.read_poly(handle, 0, buf[:], t, proc(op: ^nbio.Operation, t: ^testing.T) {
			ev(t, op.read.err, nbio.FS_Error.EOF)
			ev(t, op.read.read, 0)

			nbio.close_poly(op.read.handle, t, proc(op: ^nbio.Operation, t: ^testing.T) {
				ev(t, op.close.err, nil)
				os.remove(FILENAME)
			})
		})

		ev(t, nbio.run(), nil)
	}
}

@(test)
read_entire_file :: proc(t: ^testing.T) {
	if event_loop_guard(t) {
		testing.set_fail_timeout(t, time.Minute)

		nbio.read_entire_file(#file, t, on_read)

		on_read :: proc(t: rawptr, data: []byte, err: nbio.Read_Entire_File_Error) {
			t := (^testing.T)(t)
			ev(t, err.value, nil)
			ev(t, string(data), #load(#file, string))
			delete(data)
		}
	}
}