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 => 256, ysize => 255);
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 => 256, ysize => 255);
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 => 256, ysize => 255);
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 => 256, ysize => 255);
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 ok(!$im->write(callback => \&write_failure, maxbuffer => 1, type=>'ico'),
81 "low level write failure (ico)");
82 is($im->errstr, "Write failure: synthetic error", "check message");
86 my $im = Imager->new(xsize => 10, ysize => 10);
87 ok(!$im->write(callback => \&write_failure, maxbuffer => 1, type=>'cur'),
88 "low level write failure (cur)");
89 is($im->errstr, "Write failure: synthetic error", "check message");
93 my $im = Imager->new(xsize => 10, ysize => 10);
94 ok(!Imager->write_multi({ callback => \&write_failure, maxbuffer => 1, type=>'ico' }, $im, $im),
95 "low level write_multi failure (ico)");
96 is(Imager->errstr, "Write failure: synthetic error", "check message");
97 Imager->_set_error('');
101 my $im = Imager->new(xsize => 10, ysize => 10);
102 ok(!Imager->write_multi({ callback => \&write_failure, maxbuffer => 1, type=>'cur' }, $im, $im),
103 "low level write_multi failure (cur)");
104 is(Imager->errstr, "Write failure: synthetic error", "check message");
105 Imager->_set_error('');
109 my $im = Imager->new(xsize => 10, ysize => 10);
110 ok(!$im->write(type => 'ico', callback => limited_write(6), maxbuffer => 1),
111 "second write (resource) should fail (ico)");
112 is($im->errstr, "Write failure: limit reached", "check message");
115 ok(!$im->write(type => 'cur', callback => limited_write(6), maxbuffer => 1),
116 "second (resource) write should fail (cur)");
117 is($im->errstr, "Write failure: limit reached", "check message");
120 ok(!$im->write(type => 'ico', callback => limited_write(22), maxbuffer => 1),
121 "third write (bmi) should fail (32-bit)");
122 is($im->errstr, "Write failure: limit reached", "check message");
125 ok(!$im->write(type => 'ico', callback => limited_write(62), maxbuffer => 1),
126 "fourth write (data) should fail (32-bit)");
127 is($im->errstr, "Write failure: limit reached", "check message");
130 ok(!$im->write(type => 'ico', callback => limited_write(462), maxbuffer => 1),
131 "mask write should fail (32-bit)");
132 is($im->errstr, "Write failure: limit reached", "check message");
135 { # 1 bit write fails
136 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
137 my $red = NC(255, 0, 0);
138 my $blue = NC(0, 0, 255);
139 $im->addcolors(colors => [ $red, $blue ]);
140 $im->box(filled => 1, color => $red, ymax => 5);
141 $im->box(filled => 1, color => $blue, ymin => 6);
142 ok(!$im->write(type => 'ico', callback => limited_write(22), maxbuffer => 1),
143 "third write (bmi) should fail (1-bit)");
144 is($im->errstr, "Write failure: limit reached", "check message");
146 ok(!$im->write(type => 'ico', callback => limited_write(66), maxbuffer => 1),
147 "fourth write (palette) should fail (1-bit)");
148 is($im->errstr, "Write failure: limit reached", "check message");
149 ok(!$im->write(type => 'ico', callback => limited_write(74), maxbuffer => 1),
150 "fifth write (image) should fail (1-bit)");
151 is($im->errstr, "Write failure: limit reached", "check message");
153 ok($im->write(data => \$data, type => 'ico'), "write 1 bit successfully");
154 my $read = Imager->new;
155 ok($read->read(data => $data), "read it back");
156 is($read->type, 'paletted', "check type");
157 is($read->tags(name => 'ico_bits'), 1, "check bits");
158 is(Imager::i_img_diff($read, $im), 0, "check image correct");
161 { # 4 bit write fails
162 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
163 my $red = NC(255, 0, 0);
164 my $blue = NC(0, 0, 255);
165 $im->addcolors(colors => [ ($red, $blue) x 8 ]);
166 $im->box(filled => 1, color => $red, ymax => 5);
167 $im->box(filled => 1, color => $blue, ymin => 6);
168 ok(!$im->write(type => 'ico', callback => limited_write(22), maxbuffer => 1),
169 "third write (bmi) should fail (4-bit)");
170 is($im->errstr, "Write failure: limit reached", "check message");
172 ok(!$im->write(type => 'ico', callback => limited_write(66), maxbuffer => 1),
173 "fourth write (palette) should fail (4-bit)");
174 is($im->errstr, "Write failure: limit reached", "check message");
175 ok(!$im->write(type => 'ico', callback => limited_write(130), maxbuffer => 1),
176 "fifth write (image) should fail (4-bit)");
177 is($im->errstr, "Write failure: limit reached", "check message");
179 ok($im->write(data => \$data, type => 'ico'), "write 4 bit successfully");
180 my $read = Imager->new;
181 ok($read->read(data => $data), "read it back");
182 is($read->type, 'paletted', "check type");
183 is($read->tags(name => 'ico_bits'), 4, "check bits");
184 is(Imager::i_img_diff($read, $im), 0, "check image correct");
187 { # 8 bit write fails
188 my $im = Imager->new(xsize => 10, ysize => 10, type => 'paletted');
189 my $red = NC(255, 0, 0);
190 my $blue = NC(0, 0, 255);
191 $im->addcolors(colors => [ ($red, $blue) x 9 ]);
192 $im->box(filled => 1, color => $red, ymax => 5);
193 $im->box(filled => 1, color => $blue, ymin => 6);
194 ok(!$im->write(type => 'ico', callback => limited_write(22), maxbuffer => 1),
195 "third write (bmi) should fail (8-bit)");
196 is($im->errstr, "Write failure: limit reached", "check message");
198 ok(!$im->write(type => 'ico', callback => limited_write(62), maxbuffer => 1),
199 "fourth write (palette) should fail (8-bit)");
200 is($im->errstr, "Write failure: limit reached", "check message");
201 ok(!$im->write(type => 'ico', callback => limited_write(62 + 1024), maxbuffer => 1),
202 "fifth write (image) should fail (8-bit)");
203 is($im->errstr, "Write failure: limit reached", "check message");
204 ok(!$im->write(type => 'ico', callback => limited_write(62 + 1024 + 10), maxbuffer => 1),
205 "sixth write (zeroes) should fail (8-bit)");
206 is($im->errstr, "Write failure: limit reached", "check message");
208 ok($im->write(data => \$data, type => 'ico'), "write 8 bit successfully");
209 my $read = Imager->new;
210 ok($read->read(data => $data), "read it back");
211 is($read->type, 'paletted', "check type");
212 is($read->tags(name => 'ico_bits'), 8, "check bits");
213 is(Imager::i_img_diff($read, $im), 0, "check image correct");
216 # write callback that fails
218 print "# synthesized write failure\n";
219 Imager::i_push_error(0, "synthetic error");
229 $limit -= length $data;
231 print "# write of ", length $data, " bytes successful ($limit left)\n";
235 print "# write of ", length $data, " bytes failed\n";
236 Imager::i_push_error(0, "limit reached");