4 #if defined(_WIN32) || defined(_WIN64)
8 #include <sys/socket.h>
18 #include "mruby/array.h"
19 #include "mruby/error.h"
20 #include "mruby/string.h"
21 #include "mruby/variable.h"
24 mrb_io_test_io_setup(mrb_state
*mrb
, mrb_value self
)
26 char rfname
[] = "tmp.mruby-io-test.XXXXXXXX";
27 char wfname
[] = "tmp.mruby-io-test.XXXXXXXX";
28 char symlinkname
[] = "tmp.mruby-io-test.XXXXXXXX";
29 char socketname
[] = "/tmp/mruby-io-test.XXXXXXXX";
30 char msg
[] = "mruby io test\n";
32 int fd0
, fd1
, fd2
, fd3
;
36 struct sockaddr_un sun0
;
40 fd0
= mkstemp(rfname
);
41 fd1
= mkstemp(wfname
);
43 fd2
= mkstemp(symlinkname
);
44 fd3
= mkstemp(socketname
);
46 if (fd0
== -1 || fd1
== -1 || fd2
== -1 || fd3
== -1) {
47 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't create temporary file");
48 return mrb_nil_value();
52 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_rfname"), mrb_str_new_cstr(mrb
, rfname
));
53 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_wfname"), mrb_str_new_cstr(mrb
, wfname
));
54 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_symlinkname"), mrb_str_new_cstr(mrb
, symlinkname
));
55 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_socketname"), mrb_str_new_cstr(mrb
, socketname
));
56 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_msg"), mrb_str_new_cstr(mrb
, msg
));
58 fp
= fopen(rfname
, "wb");
60 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't open temporary file");
61 return mrb_nil_value();
66 fp
= fopen(wfname
, "wb");
68 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't open temporary file");
69 return mrb_nil_value();
76 if (symlink(rfname
, symlinkname
) == -1) {
77 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't make a symbolic link");
82 fd3
= socket(AF_UNIX
, SOCK_STREAM
, 0);
84 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't make a socket");
86 sun0
.sun_family
= AF_UNIX
;
87 snprintf(sun0
.sun_path
, sizeof(sun0
.sun_path
), "%s", socketname
);
88 if (bind(fd3
, (struct sockaddr
*)&sun0
, sizeof(sun0
)) == -1) {
89 mrb_raisef(mrb
, E_RUNTIME_ERROR
, "can't bind AF_UNIX socket to %S: %S",
90 mrb_str_new_cstr(mrb
, sun0
.sun_path
),
91 mrb_fixnum_value(errno
));
96 return mrb_true_value();
100 mrb_io_test_io_cleanup(mrb_state
*mrb
, mrb_value self
)
102 mrb_value rfname
= mrb_gv_get(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_rfname"));
103 mrb_value wfname
= mrb_gv_get(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_wfname"));
104 mrb_value symlinkname
= mrb_gv_get(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_symlinkname"));
105 mrb_value socketname
= mrb_gv_get(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_socketname"));
107 if (mrb_type(rfname
) == MRB_TT_STRING
) {
108 remove(RSTRING_PTR(rfname
));
110 if (mrb_type(wfname
) == MRB_TT_STRING
) {
111 remove(RSTRING_PTR(wfname
));
113 if (mrb_type(symlinkname
) == MRB_TT_STRING
) {
114 remove(RSTRING_PTR(symlinkname
));
116 if (mrb_type(socketname
) == MRB_TT_STRING
) {
117 remove(RSTRING_PTR(socketname
));
120 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_rfname"), mrb_nil_value());
121 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_wfname"), mrb_nil_value());
122 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_symlinkname"), mrb_nil_value());
123 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_socketname"), mrb_nil_value());
124 mrb_gv_set(mrb
, mrb_intern_cstr(mrb
, "$mrbtest_io_msg"), mrb_nil_value());
126 return mrb_nil_value();
130 mrb_io_test_file_setup(mrb_state
*mrb
, mrb_value self
)
132 mrb_value ary
= mrb_io_test_io_setup(mrb
, self
);
134 if (symlink("/usr/bin", "test-bin") == -1) {
135 mrb_raise(mrb
, E_RUNTIME_ERROR
, "can't make a symbolic link");
143 mrb_io_test_file_cleanup(mrb_state
*mrb
, mrb_value self
)
145 mrb_io_test_io_cleanup(mrb
, self
);
148 return mrb_nil_value();
152 mrb_io_test_mkdtemp(mrb_state
*mrb
, mrb_value klass
)
157 mrb_get_args(mrb
, "S", &str
);
158 cp
= mrb_str_to_cstr(mrb
, str
);
159 if (mkdtemp(cp
) == NULL
) {
160 mrb_sys_fail(mrb
, "mkdtemp");
162 return mrb_str_new_cstr(mrb
, cp
);
166 mrb_io_test_rmdir(mrb_state
*mrb
, mrb_value klass
)
171 mrb_get_args(mrb
, "S", &str
);
172 cp
= mrb_str_to_cstr(mrb
, str
);
173 if (rmdir(cp
) == -1) {
174 mrb_sys_fail(mrb
, "rmdir");
176 return mrb_true_value();
180 mrb_mruby_io_gem_test(mrb_state
* mrb
)
182 struct RClass
*io_test
= mrb_define_module(mrb
, "MRubyIOTestUtil");
183 mrb_define_class_method(mrb
, io_test
, "io_test_setup", mrb_io_test_io_setup
, MRB_ARGS_NONE());
184 mrb_define_class_method(mrb
, io_test
, "io_test_cleanup", mrb_io_test_io_cleanup
, MRB_ARGS_NONE());
186 mrb_define_class_method(mrb
, io_test
, "file_test_setup", mrb_io_test_file_setup
, MRB_ARGS_NONE());
187 mrb_define_class_method(mrb
, io_test
, "file_test_cleanup", mrb_io_test_file_cleanup
, MRB_ARGS_NONE());
189 mrb_define_class_method(mrb
, io_test
, "mkdtemp", mrb_io_test_mkdtemp
, MRB_ARGS_REQ(1));
190 mrb_define_class_method(mrb
, io_test
, "rmdir", mrb_io_test_rmdir
, MRB_ARGS_REQ(1));