swift
testreaders.cpp
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
7 
8 #include <QDateTime>
9 #include <QDebug>
10 #include <QString>
11 #include <QTest>
12 #include <QtDebug>
13 
14 #include "test.h"
15 
16 #include "core/application.h"
17 #include "core/data/globalsetup.h"
19 #include "core/db/icaodatareader.h"
25 #include "misc/aviation/livery.h"
30 
31 using namespace swift::misc;
32 using namespace swift::misc::aviation;
33 using namespace swift::misc::db;
34 using namespace swift::misc::simulation;
35 using namespace swift::misc::network;
36 using namespace swift::core;
37 using namespace swift::core::db;
38 
39 namespace swiftcoretest
40 {
42  class CTestReaders : public QObject
43  {
44  Q_OBJECT
45 
46  private slots:
47  void initTestCase();
48 
50  void readIcaoData();
51 
53  void readModelData();
54 
56  void readAirportData();
57 
58  void cleanupTestCase();
59 
60  private:
61  swift::core::db::CAirportDataReader *m_airportReader = nullptr;
62  swift::core::db::CIcaoDataReader *m_icaoReader = nullptr;
63  swift::core::db::CModelDataReader *m_modelReader = nullptr;
64 
66  static bool connectServer(const swift::misc::network::CUrl &url);
67  };
68 
69  void CTestReaders::initTestCase()
70  {
71  m_airportReader = new CAirportDataReader(this, CDatabaseReaderConfigList::allDirectDbAccess());
72  m_icaoReader = new CIcaoDataReader(this, CDatabaseReaderConfigList::allDirectDbAccess());
73  m_modelReader = new CModelDataReader(this, CDatabaseReaderConfigList::allDirectDbAccess());
74  m_airportReader->markAsUsedInUnitTest();
75  m_icaoReader->markAsUsedInUnitTest();
76  m_modelReader->markAsUsedInUnitTest();
77  }
78 
79  void CTestReaders::readIcaoData()
80  {
82  qDebug() << "Reader URL" << url.toQString();
83  if (!this->connectServer(url))
84  {
85  QSKIP("Server not reachable.");
86  return;
87  }
88  m_icaoReader->start();
89  m_icaoReader->readInBackgroundThread(CEntityFlags::AllIcaoEntities, QDateTime());
90 
91  // expect does not work here, as I receive multiple signals for all entities and read states
92  // I have to run my "own event loop"
93  for (int i = 0; i < 60; i++)
94  {
95  CApplication::processEventsFor(500); // process events and sleep
96  if (this->m_icaoReader->getAircraftIcaoCodesCount() > 0 &&
97  this->m_icaoReader->getAirlineIcaoCodesCount() > 0)
98  {
99  break;
100  }
101  }
102 
103  const QString m1("No aircraft ICAOs " + url.getFullUrl());
104  const QString m2("No airline ICAOs " + url.getFullUrl());
105  QVERIFY2(this->m_icaoReader->getAircraftIcaoCodesCount() > 0, qUtf8Printable(m1));
106  QVERIFY2(this->m_icaoReader->getAirlineIcaoCodesCount() > 0, qUtf8Printable(m2));
107 
108  // reader set to ignore incomplete ICAO data, so sizes must match
109  const CAircraftIcaoCodeList aircraftIcaos = this->m_icaoReader->getAircraftIcaoCodes();
110  const CAirlineIcaoCodeList airlineIcaos = this->m_icaoReader->getAirlineIcaoCodes();
111  const CAircraftIcaoCodeList aircraftIcaosValid(aircraftIcaos.findByValidDesignator());
112  const CAirlineIcaoCodeList airlineIcaosValid(airlineIcaos.findByValidDesignator());
113  const CAircraftIcaoCodeList aircraftIcaosInvalid(aircraftIcaos.findByInvalidDesignator());
114  const CAirlineIcaoCodeList airlineIcaosInvalid(airlineIcaos.findByInvalidDesignator());
115  const int aircraftValidSize = aircraftIcaosValid.size();
116  const int aircraftSize = aircraftIcaos.size();
117  const int airlineValidSize = airlineIcaosValid.size();
118  const int airlineSize = airlineIcaos.size();
119 
120  if (!aircraftIcaosInvalid.isEmpty()) { qDebug() << aircraftIcaosInvalid.toQString(); }
121  if (!airlineIcaosInvalid.isEmpty()) { qDebug() << airlineIcaosInvalid.toQString(); }
122 
123  QVERIFY2(aircraftValidSize == aircraftSize, "All aircraft ICAOs must be valid");
124  QVERIFY2(airlineValidSize == airlineSize, "Some airline ICAOs must be valid");
125 
126  CApplication::processEventsFor(2500); // make sure events are processed
127  }
128 
129  void CTestReaders::readModelData()
130  {
132  qDebug() << "Reader URL" << url.toQString();
133  if (!this->connectServer(url))
134  {
135  QSKIP("Server not reachable.");
136  return;
137  }
138  m_modelReader->start();
139  m_modelReader->readInBackgroundThread(CEntityFlags::ModelEntity, QDateTime());
140 
141  for (int i = 0; i < 120; i++)
142  {
143  CApplication::processEventsFor(500);
144  if (this->m_modelReader->getModelsCount() > 0) { break; }
145  }
146 
147  const QString m1("No models " + url.getFullUrl());
148  QVERIFY2(this->m_modelReader->getModelsCount() > 0, qUtf8Printable(m1));
149 
150  const CAircraftModel model(m_modelReader->getModels().frontOrDefault());
151  QVERIFY2(model.getLivery().hasCompleteData(), "Missing data for livery");
152 
153  CApplication::processEventsFor(2500); // make sure events are processed
154  }
155 
156  void CTestReaders::readAirportData()
157  {
158  using namespace swift::misc::geo;
159  using namespace swift::misc::physical_quantities;
160 
162  qDebug() << "Reader URL" << url.toQString();
163  if (!this->connectServer(url))
164  {
165  QSKIP("Server not reachable.");
166  return;
167  }
168  m_airportReader->start();
169  m_airportReader->readInBackgroundThread(CEntityFlags::AirportEntity, QDateTime());
170 
171  for (int i = 0; i < 120; ++i)
172  {
173  CApplication::processEventsFor(500);
174  if (this->m_airportReader->getAirports().size() > 0) { break; }
175  }
176 
177  QVERIFY2(this->m_airportReader->getAirports().size() > 0, "No airports");
178  const auto heathrow = this->m_airportReader->getAirports().findByIcao("EGLL");
179  QVERIFY2(heathrow.size() == 1, "No Heathrow");
180  QVERIFY2(heathrow[0].isOperating(), "Wrong airport data");
181 
182  auto airports = m_airportReader->getAirports();
183  airports.sortByRange(CCoordinateGeodetic(CLatitude(51.5085300, CAngleUnit::deg()),
184  CLongitude(-0.1257400, CAngleUnit::deg()), CAltitude()),
185  true);
186  QVERIFY2(airports[0].getIcao() == CAirportIcaoCode("EGLW"), "Wrong airport data");
187 
188  CApplication::processEventsFor(2500); // make sure events are processed
189  }
190 
191  bool CTestReaders::connectServer(const CUrl &url)
192  {
193  QString m;
194  if (CNetworkUtils::canConnect(url, m, 2500))
195  {
196  qDebug() << "URL" << url.getFullUrl() << "connected";
197  return true;
198  }
199  else
200  {
201  qWarning() << "URL" << url.getFullUrl() << "cannot be connected";
202  return false;
203  }
204  }
205 
206  void CTestReaders::cleanupTestCase()
207  {
208  m_airportReader->quitAndWait();
209  m_icaoReader->quitAndWait();
210  m_modelReader->quitAndWait();
211  }
212 } // namespace swiftcoretest
213 
216 
217 #include "testreaders.moc"
218 
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
data::CGlobalSetup getGlobalSetup() const
Global setup.
swift::misc::network::CUrl getDbIcaoReaderUrl() const
ICAO reader URL.
Definition: globalsetup.cpp:33
swift::misc::network::CUrl getDbAirportReaderUrl() const
Airport reader URL.
Definition: globalsetup.cpp:37
swift::misc::network::CUrl getDbModelReaderUrl() const
Model reader URL.
Definition: globalsetup.cpp:35
Reader for airport database data.
Read ICAO data from Database.
Read model related data from Database.
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
Value object encapsulating a list of ICAO codes.
CAircraftIcaoCodeList findByInvalidDesignator() const
Ones with an invalid designator.
CAircraftIcaoCodeList findByValidDesignator() const
Ones with a valid designator.
Value object encapsulating a list of ICAO codes.
CAirlineIcaoCodeList findByValidDesignator() const
The ones with a valid designator.
CAirlineIcaoCodeList findByInvalidDesignator() const
The ones with an invalid designator.
Value object encapsulating information of airport ICAO data.
Altitude as used in aviation, can be AGL or MSL altitude.
Definition: altitude.h:52
Value object encapsulating information of a location, kind of simplified CValueObject compliant versi...
Definition: url.h:27
QString getFullUrl(bool withQuery=true) const
Qualified name.
Definition: url.cpp:84
Aircraft model (used by another pilot, my models on disk)
Definition: aircraftmodel.h:71
Test data readers (for ICAOs, JSON, etc.)
Definition: testreaders.cpp:43
Classes interacting with the swift database (aka "datastore").
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
Free functions in swift::misc.
SWIFTTEST_APPLESS_MAIN(swiftcoretest::CTestReaders)
main