Add 'mrbgems/mruby-io/' from commit '3c8e1f94c44252c836f79a48bb17726da28e2756'
[mruby.git] / mrbgems / mruby-io / test / mruby_io_test.c
blobffaa27ff4977389c54bb9dc859986e9304040bd9
1 #include <sys/types.h>
2 #include <errno.h>
4 #if defined(_WIN32) || defined(_WIN64)
5 #include <winsock.h>
6 #include <io.h>
7 #else
8 #include <sys/socket.h>
9 #include <unistd.h>
10 #include <sys/un.h>
11 #endif
13 #include <sys/stat.h>
14 #include <stdio.h>
15 #include <stdlib.h>
17 #include "mruby.h"
18 #include "mruby/array.h"
19 #include "mruby/error.h"
20 #include "mruby/string.h"
21 #include "mruby/variable.h"
23 static mrb_value
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";
31 mode_t mask;
32 int fd0, fd1, fd2, fd3;
33 FILE *fp;
35 #ifndef _WIN32
36 struct sockaddr_un sun0;
37 #endif
39 mask = umask(077);
40 fd0 = mkstemp(rfname);
41 fd1 = mkstemp(wfname);
42 #ifndef _WIN32
43 fd2 = mkstemp(symlinkname);
44 fd3 = mkstemp(socketname);
45 #endif
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();
50 umask(mask);
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");
59 if (fp == NULL) {
60 mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
61 return mrb_nil_value();
63 fputs(msg, fp);
64 fclose(fp);
66 fp = fopen(wfname, "wb");
67 if (fp == NULL) {
68 mrb_raise(mrb, E_RUNTIME_ERROR, "can't open temporary file");
69 return mrb_nil_value();
71 fclose(fp);
73 #ifndef _WIN32
74 unlink(symlinkname);
75 close(fd2);
76 if (symlink(rfname, symlinkname) == -1) {
77 mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a symbolic link");
80 unlink(socketname);
81 close(fd3);
82 fd3 = socket(AF_UNIX, SOCK_STREAM, 0);
83 if (fd3 == -1) {
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));
93 close(fd3);
94 #endif
96 return mrb_true_value();
99 static mrb_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();
129 static mrb_value
130 mrb_io_test_file_setup(mrb_state *mrb, mrb_value self)
132 mrb_value ary = mrb_io_test_io_setup(mrb, self);
133 #ifndef _WIN32
134 if (symlink("/usr/bin", "test-bin") == -1) {
135 mrb_raise(mrb, E_RUNTIME_ERROR, "can't make a symbolic link");
137 #endif
139 return ary;
142 static mrb_value
143 mrb_io_test_file_cleanup(mrb_state *mrb, mrb_value self)
145 mrb_io_test_io_cleanup(mrb, self);
146 remove("test-bin");
148 return mrb_nil_value();
151 static mrb_value
152 mrb_io_test_mkdtemp(mrb_state *mrb, mrb_value klass)
154 mrb_value str;
155 char *cp;
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);
165 static mrb_value
166 mrb_io_test_rmdir(mrb_state *mrb, mrb_value klass)
168 mrb_value str;
169 char *cp;
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();
179 void
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));