gdal/autotest/cpp/testclosedondestroydm.cpp

276 строки
10 KiB
C++

/******************************************************************************
* $Id$
*
* Project: GDAL Core
* Purpose: Test block cache & writing behaviour under multi-threading
* Author: Even Rouault, <even dot rouault at spatialys dot com>
*
******************************************************************************
* Copyright (c) 2011, Even Rouault <even dot rouault at spatialys dot com>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#include "cpl_conv.h"
#include "cpl_string.h"
#include "gdal_alg.h"
#include "gdal_priv.h"
#include "gdal.h"
#include "test_data.h"
#include "gtest_include.h"
namespace
{
// ---------------------------------------------------------------------------
static void OpenJPEG2000(const char *pszFilename)
{
const int N_DRIVERS = 6;
const char *const apszDrivers[] = {"JP2ECW", "JP2OpenJPEG", "JPEG2000",
"JP2MrSID", "JP2KAK", "JP2Lura"};
GDALDriverH aphDrivers[N_DRIVERS];
GDALDatasetH hDS;
int i, j;
for (i = 0; i < N_DRIVERS; i++)
aphDrivers[i] = GDALGetDriverByName(apszDrivers[i]);
for (i = 0; i < N_DRIVERS; i++)
{
if (aphDrivers[i] == nullptr)
continue;
for (j = 0; j < N_DRIVERS; j++)
{
if (i == j || aphDrivers[j] == nullptr)
continue;
GDALDeregisterDriver(aphDrivers[j]);
}
hDS = GDALOpen(pszFilename, GA_ReadOnly);
if (!EQUAL(apszDrivers[i], "JP2Lura") &&
!EQUAL(apszDrivers[i], "JPEG2000"))
{
ASSERT_TRUE(hDS != nullptr);
}
for (j = 0; j < N_DRIVERS; j++)
{
if (i == j || aphDrivers[j] == nullptr)
continue;
GDALRegisterDriver(aphDrivers[j]);
}
}
}
// ---------------------------------------------------------------------------
TEST(testclosedondestroydm, test)
{
int nOvrLevel;
int nBandNum;
GDALDatasetH hDS;
GDALDatasetH hSrcDS;
FILE *f;
const char *pszGDAL_SKIP = CPLGetConfigOption("GDAL_SKIP", nullptr);
if (pszGDAL_SKIP == nullptr)
CPLSetConfigOption("GDAL_SKIP", "GIF");
else
CPLSetConfigOption("GDAL_SKIP", CPLSPrintf("%s GIF", pszGDAL_SKIP));
GDALAllRegister();
hDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GCORE_DATA_DIR "byte.vrt", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/vrt/rgb_warp.vrt", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/nitf/A.TOC", GA_ReadOnly);
hDS = GDALOpen("NITF_TOC_ENTRY:CADRG_ONC_1,000,000_2_0:" GDRIVERS_DIR
"data/nitf/A.TOC",
GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/til/testtil.til", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/rs2/product.xml", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/dimap/METADATA.DIM", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "tmp/cache/file9_j2c.ntf", GA_ReadOnly);
if (hDS)
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
hDS = GDALOpen(GDRIVERS_DIR "data/gif/bug407.gif", GA_ReadOnly);
if (hDS)
{
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
GDALSetCacheMax(0);
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0,
GDALGetRasterXSize(hDS), GDALGetRasterYSize(hDS));
}
/* Create external overviews */
hSrcDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
hDS = GDALCreateCopy(GDALGetDriverByName("GTiff"), "byte.tif", hSrcDS, 0,
nullptr, nullptr, nullptr);
GDALClose(hSrcDS);
hSrcDS = nullptr;
hDS = GDALOpen("byte.tif", GA_ReadOnly);
nOvrLevel = 2;
nBandNum = 1;
CPL_IGNORE_RET_VAL(GDALBuildOverviews(hDS, "NEAR", 1, &nOvrLevel, 1,
&nBandNum, nullptr, nullptr));
GDALClose(hDS);
hDS = GDALOpen("byte.tif", GA_ReadOnly);
GDALGetOverviewCount(GDALGetRasterBand(hDS, 1));
/* Create internal overviews */
hSrcDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
hDS = GDALCreateCopy(GDALGetDriverByName("GTiff"), "byte2.tif", hSrcDS, 0,
nullptr, nullptr, nullptr);
GDALClose(hSrcDS);
hSrcDS = nullptr;
hDS = GDALOpen("byte2.tif", GA_Update);
nOvrLevel = 2;
nBandNum = 1;
CPL_IGNORE_RET_VAL(GDALBuildOverviews(hDS, "NEAR", 1, &nOvrLevel, 1,
&nBandNum, nullptr, nullptr));
GDALClose(hDS);
hDS = GDALOpen("byte2.tif", GA_ReadOnly);
GDALGetOverviewCount(GDALGetRasterBand(hDS, 1));
/* Create external mask */
hSrcDS = GDALOpen(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
hDS = GDALCreateCopy(GDALGetDriverByName("GTiff"), "byte3.tif", hSrcDS, 0,
nullptr, nullptr, nullptr);
GDALClose(hSrcDS);
hSrcDS = nullptr;
hDS = GDALOpen("byte3.tif", GA_ReadOnly);
GDALCreateDatasetMaskBand(hDS, GMF_PER_DATASET);
GDALClose(hDS);
hDS = GDALOpen("byte3.tif", GA_ReadOnly);
GDALGetMaskFlags(GDALGetRasterBand(hDS, 1));
f = fopen("byte.vrt", "wb");
fprintf(f, "%s",
"<VRTDataset rasterXSize=\"20\" rasterYSize=\"20\">"
"<VRTRasterBand dataType=\"Byte\" band=\"1\">"
"<SimpleSource>"
"<SourceFilename relativeToVRT=\"1\">" GCORE_DATA_DIR
"byte.tif</SourceFilename>"
"<SourceBand>1</SourceBand>"
"<SourceProperties RasterXSize=\"20\" RasterYSize=\"20\" "
"DataType=\"Byte\" BlockXSize=\"20\" BlockYSize=\"20\" />"
"<SrcRect xOff=\"0\" yOff=\"0\" xSize=\"20\" ySize=\"20\"/>"
"<DstRect xOff=\"0\" yOff=\"0\" xSize=\"20\" ySize=\"20\"/>"
"</SimpleSource>"
"</VRTRasterBand>"
"</VRTDataset>");
fclose(f);
hDS = GDALOpen("byte.vrt", GA_ReadOnly);
nOvrLevel = 2;
nBandNum = 1;
CPL_IGNORE_RET_VAL(GDALBuildOverviews(hDS, "NEAR", 1, &nOvrLevel, 1,
&nBandNum, nullptr, nullptr));
GDALClose(hDS);
hDS = GDALOpen("byte.vrt", GA_ReadOnly);
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0, GDALGetRasterXSize(hDS),
GDALGetRasterYSize(hDS));
GDALGetOverviewCount(GDALGetRasterBand(hDS, 1));
hDS =
GDALOpen("<VRTDataset rasterXSize=\"20\" rasterYSize=\"20\">"
"<VRTRasterBand dataType=\"Byte\" band=\"1\">"
"<SimpleSource>"
"<SourceFilename relativeToVRT=\"1\">byte.vrt</SourceFilename>"
"<SourceBand>1</SourceBand>"
"<SourceProperties RasterXSize=\"20\" RasterYSize=\"20\" "
"DataType=\"Byte\" BlockXSize=\"20\" BlockYSize=\"20\" />"
"<SrcRect xOff=\"0\" yOff=\"0\" xSize=\"20\" ySize=\"20\"/>"
"<DstRect xOff=\"0\" yOff=\"0\" xSize=\"20\" ySize=\"20\"/>"
"</SimpleSource>"
"</VRTRasterBand>"
"</VRTDataset>",
GA_ReadOnly);
GDALChecksumImage(GDALGetRasterBand(hDS, 1), 0, 0, GDALGetRasterXSize(hDS),
GDALGetRasterYSize(hDS));
hDS = GDALOpenShared(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
hDS = GDALOpenShared(GCORE_DATA_DIR "byte.tif", GA_ReadOnly);
hDS = GDALOpenShared(GDRIVERS_DIR "data/sid/mercator.sid", GA_ReadOnly);
hDS = GDALOpen("RASTERLITE:" GDRIVERS_DIR
"data/rasterlite/rasterlite_pyramids.sqlite,table=test",
GA_ReadOnly);
hDS = GDALOpen(
"RASTERLITE:" GDRIVERS_DIR
"data/rasterlite/rasterlite_pyramids.sqlite,table=test,level=1",
GA_ReadOnly);
OpenJPEG2000(GDRIVERS_DIR "data/jpeg2000/rgbwcmyk01_YeGeo_kakadu.jp2");
hDS = GDALOpen(GDRIVERS_DIR "tmp/cache/Europe 2001_OZF.map", GA_ReadOnly);
CPLDebug("TEST", "Call GDALDestroyDriverManager()");
GDALDestroyDriverManager();
unlink("byte.tif");
unlink("byte.tif.ovr");
unlink("byte2.tif");
unlink("byte3.tif");
unlink("byte3.tif.msk");
unlink("byte.vrt");
unlink("byte.vrt.ovr");
}
} // namespace