File: test_validate.py

package info (click to toggle)
rio-cogeo 7.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 62,748 kB
  • sloc: python: 3,227; xml: 90; makefile: 4
file content (144 lines) | stat: -rw-r--r-- 4,845 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""tests rio_cogeo.cogeo."""

import os

import pytest
from click.testing import CliRunner
from rasterio.errors import NotGeoreferencedWarning

from rio_cogeo.cogeo import cog_translate, cog_validate
from rio_cogeo.profiles import cog_profiles

fixture_dir = os.path.join(os.path.dirname(__file__), "fixtures")

raster_rgb = os.path.join(fixture_dir, "image_rgb.tif")
raster_external = os.path.join(fixture_dir, "validate", "image_external.tif")
raster_no_ovr = os.path.join(fixture_dir, "validate", "image_no_overview.tif")
raster_ovrsorted = os.path.join(fixture_dir, "validate", "image_sorted.tif")
raster_decim = os.path.join(fixture_dir, "validate", "image_dec.tif")
raster_jpeg = os.path.join(fixture_dir, "validate", "nontiff.jpg")
raster_big = os.path.join(fixture_dir, "image_2000px.tif")
raster_zero_offset = os.path.join(fixture_dir, "validate", "cog_no_offest.tif")
raster_sparse = os.path.join(fixture_dir, "validate", "sparse.tif")

# COG created with rio-cogeo but using gdal 3.1
raster_rioCOGgdal31 = os.path.join(fixture_dir, "validate", "image_rioCOG_gdal3.1.tif")

# COG created using GDAL COG Driver
raster_COGgdal31 = os.path.join(fixture_dir, "validate", "image_rioCOG_gdal3.1.tif")

# COG written and then modified to invalidate COG layout
raster_known_incompatible = os.path.join(
    fixture_dir, "validate", "image_known_incompatible_ghost_headers.tif"
)

jpeg_profile = cog_profiles.get("jpeg")
jpeg_profile.update({"blockxsize": 256, "blockysize": 256})


def test_cog_validate_valid(monkeypatch):
    """Should work as expected (validate cogeo file)."""
    config = {"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}

    # not tiled but 512x512
    assert cog_validate(raster_rgb, config=config)[0]

    # not tiled, no overview
    assert not cog_validate(raster_big, quiet=True, config=config)[0]

    # external overview
    assert not cog_validate(raster_external, config=config)[0]

    # non-sorted overview
    assert not cog_validate(raster_ovrsorted, config=config)[0]

    # invalid decimation
    assert not cog_validate(raster_decim, config=config)[0]

    # no overview
    assert cog_validate(raster_no_ovr, config=config)[0]
    assert not cog_validate(raster_no_ovr, strict=True, config=config)[0]

    # not a GeoTIFF
    assert not cog_validate(raster_jpeg, config=config)[0]

    # optimizations invalidated by layout modification
    assert not cog_validate(raster_known_incompatible, config=config)[0]

    # COG created with GDAL 3.1
    assert cog_validate(raster_rioCOGgdal31, config=config)[0]
    assert cog_validate(raster_COGgdal31, config=config)[0]

    with pytest.warns(NotGeoreferencedWarning):
        assert cog_validate(raster_zero_offset, config=config)

    # Sparse COG with some overviews that contain zeros
    assert cog_validate(raster_sparse, config=config)[0]


def test_cog_validate_return():
    """Checkout returned values."""
    valid, err, warn = cog_validate(
        raster_rgb, config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
    )
    assert valid
    assert not err
    assert not warn

    valid, err, warn = cog_validate(
        raster_no_ovr, config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
    )
    assert valid
    assert len(warn) == 1
    assert not err


def test_cog_validate_validCreatioValid(monkeypatch):
    """Should work as expected (validate cogeo file)."""
    runner = CliRunner()
    with runner.isolated_filesystem():
        cog_translate(raster_rgb, "cogeo.tif", jpeg_profile, quiet=True)
        assert cog_validate(
            "cogeo.tif", config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
        )

        cog_translate(
            raster_rgb, "cogeo.tif", jpeg_profile, overview_level=0, quiet=True
        )
        assert cog_validate(
            "cogeo.tif", config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
        )

        # Change in rasterio 1.0.26
        # https://github.com/mapbox/rasterio/blob/master/CHANGES.txt#L43
        config = {"GDAL_TIFF_OVR_BLOCKSIZE": "1024"}
        cog_translate(
            raster_big,
            "cogeo.tif",
            jpeg_profile,
            overview_level=1,
            config=config,
            quiet=True,
        )
        assert cog_validate(
            "cogeo.tif", config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
        )


def test_cog_validate_config(monkeypatch):
    """Should work as expected (validate cogeo file)."""
    # No external overview found
    assert cog_validate(
        raster_external, config={"GDAL_DISABLE_READDIR_ON_OPEN": "EMPTY_DIR"}
    )[0]

    # External overview found
    assert not cog_validate(
        raster_external, config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
    )[0]
    assert (
        "external"
        in cog_validate(
            raster_external, config={"GDAL_DISABLE_READDIR_ON_OPEN": "FALSE"}
        )[1][0]
    )