Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/****************************************************************************
*
* (c) 2009-2020 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
*
* QGroundControl is licensed according to the terms in the file
* COPYING.md in the root of the source code directory.
*
****************************************************************************/
#include "FTPManagerTest.h"
#include "MultiVehicleManager.h"
#include "QGCApplication.h"
#include "MockLink.h"
#include "FTPManager.h"
const FTPManagerTest::TestCase_t FTPManagerTest::_rgTestCases[] = {
{ "/version.json" },
};
void FTPManagerTest::_testCaseWorker(const TestCase_t& testCase)
{
_connectMockLinkNoInitialConnectSequence();
MultiVehicleManager* vehicleMgr = qgcApp()->toolbox()->multiVehicleManager();
Vehicle* vehicle = vehicleMgr->activeVehicle();
FTPManager* ftpManager = vehicle->ftpManager();
QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete);
// void downloadComplete (const QString& file, const QString& errorMsg);
ftpManager->download(testCase.file, QStandardPaths::writableLocation(QStandardPaths::TempLocation));
QCOMPARE(spyDownloadComplete.wait(10000), true);
QCOMPARE(spyDownloadComplete.count(), 1);
QList<QVariant> arguments = spyDownloadComplete.takeFirst();
qDebug() << arguments[0].toString();
QVERIFY(arguments[1].toString().isEmpty());
_disconnectMockLink();
}
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
void FTPManagerTest::_sizeTestCaseWorker(int fileSize)
{
_connectMockLinkNoInitialConnectSequence();
FTPManager* ftpManager = _vehicle->ftpManager();
QString filename = QStringLiteral("%1%2").arg(MockLinkFTP::sizeFilenamePrefix).arg(fileSize);
QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete);
ftpManager->download(filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation));
QCOMPARE(spyDownloadComplete.wait(10000), true);
QCOMPARE(spyDownloadComplete.count(), 1);
// void downloadComplete (const QString& file, const QString& errorMsg);
QList<QVariant> arguments = spyDownloadComplete.takeFirst();
QVERIFY(arguments[1].toString().isEmpty());
_verifyFileSizeAndDelete(arguments[0].toString(), fileSize);
_disconnectMockLink();
}
void FTPManagerTest::_performSizeBasedTestCases(void)
{
// We test various boundary conditions on file sizes with respect to buffer sizes
const QList<int> rgSizeTestCases = {
// File fits one Read Ack packet, partially filling data
sizeof(((MavlinkFTP::Request*)0)->data) - 1,
// File fits one Read Ack packet, exactly filling all data
sizeof(((MavlinkFTP::Request*)0)->data),
// File is larger than a single Read Ack packets, requires multiple Reads
sizeof(((MavlinkFTP::Request*)0)->data) + 1,
// File is large enough to require multiple bursts
3 * 1024,
};
for (int fileSize: rgSizeTestCases) {
_sizeTestCaseWorker(fileSize);
}
}
void FTPManagerTest::_performTestCases(void)
{
int index = 0;
for (const TestCase_t& testCase: _rgTestCases) {
qDebug() << "Testing case" << index++;
_testCaseWorker(testCase);
}
}
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
void FTPManagerTest::_testLostPackets(void)
{
_connectMockLinkNoInitialConnectSequence();
FTPManager* ftpManager = _vehicle->ftpManager();
int fileSize = 4 * 1024;
QString filename = QStringLiteral("%1%2").arg(MockLinkFTP::sizeFilenamePrefix).arg(fileSize);
QSignalSpy spyDownloadComplete(ftpManager, &FTPManager::downloadComplete);
_mockLink->mockLinkFTP()->enableRandromDrops(true);
ftpManager->download(filename, QStandardPaths::writableLocation(QStandardPaths::TempLocation));
QCOMPARE(spyDownloadComplete.wait(10000), true);
QCOMPARE(spyDownloadComplete.count(), 1);
// void downloadComplete (const QString& file, const QString& errorMsg);
QList<QVariant> arguments = spyDownloadComplete.takeFirst();
QVERIFY(arguments[1].toString().isEmpty());
_verifyFileSizeAndDelete(arguments[0].toString(), fileSize);
_disconnectMockLink();
}
void FTPManagerTest::_verifyFileSizeAndDelete(const QString& filename, int expectedSize)
{
QFileInfo fileInfo(filename);
QVERIFY(fileInfo.exists());
QCOMPARE(fileInfo.size(), expectedSize);
QFile file(filename);
QVERIFY(file.open(QFile::ReadOnly));
for (int i=0; i<expectedSize; i++) {
QByteArray bytes = file.read(1);
QCOMPARE(bytes[0], (char)(i % 255));
}
file.close();
file.remove();
}