1 /*  KStars scheduler operations tests
2     SPDX-FileCopyrightText: 2021 Hy Murveit <hy@murveit.com>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #ifndef TESTEKOSSCHEDULEROPS_H
8 #define TESTEKOSSCHEDULEROPS_H
9 
10 #include "config-kstars.h"
11 #include "ekos/scheduler/schedulerjob.h"
12 #include "test_ekos_scheduler_helper.h"
13 
14 #if defined(HAVE_INDI)
15 
16 #include <QObject>
17 #include <QPushButton>
18 #include <QComboBox>
19 #include <QDoubleSpinBox>
20 #include <QSpinBox>
21 #include <QCheckBox>
22 #include <QtTest>
23 
24 namespace Ekos
25 {
26 class Scheduler;
27 class MockFocus;
28 class MockMount;
29 class MockCapture;
30 class MockAlign;
31 class MockGuide;
32 class MockEkos;
33 }
34 class KStarsDateTime;
35 class GeoLocation;
36 
37 class TestEkosSchedulerOps : public QObject
38 {
39         Q_OBJECT
40 
41     public:
42         explicit TestEkosSchedulerOps(QObject *parent = nullptr);
43 
44     private slots:
45         void initTestCase();
46         void cleanupTestCase();
47 
48         void init();
49         void cleanup();
50 
51         void testBasics();
52         void testSimpleJob();
53         void testTimeZone();
54         void testDawnShutdown();
55         void testTwilightStartup();
56         void testTwilightStartup_data();
57         void testCulminationStartup();
58         void testFixedDateStartup();
59         void testArtificialHorizonConstraints();
60         void test2ndJobRunsAfter1stHitsAltitudeConstraint();
61 
62         // test data
63         void testCulminationStartup_data();
64 
65     protected:
66         void prepareTestData(QList<QString> locationList, QList<QString> targetList);
67         void runSimpleJob(const GeoLocation &geo, const SkyObject *targetObject, const QDateTime &startUTime,
68                           const QDateTime &wakeupTime, bool enforceArtificialHorizon);
69         void runUntilFirstShutdown(
70             const GeoLocation &geo, const QVector<SkyObject*> targetObjects,
71             const QDateTime &startSchedulerUTime, const QDateTime &startJobUTime, const QDateTime &interruptUTime,
72             KStarsDateTime &currentUTime, int &sleepMs, QTemporaryDir &dir);
73         void parkAndSleep(KStarsDateTime &testUTime, int &sleepMs);
74         void wakeupAndRestart(const QDateTime &restartTime, KStarsDateTime &testUTime, int &sleepMs);
75 
76 
77     private:
78         bool iterateScheduler(const QString &label, int iterations, int *sleepMs,
79                               KStarsDateTime* testUTime,
80                               std::function<bool ()> fcn);
81 
82         void initScheduler(const GeoLocation &geo, const QDateTime &startUTime, QTemporaryDir *dir,
83                            const QVector<QString> &eslContents, const QVector<QString> &esqContents);
84 
85         void initJob(const KStarsDateTime &startUTime, const KStarsDateTime &jobStartUTime);
86 
87         void startupJobs(
88             const GeoLocation &geo, const QDateTime &startUTime,
89             QTemporaryDir *dir, const QVector<QString> &esls, const QVector<QString> &esqs,
90             const QDateTime &wakeupTime, KStarsDateTime &endTestUTime, int &endSleepMs);
91         void startupJob(
92             const GeoLocation &geo, const QDateTime &startUTime,
93             QTemporaryDir *dir, const QString &esl, const QString &esq,
94             const QDateTime &wakeupTime, KStarsDateTime &endTestUTime, int &endSleepMs);
95         void startModules(KStarsDateTime &testUTime, int &sleepMs);
96 
97         void disableSkyMap();
98         int timeTolerance(int seconds);
99         bool checkLastSlew(const SkyObject* targetObject);
100         void printJobs(const QString &label);
101 
102         QSharedPointer<Ekos::Scheduler> scheduler;
103         QSharedPointer<Ekos::MockFocus> focuser;
104         QSharedPointer<Ekos::MockMount> mount;
105         QSharedPointer<Ekos::MockCapture> capture;
106         QSharedPointer<Ekos::MockAlign> align;
107         QSharedPointer<Ekos::MockGuide> guider;
108         QSharedPointer<Ekos::MockEkos> ekos;
109 
110         TestEkosSchedulerHelper::StartupCondition m_startupCondition;
111         QElapsedTimer testTimer;
112 };
113 
114 #endif // HAVE_INDI
115 #endif // TESTEKOSSCHEDULEROPS_H
116