Skip to content

Commit

Permalink
add golden test, optional_wd resolves to full path
Browse files Browse the repository at this point in the history
  • Loading branch information
forrestfwilliams committed Apr 22, 2024
1 parent a3e3738 commit aba8f7c
Show file tree
Hide file tree
Showing 7 changed files with 121 additions and 6 deletions.
29 changes: 29 additions & 0 deletions .github/workflows/pytest-golden.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Golden Test

on:
pull_request:
branches:
- main

jobs:
pytest:
runs-on: ubuntu-latest

strategy:
matrix:
python_version: ["3.12"]

steps:
- uses: actions/checkout@v4

- uses: mamba-org/setup-micromamba@v1
with:
environment-file: environment.yml
create-args: >-
python=${{ matrix.python_version }}
- name: Pytest in conda environment
shell: bash -l {0}
run: |
python -m pip install --no-deps .
pytest -m golden
2 changes: 1 addition & 1 deletion .github/workflows/pytest-integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ jobs:
shell: bash -l {0}
run: |
python -m pip install --no-deps .
pytest --cov=burst2safe -m integration
pytest -m integration
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ develop = [

[tool.pytest.ini_options]
minversion = "6.0"
addopts = '-ra -q -m "not integration"'
markers = ["integration"]
addopts = '-ra -q -m "not integration and not golden"'
markers = ["integration", "golden"]
testpaths = ["tests"]

[tool.black]
Expand Down
11 changes: 10 additions & 1 deletion src/burst2safe/measurement.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,15 @@ def get_burst_byte_offsets(self):
byte_offsets = [offsets[self.burst_length * i] for i in range(len(self.burst_infos))]
return byte_offsets

def get_time_tag(self) -> str:
"""Get the current time as a time tag.
This is a separate method to allow for easy mocking in tests.
Returns:
The time tag as a string
"""
return datetime.strftime(datetime.now(), '%Y:%m:%d %H:%M:%S')

def add_metadata(self, dataset: gdal.Dataset):
"""Add metadata to an existing GDAL dataset.
Expand All @@ -90,7 +99,7 @@ def add_metadata(self, dataset: gdal.Dataset):
srs.ImportFromEPSG(4326)
dataset.SetGCPs(gdal_gcps, srs.ExportToWkt())

dataset.SetMetadataItem('TIFFTAG_DATETIME', datetime.strftime(datetime.now(), '%Y:%m:%d %H:%M:%S'))
dataset.SetMetadataItem('TIFFTAG_DATETIME', self.get_time_tag())
# TODO make sure A/B is being set correctly.
dataset.SetMetadataItem('TIFFTAG_IMAGEDESCRIPTION', 'Sentinel-1A IW SLC L1')
dataset.SetMetadataItem('TIFFTAG_SOFTWARE', f'Sentinel-1 IPF {self.version}')
Expand Down
2 changes: 1 addition & 1 deletion src/burst2safe/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ def optional_wd(wd: Optional[Path | str] = None) -> Path:
"""
if wd is None:
wd = Path.cwd()
return Path(wd)
return Path(wd).resolve()


def calculate_crc16(file_path: Path) -> str:
Expand Down
77 changes: 77 additions & 0 deletions tests/test_golden.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import filecmp
from pathlib import Path
from unittest.mock import patch
from zipfile import ZipFile

import pytest
import requests
from shapely import box

from burst2safe.burst2safe import burst2safe


def bit_for_bit(reference: Path, secondary: Path):
filecmp.clear_cache()
return filecmp.cmp(reference, secondary, shallow=False)


def prep_golden_safe(tmp_path: Path):
golden_url = 'https://ffwilliams2-shenanigans.s3.us-west-2.amazonaws.com/burst2safe/S1A_IW_SLC__1SSV_20240103T015108_20240103T015112_051936_064669_51EE.zip'

golden_dir = tmp_path / 'golden'
golden_dir.mkdir(exist_ok=True)

golden_zip = golden_dir / Path(golden_url).name
with requests.get(golden_url, stream=True) as r:
r.raise_for_status()
with open(golden_zip, 'wb') as f:
for chunk in r.iter_content(chunk_size=2**22):
f.write(chunk)

with ZipFile(golden_zip, 'r') as z:
z.extractall(golden_dir)

golden_safe = golden_zip.with_suffix('.SAFE')
return golden_safe


@pytest.mark.golden()
def test_golden(tmp_path):
safe_name = 'S1A_IW_SLC__1SSV_20240103T015108_20240103T015112_051936_064669_51EE.SAFE'
golden_safe = (tmp_path / 'golden' / safe_name).resolve()
new_safe = (tmp_path / safe_name).resolve()

prep_golden_safe(tmp_path)

with patch('burst2safe.measurement.Measurement.get_time_tag') as mock_get_time_tag:
mock_get_time_tag.return_value = '2024:01:01 00:00:00'
burst2safe(
granules=[],
orbit=51936,
footprint=box(*[-117.3, 35.5, -117.2, 35.6]),
polarizations=['VV', 'VH'],
keep_files=True,
work_dir=tmp_path,
)

golden_files = sorted([x.resolve() for x in golden_safe.rglob('*')])
new_files = sorted([x.resolve() for x in new_safe.rglob('*')])

golden_set = set([f.relative_to(golden_safe) for f in golden_files])
new_set = set([f.relative_to(new_safe) for f in new_files])

only_in_golden = [str(x) for x in golden_set - new_set]
assert not only_in_golden

only_in_new = [str(x) for x in new_set - golden_set]
assert not only_in_new

differing_files = []
for golden_file, new_file in zip(golden_files, new_files):
if golden_file.is_dir():
continue

if not bit_for_bit(golden_file, new_file):
differing_files.append(new_file.relative_to(new_safe))
differing_files = [str(x) for x in differing_files]
assert not differing_files
2 changes: 1 addition & 1 deletion tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ def test_optional_wd():
existing_dir = 'working'
wd = utils.optional_wd(existing_dir)
assert isinstance(wd, Path)
assert wd == Path(existing_dir)
assert wd == Path(existing_dir).resolve()


def test_calculate_crc16(tmp_path, test_data_dir):
Expand Down

0 comments on commit aba8f7c

Please sign in to comment.