mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-20 20:23:03 +02:00
Fixed random map format test crash
This commit is contained in:
parent
bb0f388f23
commit
02ae95aca3
@ -7,7 +7,7 @@
|
|||||||
* Full text of license available in license.txt file, in main folder
|
* Full text of license available in license.txt file, in main folder
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "CZipSaver.h"
|
#include "CZipSaver.h"
|
||||||
|
|
||||||
@ -17,10 +17,10 @@ CZipOutputStream::CZipOutputStream(CZipSaver * owner_, zipFile archive, const st
|
|||||||
owner(owner_)
|
owner(owner_)
|
||||||
{
|
{
|
||||||
zip_fileinfo fileInfo;
|
zip_fileinfo fileInfo;
|
||||||
|
|
||||||
std::time_t t = time(nullptr);
|
std::time_t t = time(nullptr);
|
||||||
fileInfo.dosDate = 0;
|
fileInfo.dosDate = 0;
|
||||||
|
|
||||||
struct tm * localTime = std::localtime(&t);
|
struct tm * localTime = std::localtime(&t);
|
||||||
fileInfo.tmz_date.tm_hour = localTime->tm_hour;
|
fileInfo.tmz_date.tm_hour = localTime->tm_hour;
|
||||||
fileInfo.tmz_date.tm_mday = localTime->tm_mday;
|
fileInfo.tmz_date.tm_mday = localTime->tm_mday;
|
||||||
@ -28,10 +28,10 @@ CZipOutputStream::CZipOutputStream(CZipSaver * owner_, zipFile archive, const st
|
|||||||
fileInfo.tmz_date.tm_mon = localTime->tm_mon;
|
fileInfo.tmz_date.tm_mon = localTime->tm_mon;
|
||||||
fileInfo.tmz_date.tm_sec = localTime->tm_sec;
|
fileInfo.tmz_date.tm_sec = localTime->tm_sec;
|
||||||
fileInfo.tmz_date.tm_year = localTime->tm_year;
|
fileInfo.tmz_date.tm_year = localTime->tm_year;
|
||||||
|
|
||||||
fileInfo.external_fa = 0; //???
|
fileInfo.external_fa = 0; //???
|
||||||
fileInfo.internal_fa = 0;
|
fileInfo.internal_fa = 0;
|
||||||
|
|
||||||
int status = zipOpenNewFileInZip4_64(
|
int status = zipOpenNewFileInZip4_64(
|
||||||
handle,
|
handle,
|
||||||
archiveFilename.c_str(),
|
archiveFilename.c_str(),
|
||||||
@ -53,10 +53,10 @@ CZipOutputStream::CZipOutputStream(CZipSaver * owner_, zipFile archive, const st
|
|||||||
0,//flagBase
|
0,//flagBase
|
||||||
0//zip64
|
0//zip64
|
||||||
);
|
);
|
||||||
|
|
||||||
if(status != ZIP_OK)
|
if(status != ZIP_OK)
|
||||||
throw new std::runtime_error("CZipOutputStream: zipOpenNewFileInZip failed");
|
throw new std::runtime_error("CZipOutputStream: zipOpenNewFileInZip failed");
|
||||||
|
|
||||||
owner->activeStream = this;
|
owner->activeStream = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ CZipOutputStream::~CZipOutputStream()
|
|||||||
si64 CZipOutputStream::write(const ui8 * data, si64 size)
|
si64 CZipOutputStream::write(const ui8 * data, si64 size)
|
||||||
{
|
{
|
||||||
int ret = zipWriteInFileInZip(handle, (const void*)data, (unsigned)size);
|
int ret = zipWriteInFileInZip(handle, (const void*)data, (unsigned)size);
|
||||||
|
|
||||||
if (ret == ZIP_OK)
|
if (ret == ZIP_OK)
|
||||||
return size;
|
return size;
|
||||||
else
|
else
|
||||||
@ -79,41 +79,41 @@ si64 CZipOutputStream::write(const ui8 * data, si64 size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
///CZipSaver
|
///CZipSaver
|
||||||
CZipSaver::CZipSaver(std::shared_ptr<CIOApi> api, const std::string & path):
|
CZipSaver::CZipSaver(std::shared_ptr<CIOApi> api, const boost::filesystem::path & path):
|
||||||
ioApi(api),
|
ioApi(api),
|
||||||
zipApi(ioApi->getApiStructure()),
|
zipApi(ioApi->getApiStructure()),
|
||||||
handle(nullptr),
|
handle(nullptr),
|
||||||
activeStream(nullptr)
|
activeStream(nullptr)
|
||||||
{
|
{
|
||||||
handle = zipOpen2_64(path.c_str(), APPEND_STATUS_CREATE, nullptr, &zipApi);
|
handle = zipOpen2_64((const void *) & path, APPEND_STATUS_CREATE, nullptr, &zipApi);
|
||||||
|
|
||||||
if (handle == nullptr)
|
if (handle == nullptr)
|
||||||
throw new std::runtime_error("CZipSaver: Failed to create archive");
|
throw new std::runtime_error("CZipSaver: Failed to create archive");
|
||||||
}
|
}
|
||||||
|
|
||||||
CZipSaver::~CZipSaver()
|
CZipSaver::~CZipSaver()
|
||||||
{
|
{
|
||||||
if(activeStream != nullptr)
|
if(activeStream != nullptr)
|
||||||
{
|
{
|
||||||
logGlobal->error("CZipSaver::~CZipSaver: active stream found");
|
logGlobal->error("CZipSaver::~CZipSaver: active stream found");
|
||||||
zipCloseFileInZip(handle);
|
zipCloseFileInZip(handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(handle != nullptr)
|
if(handle != nullptr)
|
||||||
{
|
{
|
||||||
int status = zipClose(handle, nullptr);
|
int status = zipClose(handle, nullptr);
|
||||||
if (status != ZIP_OK)
|
if (status != ZIP_OK)
|
||||||
logGlobal->errorStream() << "CZipSaver: archive finalize failed: "<<status;
|
logGlobal->errorStream() << "CZipSaver: archive finalize failed: "<<status;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<COutputStream> CZipSaver::addFile(const std::string & archiveFilename)
|
std::unique_ptr<COutputStream> CZipSaver::addFile(const std::string & archiveFilename)
|
||||||
{
|
{
|
||||||
if(activeStream != nullptr)
|
if(activeStream != nullptr)
|
||||||
throw new std::runtime_error("CZipSaver::addFile: stream already opened");
|
throw new std::runtime_error("CZipSaver::addFile: stream already opened");
|
||||||
|
|
||||||
std::unique_ptr<COutputStream> stream(new CZipOutputStream(this, handle, archiveFilename));
|
std::unique_ptr<COutputStream> stream(new CZipOutputStream(this, handle, archiveFilename));
|
||||||
return std::move(stream);
|
return std::move(stream);
|
||||||
}
|
}
|
||||||
|
@ -23,16 +23,16 @@ public:
|
|||||||
* @brief constructs zip stream from already opened file
|
* @brief constructs zip stream from already opened file
|
||||||
* @param archive archive handle, must be opened
|
* @param archive archive handle, must be opened
|
||||||
* @param archiveFilename name of file to write
|
* @param archiveFilename name of file to write
|
||||||
*/
|
*/
|
||||||
explicit CZipOutputStream(CZipSaver * owner_, zipFile archive, const std::string & archiveFilename);
|
explicit CZipOutputStream(CZipSaver * owner_, zipFile archive, const std::string & archiveFilename);
|
||||||
~CZipOutputStream();
|
~CZipOutputStream();
|
||||||
|
|
||||||
si64 write(const ui8 * data, si64 size) override;
|
si64 write(const ui8 * data, si64 size) override;
|
||||||
|
|
||||||
si64 seek(si64 position) override {return -1;};
|
si64 seek(si64 position) override {return -1;};
|
||||||
si64 tell() override {return 0;};
|
si64 tell() override {return 0;};
|
||||||
si64 skip(si64 delta) override {return 0;};
|
si64 skip(si64 delta) override {return 0;};
|
||||||
si64 getSize() override {return 0;};
|
si64 getSize() override {return 0;};
|
||||||
private:
|
private:
|
||||||
zipFile handle;
|
zipFile handle;
|
||||||
CZipSaver * owner;
|
CZipSaver * owner;
|
||||||
@ -40,17 +40,17 @@ private:
|
|||||||
|
|
||||||
class DLL_LINKAGE CZipSaver
|
class DLL_LINKAGE CZipSaver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit CZipSaver(std::shared_ptr<CIOApi> api, const std::string & path);
|
explicit CZipSaver(std::shared_ptr<CIOApi> api, const boost::filesystem::path & path);
|
||||||
virtual ~CZipSaver();
|
virtual ~CZipSaver();
|
||||||
|
|
||||||
std::unique_ptr<COutputStream> addFile(const std::string & archiveFilename);
|
std::unique_ptr<COutputStream> addFile(const std::string & archiveFilename);
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<CIOApi> ioApi;
|
std::shared_ptr<CIOApi> ioApi;
|
||||||
zlib_filefunc64_def zipApi;
|
zlib_filefunc64_def zipApi;
|
||||||
|
|
||||||
zipFile handle;
|
zipFile handle;
|
||||||
|
|
||||||
///due to minizip design only one file stream may opened at a time
|
///due to minizip design only one file stream may opened at a time
|
||||||
COutputStream * activeStream;
|
COutputStream * activeStream;
|
||||||
friend class CZipOutputStream;
|
friend class CZipOutputStream;
|
||||||
|
@ -204,7 +204,7 @@ zlib_filefunc64_def CProxyROIOApi::getApiStructure()
|
|||||||
|
|
||||||
CInputStream * CProxyROIOApi::openFile(const boost::filesystem::path& filename, int mode)
|
CInputStream * CProxyROIOApi::openFile(const boost::filesystem::path& filename, int mode)
|
||||||
{
|
{
|
||||||
logGlobal->traceStream() << "CProxyIOApi: stream opened for " <<filename.string() <<" with mode "<<mode;
|
logGlobal->traceStream() << "CProxyROIOApi: stream opened for " <<filename.string() <<" with mode "<<mode;
|
||||||
|
|
||||||
data->seek(0);
|
data->seek(0);
|
||||||
return data;
|
return data;
|
||||||
|
@ -21,7 +21,9 @@
|
|||||||
#include "../lib/CRandomGenerator.h"
|
#include "../lib/CRandomGenerator.h"
|
||||||
#include "../lib/VCMI_Lib.h"
|
#include "../lib/VCMI_Lib.h"
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(CMapEditManager_DrawTerrain_Type)
|
BOOST_AUTO_TEST_SUITE(CMapEditManager_Suite)
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(DrawTerrain_Type)
|
||||||
{
|
{
|
||||||
logGlobal->info("CMapEditManager_DrawTerrain_Type start");
|
logGlobal->info("CMapEditManager_DrawTerrain_Type start");
|
||||||
try
|
try
|
||||||
@ -110,7 +112,7 @@ BOOST_AUTO_TEST_CASE(CMapEditManager_DrawTerrain_Type)
|
|||||||
logGlobal->info("CMapEditManager_DrawTerrain_Type finish");
|
logGlobal->info("CMapEditManager_DrawTerrain_Type finish");
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(CMapEditManager_DrawTerrain_View)
|
BOOST_AUTO_TEST_CASE(DrawTerrain_View)
|
||||||
{
|
{
|
||||||
logGlobal->info("CMapEditManager_DrawTerrain_View start");
|
logGlobal->info("CMapEditManager_DrawTerrain_View start");
|
||||||
try
|
try
|
||||||
@ -178,3 +180,5 @@ BOOST_AUTO_TEST_CASE(CMapEditManager_DrawTerrain_View)
|
|||||||
}
|
}
|
||||||
logGlobal->info("CMapEditManager_DrawTerrain_View finish");
|
logGlobal->info("CMapEditManager_DrawTerrain_View finish");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
|
|
||||||
static const int TEST_RANDOM_SEED = 1337;
|
static const int TEST_RANDOM_SEED = 1337;
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(MapFormat_Random)
|
BOOST_AUTO_TEST_SUITE(MapFormat_Suite)
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(Random)
|
||||||
{
|
{
|
||||||
logGlobal->info("MapFormat_Random start");
|
logGlobal->info("MapFormat_Random start");
|
||||||
BOOST_TEST_CHECKPOINT("MapFormat_Random start");
|
BOOST_TEST_CHECKPOINT("MapFormat_Random start");
|
||||||
@ -115,7 +117,7 @@ static void addToArchive(CZipSaver & saver, const JsonNode & data, const std::st
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(MapFormat_Objects)
|
BOOST_AUTO_TEST_CASE(Objects)
|
||||||
{
|
{
|
||||||
logGlobal->info("MapFormat_Objects start");
|
logGlobal->info("MapFormat_Objects start");
|
||||||
|
|
||||||
@ -202,3 +204,5 @@ BOOST_AUTO_TEST_CASE(MapFormat_Objects)
|
|||||||
|
|
||||||
logGlobal->info("MapFormat_Objects finish");
|
logGlobal->info("MapFormat_Objects finish");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
@ -9,44 +9,45 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
||||||
#include "../lib/filesystem/CMemoryBuffer.h"
|
#include "../lib/filesystem/CMemoryBuffer.h"
|
||||||
|
|
||||||
|
|
||||||
struct CMemoryBufferFixture
|
struct CMemoryBufferFixture
|
||||||
{
|
{
|
||||||
CMemoryBuffer subject;
|
CMemoryBuffer subject;
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(CMemoryBuffer_Empty, CMemoryBufferFixture)
|
BOOST_AUTO_TEST_SUITE(CMemoryBuffer_Suite)
|
||||||
|
|
||||||
|
BOOST_FIXTURE_TEST_CASE(empty, CMemoryBufferFixture)
|
||||||
{
|
{
|
||||||
BOOST_REQUIRE_EQUAL(0, subject.tell());
|
BOOST_REQUIRE_EQUAL(0, subject.tell());
|
||||||
BOOST_REQUIRE_EQUAL(0, subject.getSize());
|
BOOST_REQUIRE_EQUAL(0, subject.getSize());
|
||||||
|
|
||||||
si32 dummy = 1337;
|
si32 dummy = 1337;
|
||||||
|
|
||||||
auto ret = subject.read((ui8 *)&dummy, sizeof(si32));
|
auto ret = subject.read((ui8 *)&dummy, sizeof(si32));
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL(0, ret);
|
BOOST_CHECK_EQUAL(0, ret);
|
||||||
BOOST_CHECK_EQUAL(1337, dummy);
|
BOOST_CHECK_EQUAL(1337, dummy);
|
||||||
BOOST_CHECK_EQUAL(0, subject.tell());
|
BOOST_CHECK_EQUAL(0, subject.tell());
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_CASE(CMemoryBuffer_Write, CMemoryBufferFixture)
|
BOOST_FIXTURE_TEST_CASE(write, CMemoryBufferFixture)
|
||||||
{
|
{
|
||||||
const si32 initial = 1337;
|
const si32 initial = 1337;
|
||||||
|
|
||||||
subject.write((const ui8 *)&initial, sizeof(si32));
|
subject.write((const ui8 *)&initial, sizeof(si32));
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL(4, subject.tell());
|
BOOST_CHECK_EQUAL(4, subject.tell());
|
||||||
subject.seek(0);
|
subject.seek(0);
|
||||||
BOOST_CHECK_EQUAL(0, subject.tell());
|
BOOST_CHECK_EQUAL(0, subject.tell());
|
||||||
|
|
||||||
si32 current = 0;
|
si32 current = 0;
|
||||||
auto ret = subject.read((ui8 *)¤t, sizeof(si32));
|
auto ret = subject.read((ui8 *)¤t, sizeof(si32));
|
||||||
BOOST_CHECK_EQUAL(sizeof(si32), ret);
|
BOOST_CHECK_EQUAL(sizeof(si32), ret);
|
||||||
BOOST_CHECK_EQUAL(initial, current);
|
BOOST_CHECK_EQUAL(initial, current);
|
||||||
BOOST_CHECK_EQUAL(4, subject.tell());
|
BOOST_CHECK_EQUAL(4, subject.tell());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
Loading…
Reference in New Issue
Block a user