diff --git a/ci/test_mapserver_image.sh b/ci/test_mapserver_image.sh index d9aaf2c5cdde393b17f3ec5302c72c4040a4fd4b..9e3bd81d496c5dd2eb5cb969bf960326e25f450b 100755 --- a/ci/test_mapserver_image.sh +++ b/ci/test_mapserver_image.sh @@ -30,8 +30,9 @@ C01_ISOTIME="2022-03-02T19:40:32" base_tmp_dir="__TOBECREATED__" setup_test() { - base_tmp_dir=$(mktemp -d --suffix="-geotiffs") + base_tmp_dir=$(mktemp -d ${TMPDIR:-/tmp}/mapserver-tests-XXXXXXX) cd "${base_tmp_dir}" + chmod 777 . echo "Temporary directory: ${base_tmp_dir}" docker network create ${NETWORK_NAME} @@ -54,21 +55,23 @@ graceful_exit() { add_shapefile_content() { debug "Creating fake shapefile directory for C01" - docker exec test mkdir -p /data/tiles/g16/abi/radf/C01 + gtiff_location=$1 + docker exec test bash -c "mkdir -p /data/tiles/g16/abi/radf/C01; chmod -R a+rwX /data/tiles" debug "Creating fake shapefile file for C01" docker exec -i test python3 <<EOF import fiona from shapely.geometry import mapping, box +from glob import glob s_file = fiona.open('/data/tiles/g16/abi/radf/C01/C01.shp', 'w', driver='ESRI Shapefile', schema={'geometry': 'Polygon', 'properties': {'location': 'str', 'time': 'str:19'}}) -bbox = mapping(box(-50000, -50000, 50000, 50000)) +bbox = mapping(box(-25000000, -25000000, 25000000, 25000000)) s_file.write({ "geometry": bbox, "properties": { - "location": "/data/tiles/g16/abi/radf/${C01_GTIFF_NAME}", + "location": "${gtiff_location}", "time": "${C01_ISOTIME}", }, }) @@ -98,13 +101,14 @@ EOF add_postgres_content() { debug "Creating values for fake DB row for C01" + gtiff_location=$1 insert_values=$(docker exec -i test python3 <<EOF from shapely.geometry import box from shapely import wkb dt_str = "${C01_ISOTIME}" -location = "/data/tiles/g16/abi/radf/${C01_GTIFF_NAME}" -bbox = box(-50000, -50000, 50000, 50000) +location = "${gtiff_location}" +bbox = box(-25000000, -25000000, 25000000, 25000000) bbox_wkb = wkb.dumps(bbox, hex=True, srid=930916) values = (dt_str, location, bbox_wkb) print(repr(values)) @@ -118,9 +122,29 @@ INSERT into g16_abi_radf_l1b_c01 (start_time, location, bbox_geometry) EOF } +create_fake_geotiff() { + bucket_name="g16_abi_radf_l1b_C01" + mkdir -p "${bucket_name}" + gtiff_fn="${bucket_name}/${C01_GTIFF_NAME}" + docker exec -i test python3 <<EOF +import rasterio +from rasterio.transform import Affine +import numpy as np + +transform = Affine.translation(-2500 * 1000 - 500, 2500 * 1000 - 500) * Affine.scale(1000, 1000) +with rasterio.open("/data/${gtiff_fn}", "w", driver='GTiff', height=5000, width=5000, dtype=np.uint8, count=1, + crs="+proj=geos +sweep=x +lon_0=-75.0 +h=35786023 +x_0=0 +y_0=0 +ellps=GRS80 +units=m +no_defs", transform=transform) as gtiff_file: + data = np.repeat(np.linspace(0, 255, 5000, dtype=np.uint8)[None, :], 5000, axis=0) + gtiff_file.write(data, 1) +EOF + creation_status=$? + echo ${gtiff_fn} + return $creation_status +} + start_test_container() { debug "Starting test docker container (${image_url}:${image_tag})..." - docker run --rm -d --network ${NETWORK_NAME} --name test -p 8888:80 $@ ${image_url}:${image_tag} + docker run --rm -d --network ${NETWORK_NAME} --name test -p 8888:80 -v "$(pwd)":"/data" $@ ${image_url}:${image_tag} start_status=$? # just wait a bit to let the server start sleep 2 @@ -188,15 +212,31 @@ curl_layer_times() { } curl_empty_tile() { - debug "Starting curl basic mapfile request..." + debug "Starting curl basic mapfile request for non-existent tile..." # NOTE: The time doesn't actually exist and no image data is available. A blank image should be returned - curl --fail -sS -o "empty_tile.png" "http://localhost:8888/wms/g16/abi/radf/l1b?VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&STYLES=&BBOX=-1330667.479176%2c-2773559.926648%2c2773559.926648%2c1330667.479176&WIDTH=256&HEIGHT=256&FORMAT=rgba&SRS=EPSG%3a930916&LAYERS=C01&TIME=2022-04-20T16:00:21Z" >/dev/null || pg_exit_status=1 - check_image_content "empty_tile.png" 0 + curl --fail -sS -o "empty_tile.png" "http://localhost:8888/wms/g16/abi/radf/l1b?VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&STYLES=&BBOX=-2500000%2c-2500000%2c2500000%2c2500000&WIDTH=256&HEIGHT=256&FORMAT=rgba&SRS=EPSG%3a930916&LAYERS=C01&TIME=2022-04-20T16:00:12Z" >/dev/null + cp empty_tile.png /tmp/empty_tile_test.png + check_image_content "empty_tile.png" 1 +} + +curl_valid_tile() { + debug "Starting curl basic mapfile request for valid tile..." + curl --fail -sS -o "valid_tile.png" "http://localhost:8888/wms/g16/abi/radf/l1b?VERSION=1.1.1&REQUEST=GetMap&SERVICE=WMS&STYLES=&BBOX=-2500000%2c-2500000%2c2500000%2c2500000&WIDTH=256&HEIGHT=256&FORMAT=rgba&SRS=EPSG%3a930916&LAYERS=C01&TIME=${C01_ISOTIME}Z" >/dev/null + cp valid_tile.png /tmp/valid_tile.png + check_image_content "valid_tile.png" 0 } check_image_content() { img_filename=$1 - pixel_value=$2 + all_zero=$2 + # if it is an XML file then it wasn't a successful download + grep_found_xml=1 + grep "<?xml" $img_filename || grep_found_xml=0 + if [[ $grep_found_xml -ne 0 ]]; then + error "Image being checked is XML file" + cat $img_filename + return 1 + fi docker exec -i test pip install pillow >/dev/null incontainer_file="/tmp/$(basename $img_filename)" docker cp $img_filename test:${incontainer_file} @@ -211,7 +251,12 @@ from PIL import Image img = Image.open("${incontainer_file}") img_arr = np.asarray(img) assert img_arr.shape == (256, 256, 4) -assert (img_arr[:, :, :3] == ${pixel_value}).all() +if ${all_zero} == 1: + print("\tChecking RGB data is all 0s") + assert (img_arr[:, :, :3] == 0).all() +else: + print("\tChecking RGB data is not all 0s") + assert (img_arr[:, :, :3] != 0).any() EOF } @@ -220,11 +265,13 @@ run_basic_shapefile_tests() { setup_test debug "Starting shapefile tests..." start_test_container - add_shapefile_content + gtiff_fn="/data/$(create_fake_geotiff)" + add_shapefile_content "${gtiff_fn}" curl_index curl_layer_times "[\"${C01_ISOTIME}\"]" curl_empty_tile + curl_valid_tile teardown_test debug "SUCCESS: Shapefile test completed successfully" } @@ -234,16 +281,16 @@ run_basic_postgres_tests() { debug "Starting postgres tests..." start_postgres start_pg_test_container - add_shapefile_content + gtiff_fn="/data/$(create_fake_geotiff)" + add_shapefile_content "${gtiff_fn}" add_postgres_projections add_postgres_tables - add_postgres_content - # TODO: Verify empty tile is empty - # TODO: Add fake geotiff and tile check for inserted time and verify non-empty result + add_postgres_content "${gtiff_fn}" curl_index curl_layer_times "[\"${C01_ISOTIME}\"]" curl_empty_tile + curl_valid_tile debug "SUCCESS: Postgres test completed successfully" teardown_test }