/** * AES Function Topic Client test executable * $Id$ * $HeadURL$ * $Author$ */ #include "aes_test_bccontamination.h" #include #include #include namespace AreaEffectSimulation { // must be in pdm.pdm_charge_type static const int s_ChargeTypeId1 = 341; static const int s_ChargeTypeId2 = 342; TestBCContamination::TestBCContamination(QObject *parent) : TestBase("Test.BCContamination", parent) {} bool TestBCContamination::init(int domainId, int exerciseId, int testId) { if (!TestBase::init(domainId, exerciseId, testId)) return false; m_dtc->waitForHistoricalDataBCContamination(); m_bcData.id = -1; connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::bCContaminationChanged, this, &TestBCContamination::bCContaminationChanged); return true; } bool TestBCContamination::checkBaseData(const AreaEffectSimulation::BCContamination &a, const AreaEffectSimulation::BCContamination &b) const { if (!checkAesItem(a, b)) return false; if (a.impactPosition != b.impactPosition) { WARNING_LOG(m_logger) << "impactPosition does not match: " << a.impactPosition << " - " << b.impactPosition; return false; } if (a.impactRadius != b.impactRadius) { WARNING_LOG(m_logger) << "impactRadius does not match: " << a.impactRadius << " - " << b.impactRadius; return false; } return true; } // // BCContamination // void TestBCContamination::tryCreateBCContamination() { m_bcData = AreaEffectSimulation::BCContamination(); AreaEffectSimulation::BCContamination bcData; bcData.id = 0; bcData.name = "chris"; bcData.effectStart = (time(nullptr) + 4) * 1000; // msec bcData.effectDuration = 10234; // msec bcData.chargeStruct.chargeTypeId = 345863487; bcData.impactPosition = Core::GeoPosition2D(0.16, 0.92); bcData.impactRadius = 100; // 100m bcData.partyId = 2; bcData.participantId = 1234; bcData.upperOffset = 6.0; bcData.lowerOffset = -1000.0; INFO_LOG(m_logger) << "trying to send BCContaminationCreateRequest()"; m_replyError = false; m_bExpectedFailure = true; m_bIsCreatedRequest = true; m_expectedAesId = -1; if(!m_ftc->bCContaminationModifyRequest( BCContaminationModifyRequest( 0, bcData.name, bcData.effectStart, bcData.effectDuration, bcData.chargeStruct.chargeTypeId, bcData.impactPosition, bcData.impactRadius, AesWeatherSource::AwsStatic, bcData.partyId, bcData.participantId, dds::core::optional(), // propagationDirection dds::core::optional(), // windSpeed dds::core::optional(), // weatherPosition dds::core::optional(), // weatherTimestamp dds::core::optional(), // externalId bcData.upperOffset, bcData.lowerOffset, dds::core::optional()), this)) { ERROR_LOG(m_logger) << "Error during BCContaminationCreateRequest()"; failExit(); return; } // since the chargeTypeId is not valid, we should get an error if (!waitForData([this]() { return m_replyError == true; })) { ERROR_LOG(m_logger) << "Error creating bc contamination object (try with error)"; failExit(); return; } // now with correct charge type m_bExpectedFailure = false; m_bIsCreatedRequest = true; m_expectedAesId = -1; bcData.chargeStruct.chargeTypeId = s_ChargeTypeId1; if (!m_ftc->bCContaminationModifyRequest( BCContaminationModifyRequest( 0, bcData.name, bcData.effectStart, bcData.effectDuration, bcData.chargeStruct.chargeTypeId, bcData.impactPosition, bcData.impactRadius, AesWeatherSource::AwsStatic, bcData.partyId, bcData.participantId, dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), bcData.upperOffset, bcData.lowerOffset, dds::core::optional()), this)) { ERROR_LOG(m_logger) << "Error during BCContaminationCreateRequest()"; failExit(); return; } if (!waitForData([this]() { return m_bcData.id == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error creating bc contamination object"; failExit(); return; } if (!checkBaseData(m_bcData, bcData)) { ERROR_LOG(m_logger) << "Creation data does not match published data"; failExit(); return; } QTimer::singleShot(0, this, &TestBCContamination::tryModifyBCContamination); INFO_LOG(m_logger) << "tryCreateBCContamination successful"; } void TestBCContamination::tryModifyBCContamination() { INFO_LOG(m_logger) << "trying to send modify request"; m_bcData.name = "chris2"; m_bcData.effectStart = m_bcData.effectStart.get() + 2000; m_bcData.effectDuration = 3200; // msec m_bcData.chargeStruct.chargeTypeId = s_ChargeTypeId2; m_bcData.impactPosition = Core::GeoPosition2D(0.17, 0.93); m_bcData.partyId = 3; m_bcData.participantId = 1235; m_bcData.upperOffset = 6.0; m_bcData.lowerOffset = false; const AreaEffectSimulation::BCContamination bcData(m_bcData); m_bcData = AreaEffectSimulation::BCContamination(); m_bcData.id = bcData.id; m_bIsCreatedRequest = false; if (!m_ftc->bCContaminationModifyRequest( BCContaminationModifyRequest( bcData.id, bcData.name, bcData.effectStart, bcData.effectDuration, bcData.chargeStruct.chargeTypeId, bcData.impactPosition, bcData.impactRadius, AesWeatherSource::AwsStatic, bcData.partyId, bcData.participantId, dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), bcData.upperOffset, bcData.lowerOffset, dds::core::optional()), this)) { ERROR_LOG(m_logger) << "Error requesting modify data"; failExit(); return; } if (!waitForData([this]() { return m_bcData.chargeStruct.chargeTypeId == s_ChargeTypeId2;})) { ERROR_LOG(m_logger) << "Error updating bc contamination object"; failExit(); return; } if (!checkBaseData(m_bcData, bcData)) { ERROR_LOG(m_logger) << "Modify data does not match published data"; failExit(); return; } QTimer::singleShot(0, this, &TestBCContamination::waitExpireBCContamination); INFO_LOG(m_logger) << "tryModifyBCContamination successful"; } void TestBCContamination::waitExpireBCContamination() { INFO_LOG(m_logger) << "waiting until bc contamination expires"; if (!waitForData([this]() { return m_bcData.effectStateId == AreaEffectSimulation::AesEffectState::EsExpired;})) { ERROR_LOG(m_logger) << "Timeout waiting for expiry of bc contamination with id " << m_bcData.id; failExit(); return; } QTimer::singleShot(0, this, &TestBCContamination::tryRemoveBCContamination); INFO_LOG(m_logger) << "waitExpireBCContamination successful"; } void TestBCContamination::tryRemoveBCContamination() { INFO_LOG(m_logger) << "tryRemoveBCContamination start"; AreaEffectSimulation::BCContamination bcData(m_bcData); bcData.name = "RemoveTest"; bcData.effectStart = 0; // not set m_bcData = AreaEffectSimulation::BCContamination(); m_expectedAesId = -1; m_bIsCreatedRequest = true; bcData.upperOffset = 6.0; bcData.lowerOffset = false; if (!m_ftc->bCContaminationModifyRequest( BCContaminationModifyRequest( 0, bcData.name, bcData.effectStart, bcData.effectDuration, bcData.chargeStruct.chargeTypeId, bcData.impactPosition, bcData.impactRadius, AesWeatherSource::AwsStatic, bcData.partyId, bcData.participantId, dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), dds::core::optional(), bcData.upperOffset, bcData.lowerOffset, dds::core::optional()), this)) { ERROR_LOG(m_logger) << "Error during bCContaminationModifyRequest()"; failExit(); return; } if (!waitForData([this]() { return m_bcData.id == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error creating bc contamination object"; failExit(); return; } m_expectedAesId = -1; if (!m_ftc->bCContaminationRemoveRequest(Core::RemoveElementRequest(m_bcData.id), this)) { ERROR_LOG(m_logger) << "Error during BCContaminationRemoveRequest()"; failExit(); return; } if (!waitForData([this]() { return m_bcData.id == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error removing bc contamination object"; failExit(); return; } QTimer::singleShot(0, qApp, &QCoreApplication::quit); INFO_LOG(m_logger) << "tryRemoveBCContamination successful"; } void TestBCContamination::bCContaminationChanged(const AreaEffectSimulation::BCContamination &data, DataModification modType) { if (m_bcData.id == -1) return; onAesChanged(data, modType, m_bcData); } void TestBCContamination::onBCContaminationModifyReply(const Core::FunctionReplyObject &replyObject) { if (m_bIsCreatedRequest) onAesCreateReply(replyObject); else onAesModifyReply(replyObject); } void TestBCContamination::onBCContaminationRemoveReply(const Core::FunctionReplyObject &replyObject) { onAesRemoveReply(replyObject); } } // namespace AreaEffectSimulation // ------------------------------------------------------------------ int main(int argc, char **argv) { return AreaEffectSimulation::mainBase(argc, argv, []() { return new AreaEffectSimulation::TestBCContamination; }); }