3 use Test::More tests => 69;
6 # this file tries to cover as much of the write error handling cases in
7 # msicon.c/imicon.c as possible.
9 # coverage checked with gcc/gcov
11 # image too big for format tests, for each entry point
13 my $im = Imager->new(xsize => 257, ysize => 256);
15 ok(!$im->write(data => \$data, type=>'ico'),
17 is($im->errstr, "image too large for ico file", "check message");
21 my $im = Imager->new(xsize => 257, ysize => 256);
23 ok(!Imager->write_multi({ data => \$data, type=>'ico' }, $im, $im),
25 is(Imager->errstr, "image too large for ico file", "check message");
26 Imager->_set_error('');
30 my $im = Imager->new(xsize => 257, ysize => 256);
32 ok(!$im->write(data => \$data, type=>'cur'),
34 is($im->errstr, "image too large for ico file", "check message");
38 my $im = Imager->new(xsize => 257, ysize => 256);
40 ok(!Imager->write_multi({ data => \$data, type=>'cur' }, $im),
42 is(Imager->errstr, "image too large for ico file", "check message");
43 Imager->_set_error('');
46 # low level write failure tests for each entry point (fail on close)
48 my $im = Imager->new(xsize => 10, ysize => 10);
49 ok(!$im->write(callback => \&write_failure, type=>'ico'),
50 "low level write failure (ico)");
51 is($im->errstr, "error closing output: synthetic error", "check message");
55 my $im = Imager->new(xsize => 10, ysize => 10);
56 ok(!$im->write(callback => \&write_failure, type=>'cur'),
57 "low level write failure (cur)");
58 is($im->errstr, "error closing output: synthetic error", "check message");
62 my $im = Imager->new(xsize => 10, ysize => 10);
63 ok(!Imager->write_multi({ callback => \&write_failure, type=>'ico' }, $im, $im),
64 "low level write_multi failure (ico)");
65 is(Imager->errstr, "error closing output: synthetic error", "check message");
66 Imager->_set_error('');
70 my $im = Imager->new(xsize => 10, ysize => 10);
71 ok(!Imager->write_multi({ callback => \&write_failure, type=>'cur' }, $im, $im),
72 "low level write_multi failure (cur)");
73 is(Imager->errstr, "error closing output: synthetic error", "check message");
74 Imager->_set_error('');
77 # low level write failure tests for each entry point (fail on write)
79 my $im = Imager->new(xsize => 10, ysize => 10);
80 my $io = Imager::io_new_cb(\&write_failure, undef, undef, undef, 1);
82 ok(!$im->write(io => $io, type=>'ico'),
83 "low level write failure (ico)");
84 is($im->errstr, "Write failure: synthetic error", "check message");
88 my $im = Imager->new(xsize => 10, ysize => 10);
89 my $io = Imager::io_new_cb(\&write_failure, undef, undef, undef, 1);
91 ok(!$im->write(io => $io, type=>'cur'),
92 "low level write failure (cur)");
93 is($im->errstr, "Write failure: synthetic error", "check message");
97 my $im = Imager->new(xsize => 10, ysize => 10);
98 my $io = Imager::io_new_cb(\&write_failure, undef, undef, undef, 1);
100 ok(!Imager->write_multi({ io => $io, type=>'ico' }, $im, $im),
101 "low level write_multi failure (ico)");
102 is(Imager->errstr, "Write failure: synthetic error", "check message");
103 Imager->_set_error('');
107 my $im = Imager->new(xsize => 10, ysize => 10);
108 my $io = Imager::io_new_cb(\&write_failure, undef, undef, undef, 1);
109 $io->set_buffered(0);
110 ok(!Imager->write_multi({ io => $io, type=>'cur' }, $im, $im),
111 "low level write_multi failure (cur)");
112 is(Imager->errstr, "Write failure: synthetic error", "check message");
113 Imager->_set_error('');
117 my $im = Imager->new(xsize => 10, ysize => 10);
118 ok(!$im->write(type => 'ico', io => limited_write_io(6)),
119 "second write (resource) should fail (ico)");
120 is($im->errstr, "Write failure: limit reached", "check message");
123 ok(!$im->write(type => 'cur', io => limited_write_io(6)),
124 "second (resource) write should fail (cur)");
125 is($im->errstr, "Write failure: limit reached", "check message");
128 ok(!$im->write(type => 'ico', io => limited_write_io(22)),
129 "third write (bmi) should fail (32-bit)");
130 is($im->errstr, "Write failure: limit reached", "check message");
133 ok(!$im->write(type => 'ico', io => limited_write_io(62)),
134 "fourth write (data) should fail (32-bit)");
135 is($im->errstr, "Write failure: limit reached", "check message");
138 ok(!$im->write(type => 'ico', io => limited_write_io(462)),
139 "mask write should fail (32-bit)");
140 is($im->errstr, "Write failure: limit reached", "check message");
143 { # 1 bit write fails
144 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
145 my $red = NC(255, 0, 0);
146 my $blue = NC(0, 0, 255);
147 $im->addcolors(colors => [ $red, $blue ]);
148 $im->box(filled => 1, color => $red, ymax => 5);
149 $im->box(filled => 1, color => $blue, ymin => 6);
150 ok(!$im->write(type => 'ico', io => limited_write_io(22)),
151 "third write (bmi) should fail (1-bit)");
152 is($im->errstr, "Write failure: limit reached", "check message");
154 ok(!$im->write(type => 'ico', io => limited_write_io(66)),
155 "fourth write (palette) should fail (1-bit)");
156 is($im->errstr, "Write failure: limit reached", "check message");
157 ok(!$im->write(type => 'ico', io => limited_write_io(74)),
158 "fifth write (image) should fail (1-bit)");
159 is($im->errstr, "Write failure: limit reached", "check message");
161 ok($im->write(data => \$data, type => 'ico'), "write 1 bit successfully");
162 my $read = Imager->new;
163 ok($read->read(data => $data), "read it back");
164 is($read->type, 'paletted', "check type");
165 is($read->tags(name => 'ico_bits'), 1, "check bits");
166 is(Imager::i_img_diff($read, $im), 0, "check image correct");
169 { # 4 bit write fails
170 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
171 my $red = NC(255, 0, 0);
172 my $blue = NC(0, 0, 255);
173 $im->addcolors(colors => [ ($red, $blue) x 8 ]);
174 $im->box(filled => 1, color => $red, ymax => 5);
175 $im->box(filled => 1, color => $blue, ymin => 6);
176 ok(!$im->write(type => 'ico', io => limited_write_io(22)),
177 "third write (bmi) should fail (4-bit)");
178 is($im->errstr, "Write failure: limit reached", "check message");
180 ok(!$im->write(type => 'ico', io => limited_write_io(66)),
181 "fourth write (palette) should fail (4-bit)");
182 is($im->errstr, "Write failure: limit reached", "check message");
183 ok(!$im->write(type => 'ico', io => limited_write_io(130)),
184 "fifth write (image) should fail (4-bit)");
185 is($im->errstr, "Write failure: limit reached", "check message");
187 ok($im->write(data => \$data, type => 'ico'), "write 4 bit successfully");
188 my $read = Imager->new;
189 ok($read->read(data => $data), "read it back");
190 is($read->type, 'paletted', "check type");
191 is($read->tags(name => 'ico_bits'), 4, "check bits");
192 is(Imager::i_img_diff($read, $im), 0, "check image correct");
195 { # 8 bit write fails
196 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
197 my $red = NC(255, 0, 0);
198 my $blue = NC(0, 0, 255);
199 $im->addcolors(colors => [ ($red, $blue) x 9 ]);
200 $im->box(filled => 1, color => $red, ymax => 5);
201 $im->box(filled => 1, color => $blue, ymin => 6);
202 ok(!$im->write(type => 'ico', io => limited_write_io(22)),
203 "third write (bmi) should fail (8-bit)");
204 is($im->errstr, "Write failure: limit reached", "check message");
206 ok(!$im->write(type => 'ico', io => limited_write_io(62)),
207 "fourth write (palette) should fail (8-bit)");
208 is($im->errstr, "Write failure: limit reached", "check message");
209 ok(!$im->write(type => 'ico', io => limited_write_io(62 + 1024)),
210 "fifth write (image) should fail (8-bit)");
211 is($im->errstr, "Write failure: limit reached", "check message");
212 ok(!$im->write(type => 'ico', io => limited_write_io(62 + 1024 + 10)),
213 "sixth write (zeroes) should fail (8-bit)");
214 is($im->errstr, "Write failure: limit reached", "check message");
216 ok($im->write(data => \$data, type => 'ico'), "write 8 bit successfully");
217 my $read = Imager->new;
218 ok($read->read(data => $data), "read it back");
219 is($read->type, 'paletted', "check type");
220 is($read->tags(name => 'ico_bits'), 8, "check bits");
221 is(Imager::i_img_diff($read, $im), 0, "check image correct");
224 # write callback that fails
226 print "# synthesized write failure\n";
227 Imager::i_push_error(0, "synthetic error");
231 sub limited_write_io {
234 my $io = Imager::io_new_cb(limited_write($limit), undef, undef, undef, 1);
235 $io->set_buffered(0);
246 $limit -= length $data;
248 print "# write of ", length $data, " bytes successful ($limit left)\n";
252 print "# write of ", length $data, " bytes failed\n";
253 Imager::i_push_error(0, "limit reached");