| | 144 | ############################################################################### |
|---|
| | 145 | # Test PNG file with broken IDAT chunk. This poor man test of clean |
|---|
| | 146 | # recovery from errors caused by reading broken file.. |
|---|
| | 147 | |
|---|
| | 148 | def png_8(): |
|---|
| | 149 | |
|---|
| | 150 | drv = gdal.GetDriverByName( 'PNG' ) |
|---|
| | 151 | ds_src = gdal.Open( 'data/idat_broken.png' ) |
|---|
| | 152 | |
|---|
| | 153 | md = ds_src.GetMetadata() |
|---|
| | 154 | if len(md) > 0: |
|---|
| | 155 | gdaltest.post_reason('metadata list not expected') |
|---|
| | 156 | return 'fail' |
|---|
| | 157 | |
|---|
| | 158 | # Number of bands has been preserved |
|---|
| | 159 | if ds_src.RasterCount != 4: |
|---|
| | 160 | gdaltest.post_reason('wrong number of bands') |
|---|
| | 161 | return 'fail' |
|---|
| | 162 | |
|---|
| | 163 | # No reading is performed, so we expect valid reference |
|---|
| | 164 | b = ds_src.GetRasterBand(1) |
|---|
| | 165 | if b is None: |
|---|
| | 166 | gdaltest.post_reason('band 1 is missing') |
|---|
| | 167 | return 'fail' |
|---|
| | 168 | |
|---|
| | 169 | # We're not interested in returned value but internal state of GDAL. |
|---|
| | 170 | gdal.PushErrorHandler( 'CPLQuietErrorHandler' ) |
|---|
| | 171 | stats = b.ComputeBandStats() |
|---|
| | 172 | err = gdal.GetLastErrorNo() |
|---|
| | 173 | gdal.PopErrorHandler() |
|---|
| | 174 | |
|---|
| | 175 | if err == 0: |
|---|
| | 176 | gdaltest.post_reason('error condition expected') |
|---|
| | 177 | return 'fail' |
|---|
| | 178 | |
|---|
| | 179 | gdal.PushErrorHandler( 'CPLQuietErrorHandler' ) |
|---|
| | 180 | ds_dst = drv.CreateCopy( 'tmp/idat_broken.png', ds_src ) |
|---|
| | 181 | err = gdal.GetLastErrorNo() |
|---|
| | 182 | gdal.PopErrorHandler() |
|---|
| | 183 | ds_src = None |
|---|
| | 184 | |
|---|
| | 185 | if err == 0: |
|---|
| | 186 | gdaltest.post_reason('error condition expected') |
|---|
| | 187 | return 'fail' |
|---|
| | 188 | |
|---|
| | 189 | if ds_dst is not None: |
|---|
| | 190 | gdaltest.post_reason('dataset not expected') |
|---|
| | 191 | return 'fail' |
|---|
| | 192 | |
|---|
| | 193 | os.remove( 'tmp/idat_broken.png' ) |
|---|
| | 194 | |
|---|
| | 195 | return 'success' |
|---|
| | 196 | |
|---|
| | 197 | |
|---|