Skip to content

Commit 0b48bb2

Browse files
authored
Add bindiff delta tests (#1742)
Ensure bindiff (delta) files remain stable between Martin versions
1 parent 1282087 commit 0b48bb2

12 files changed

+74
-6
lines changed

.github/workflows/ci.yml

+6-6
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ jobs:
126126
# https://github.com/docker/setup-qemu-action
127127
with:
128128
platforms: linux/amd64,linux/arm64
129-
- name: Set up gdal-bin
130-
run: sudo apt-get install -y gdal-bin
129+
- name: Set up gdal-bin and sqlite3-tools
130+
run: sudo apt-get install -y gdal-bin sqlite3-tools
131131
- name: Set up Docker Buildx
132132
uses: docker/setup-buildx-action@v3
133133
# https://github.com/docker/setup-buildx-action
@@ -397,9 +397,9 @@ jobs:
397397
with:
398398
name: build-${{ matrix.target }}
399399
path: target/
400-
- name: Set up gdal-bin
400+
- name: Set up gdal-bin and sqlite3-tools
401401
if: matrix.os == 'ubuntu-latest'
402-
run: sudo apt-get install -y gdal-bin
402+
run: sudo apt-get install -y gdal-bin sqlite3-tools
403403
- name: Integration Tests
404404
run: |
405405
export MARTIN_BUILD_ALL=-
@@ -524,8 +524,8 @@ jobs:
524524
with:
525525
name: build-x86_64-unknown-linux-gnu
526526
path: target_releases/
527-
- name: Install gdal-bin
528-
run: sudo apt-get install -y gdal-bin
527+
- name: Set up gdal-bin and sqlite3-tools
528+
run: sudo apt-get install -y gdal-bin sqlite3-tools
529529
- name: Integration Tests
530530
run: |
531531
if [[ "${{ matrix.sslmode }}" == "verify-ca" || "${{ matrix.sslmode }}" == "verify-full" ]]; then

tests/expected/auto/catalog_auto.json

+5
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@
195195
"description": "Major cities from Natural Earth data",
196196
"name": "Major cities from Natural Earth data"
197197
},
198+
"world_cities_bindiff": {
199+
"content_encoding": "gzip",
200+
"content_type": "application/x-protobuf",
201+
"description": "A modified version of major cities from Natural Earth data"
202+
},
198203
"world_cities_diff": {
199204
"content_encoding": "gzip",
200205
"content_type": "application/x-protobuf",

tests/expected/auto/save_config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ mbtiles:
249249
uncompressed_mvt: tests/fixtures/mbtiles/uncompressed_mvt.mbtiles
250250
webp: tests/fixtures/mbtiles/webp.mbtiles
251251
world_cities: tests/fixtures/mbtiles/world_cities.mbtiles
252+
world_cities_bindiff: tests/fixtures/mbtiles/world_cities_bindiff.mbtiles
252253
world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles
253254
world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles
254255
zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles

tests/expected/martin-cp/flat-with-hash_save_config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ mbtiles:
248248
uncompressed_mvt: tests/fixtures/mbtiles/uncompressed_mvt.mbtiles
249249
webp: tests/fixtures/mbtiles/webp.mbtiles
250250
world_cities: tests/fixtures/mbtiles/world_cities.mbtiles
251+
world_cities_bindiff: tests/fixtures/mbtiles/world_cities_bindiff.mbtiles
251252
world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles
252253
world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles
253254
zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles

tests/expected/martin-cp/flat_save_config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ mbtiles:
248248
uncompressed_mvt: tests/fixtures/mbtiles/uncompressed_mvt.mbtiles
249249
webp: tests/fixtures/mbtiles/webp.mbtiles
250250
world_cities: tests/fixtures/mbtiles/world_cities.mbtiles
251+
world_cities_bindiff: tests/fixtures/mbtiles/world_cities_bindiff.mbtiles
251252
world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles
252253
world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles
253254
zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles

tests/expected/martin-cp/normalized_save_config.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ mbtiles:
248248
uncompressed_mvt: tests/fixtures/mbtiles/uncompressed_mvt.mbtiles
249249
webp: tests/fixtures/mbtiles/webp.mbtiles
250250
world_cities: tests/fixtures/mbtiles/world_cities.mbtiles
251+
world_cities_bindiff: tests/fixtures/mbtiles/world_cities_bindiff.mbtiles
251252
world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles
252253
world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles
253254
zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[INFO ] The patch file ./tests/fixtures/mbtiles/world_cities_bindiff.mbtiles expects to be applied to a tileset with agg_tiles_hash=84792BF4EE9AEDDC5B1A60E707011FEE, and should result in hash 578FB5BD64746C39E3D344662947FD0D after applying
2+
[INFO ] Applying patch from ./tests/fixtures/mbtiles/world_cities_bindiff.mbtiles (flat) to ./tests/fixtures/mbtiles/world_cities.mbtiles (flat) into a new file tests/mbtiles_temp_files/world_cities_modified3.mbtiles (flat) with bin-diff on gzip-ed tiles
3+
[INFO ] Finished processing 1 bindiff tiles
4+
[INFO ] Adding a new metadata value agg_tiles_hash = 623863EF20ABEFCB4E30EEFBD82FFFDC in tests/mbtiles_temp_files/world_cities_modified3.mbtiles
5+
[INFO ] Skipping agg_tiles_hash_after_apply validation because re-gzip-ing could produce different tile data. Each bindiff-ed tile was still verified with a hash value
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[INFO ] Comparing ./tests/fixtures/mbtiles/world_cities_modified.mbtiles (flat) and tests/mbtiles_temp_files/world_cities_modified3.mbtiles (flat) into a new file tests/mbtiles_temp_files/world_cities_bindiff_modified2.mbtiles (flat)
2+
[INFO ] Adding a new metadata value agg_tiles_hash = 53A778D4E5E2133B70D4BDE3BADDB82D in tests/mbtiles_temp_files/world_cities_bindiff_modified2.mbtiles
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
MBTiles file summary for tests/mbtiles_temp_files/world_cities_bindiff_modified2.mbtiles
2+
Schema: flat
3+
File size: 3.00KiB
4+
Page size: 512B
5+
Page count: 6
6+
7+
Zoom | Count | Smallest | Largest | Average | Bounding Box
8+
1 | 1 | 495B | 495B | 495B | 0,0,180,85
9+

tests/expected/mbtiles/copy_bindiff_diff.txt

Whitespace-only changes.
Binary file not shown.

tests/test.sh

+43
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,26 @@ validate_log() {
200200
fi
201201
}
202202

203+
compare_sql_dbs() {
204+
DB_FILE="$1"
205+
EXPECTED_DB_FILE="$2"
206+
LOG_FILE="$3"
207+
208+
if ! command -v sqldiff > /dev/null; then
209+
echo "ERROR: sqldiff is required for testing, install it with apt install sqlite3-tools"
210+
exit 1
211+
fi
212+
213+
>&2 echo "Comparing $DB_FILE with the expected $EXPECTED_DB_FILE"
214+
215+
sqldiff "$DB_FILE" "$EXPECTED_DB_FILE" 2>&1 | tee "$LOG_FILE" \
216+
|| {
217+
echo "ERROR: sqldiff failed. To accept changes, run this command:"
218+
echo " cp $DB_FILE $EXPECTED_DB_FILE"
219+
exit 1
220+
}
221+
}
222+
203223
echo "------------------------------------------------------------------------------------------------------------------------"
204224
curl --version
205225
jq --version
@@ -526,7 +546,29 @@ if [[ "$MBTILES_BIN" != "-" ]]; then
526546
$MBTILES_BIN summary "$TEST_TEMP_DIR/world_cities_bindiff_modified.mbtiles" \
527547
2>&1 | tee "$TEST_OUT_DIR/copy_bindiff4.txt"
528548

549+
# See if the stored bindiff file can also be applied to produce the same result
550+
$MBTILES_BIN copy \
551+
./tests/fixtures/mbtiles/world_cities.mbtiles \
552+
--apply-patch ./tests/fixtures/mbtiles/world_cities_bindiff.mbtiles \
553+
"$TEST_TEMP_DIR/world_cities_modified3.mbtiles" \
554+
2>&1 | tee "$TEST_OUT_DIR/copy_bindiff5.txt"
555+
test_log_has_str "$TEST_OUT_DIR/copy_bindiff5.txt" '.*Processing bindiff patches using .* threads...'
556+
557+
# Ensure that world_cities_modified and world_cities_modified3 are identical (regular diff is empty)
558+
$MBTILES_BIN copy \
559+
./tests/fixtures/mbtiles/world_cities_modified.mbtiles \
560+
--diff-with-file "$TEST_TEMP_DIR/world_cities_modified3.mbtiles" \
561+
"$TEST_TEMP_DIR/world_cities_bindiff_modified2.mbtiles" \
562+
2>&1 | tee "$TEST_OUT_DIR/copy_bindiff6.txt"
563+
$MBTILES_BIN summary "$TEST_TEMP_DIR/world_cities_bindiff_modified2.mbtiles" \
564+
2>&1 | tee "$TEST_OUT_DIR/copy_bindiff7.txt"
565+
529566
if command -v sqlite3 > /dev/null; then
567+
568+
compare_sql_dbs "$TEST_TEMP_DIR/world_cities_bindiff.mbtiles" \
569+
./tests/fixtures/mbtiles/world_cities_bindiff.mbtiles \
570+
"$TEST_OUT_DIR/copy_bindiff_diff.txt"
571+
530572
# Apply this diff to the original version of the file
531573
cp ./tests/fixtures/mbtiles/world_cities.mbtiles "$TEST_TEMP_DIR/world_cities_copy.mbtiles"
532574

@@ -553,6 +595,7 @@ if [[ "$MBTILES_BIN" != "-" ]]; then
553595
echo "##### sqlite3 is not installed, skipping apply test #####"
554596
# Copy expected output files as if they were generated by the test
555597
EXPECTED_DIR="$(dirname "$0")/expected/mbtiles"
598+
cp "$EXPECTED_DIR/copy_bindiff_diff.txt" "$TEST_OUT_DIR/copy_bindiff_diff.txt"
556599
cp "$EXPECTED_DIR/copy_diff2.txt" "$TEST_OUT_DIR/copy_diff2.txt"
557600
cp "$EXPECTED_DIR/copy_apply.txt" "$TEST_OUT_DIR/copy_apply.txt"
558601
fi

0 commit comments

Comments
 (0)