/** * AES Function Topic Client test executable * $Id$ * $HeadURL$ * $Author$ */ #include "aes_test_ncontamination.h" #include #include #include namespace AreaEffectSimulation { // must be in pdm.pdm_charge_type static const int s_ChargeTypeId1 = 321; TestNContamination::TestNContamination(QObject *parent) : TestBase("Test.NContamination", parent) {} bool TestNContamination::init(int domainId, int exerciseId, int testId) { if (!TestBase::init(domainId, exerciseId, testId)) return false; m_dtc->waitForHistoricalDataNContamination(); m_ncData.id(-1); connect(m_dtc.get(), &AreaEffectSimulation::Interface::Dtc::nContaminationChanged, this, &TestNContamination::nContaminationChanged); return true; } bool TestNContamination::checkBaseData(const AreaEffectSimulation::NContamination &a, const AreaEffectSimulation::NContamination &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; } return true; } // // NContamination // void TestNContamination::tryCreateNContamination() { m_ncData = AreaEffectSimulation::NContamination(); AreaEffectSimulation::NContamination ncData; ncData.id(0); ncData.name("ncont1"); ncData.effectStart((time(nullptr) + 4) * 1000); // msec ncData.effectDuration(10000); // 10 sec ncData.chargeStruct().chargeTypeId(345863487); ncData.impactPosition(Core::GeoPosition2D(0.16, 0.92)); ncData.borderLengthInner(1000); // 1km ncData.borderLengthOuter(2000); // 2km ncData.impactRadius(500); // 500m ncData.spanAngle(31); ncData.rotationAngle(57); ncData.detonationValue(1000); // kt, only cosmetical ncData.partyId(7); ncData.participantId(1234); INFO_LOG(m_logger) << "trying to send NContaminationCreateRequest()"; m_replyError = false; m_bExpectedFailure = true; m_bIsCreatedRequest = true; if (!m_ftc->nContaminationModifyRequest( NContaminationModifyRequest( 0, ncData.name(), ncData.effectStart(), ncData.effectDuration(), ncData.chargeStruct().chargeTypeId(), ncData.impactPosition(), ncData.borderLengthInner(), ncData.borderLengthOuter(), ncData.impactRadius(), ncData.spanAngle(), ncData.rotationAngle(), ncData.detonationValue(), ncData.weatherSource(), ncData.partyId(), ncData.participantId(), ncData.externalId()), this)) { ERROR_LOG(m_logger) << "Error during NContaminationCreateRequest()"; 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 ncontamination object (try with error)"; failExit(); return; } m_bExpectedFailure = false; m_expectedAesId = -1; m_bIsCreatedRequest = true; // now with correct charge type ncData.chargeStruct().chargeTypeId(s_ChargeTypeId1); if (!m_ftc->nContaminationModifyRequest( NContaminationModifyRequest( 0, ncData.name(), ncData.effectStart(), ncData.effectDuration(), ncData.chargeStruct().chargeTypeId(), ncData.impactPosition(), ncData.borderLengthInner(), ncData.borderLengthOuter(), ncData.impactRadius(), ncData.spanAngle(), ncData.rotationAngle(), ncData.detonationValue(), ncData.weatherSource(), ncData.partyId(), ncData.participantId(), ncData.externalId()), this)) { ERROR_LOG(m_logger) << "Error during NContaminationCreateRequest()"; failExit(); return; } if (!waitForData([this]() { return m_ncData.id() == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error creating ncontamination object"; failExit(); return; } if (!checkBaseData(m_ncData, ncData)) { ERROR_LOG(m_logger) << "Creation data does not match published data"; failExit(); return; } QTimer::singleShot(0, this, &TestNContamination::tryModifyNContamination); INFO_LOG(m_logger) << "tryCreateNContamination successful"; } void TestNContamination::tryModifyNContamination() { INFO_LOG(m_logger) << "trying to send modify request"; m_ncData.name("ncont2"); m_ncData.effectStart((time(nullptr) + 4) * 1000); // msec m_ncData.effectDuration(3000); // 3 sec m_ncData.chargeStruct().chargeTypeId(s_ChargeTypeId1); m_ncData.impactPosition(Core::GeoPosition2D(0.162, 0.925)); m_ncData.borderLengthInner(1100); // 1.1km m_ncData.borderLengthOuter(1800); // 1.8km m_ncData.impactRadius(600); // 600m m_ncData.spanAngle(14); m_ncData.rotationAngle(187); m_ncData.detonationValue(2000); // kt, only cosmetical m_ncData.partyId(3); m_ncData.participantId(1235); const AreaEffectSimulation::NContamination ncData(m_ncData); m_ncData = AreaEffectSimulation::NContamination(); m_ncData.id(ncData.id()); m_bIsCreatedRequest = false; if (!m_ftc->nContaminationModifyRequest( NContaminationModifyRequest( ncData.id(), ncData.name(), ncData.effectStart(), ncData.effectDuration(), ncData.chargeStruct().chargeTypeId(), ncData.impactPosition(), ncData.borderLengthInner(), ncData.borderLengthOuter(), ncData.impactRadius(), ncData.spanAngle(), ncData.rotationAngle(), ncData.detonationValue(), ncData.weatherSource(), ncData.partyId(), ncData.participantId(), ncData.externalId()), this)) { ERROR_LOG(m_logger) << "Error requesting modify data"; failExit(); return; } if (!waitForData([this]() { return m_ncData.partyId() == 3;})) { ERROR_LOG(m_logger) << "Error updating ncontamination object"; failExit(); return; } if (!checkBaseData(m_ncData, ncData)) { ERROR_LOG(m_logger) << "Modify data does not match published data"; failExit(); return; } QTimer::singleShot(0, this, &TestNContamination::waitExpireNContamination); INFO_LOG(m_logger) << "tryModifyNContamination successful"; } void TestNContamination::waitExpireNContamination() { INFO_LOG(m_logger) << "waiting until ncontamination expires"; if (!waitForData([this]() { return m_ncData.effectStateId() == AreaEffectSimulation::AesEffectState::EsExpired;})) { ERROR_LOG(m_logger) << "Timeout waiting for expiry of ncontamination with id " << m_ncData.id(); failExit(); return; } QTimer::singleShot(0, this, &TestNContamination::tryRemoveNContamination); INFO_LOG(m_logger) << "waitExpireNContamination successful"; } void TestNContamination::tryRemoveNContamination() { INFO_LOG(m_logger) << "tryRemoveNContamination start"; AreaEffectSimulation::NContamination ncData(m_ncData); ncData.name("RemoveTest"); ncData.effectStart(0); // not set m_ncData = AreaEffectSimulation::NContamination(); m_expectedAesId = -1; m_bIsCreatedRequest = true; if (!m_ftc->nContaminationModifyRequest( NContaminationModifyRequest( 0, ncData.name(), ncData.effectStart(), ncData.effectDuration(), ncData.chargeStruct().chargeTypeId(), ncData.impactPosition(), ncData.borderLengthInner(), ncData.borderLengthOuter(), ncData.impactRadius(), ncData.spanAngle(), ncData.rotationAngle(), ncData.detonationValue(), ncData.weatherSource(), ncData.partyId(), ncData.participantId(), ncData.externalId()), this)) { ERROR_LOG(m_logger) << "Error during NContaminationCreateRequest()"; failExit(); return; } if (!waitForData([this]() { return m_ncData.id() == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error creating ncontamination object"; failExit(); return; } m_expectedAesId = -1; if (!m_ftc->nContaminationRemoveRequest(Core::RemoveElementRequest(m_ncData.id()), this)) { ERROR_LOG(m_logger) << "Error during NContaminationRemoveRequest()"; failExit(); return; } if (!waitForData([this]() { return m_ncData.id() == m_expectedAesId; })) { ERROR_LOG(m_logger) << "Error removing ncontamination object"; failExit(); return; } QTimer::singleShot(0, qApp, &QCoreApplication::quit); INFO_LOG(m_logger) << "tryRemoveNContamination successful"; } void TestNContamination::nContaminationChanged(const AreaEffectSimulation::NContamination &data, DataModification modType) { if (m_ncData.id() == -1) return; onAesChanged(data, modType, m_ncData); } void TestNContamination::onNContaminationModifyReply(const Core::FunctionReplyObject &replyObject) { if (m_bIsCreatedRequest) onAesCreateReply(replyObject); else onAesModifyReply(replyObject); } void TestNContamination::onNContaminationRemoveReply(const Core::FunctionReplyObject &replyObject) { onAesRemoveReply(replyObject); } } // namespace AreaEffectSimulation // ------------------------------------------------------------------ int main(int argc, char **argv) { return AreaEffectSimulation::mainBase(argc, argv, []() { return new AreaEffectSimulation::TestNContamination; }); }