Add complex test, upgrade code mostly in reqeustManager

This commit is contained in:
Ondřej Fischer 2019-10-14 17:45:12 +02:00
parent 3de57f1c35
commit f4cc641b79
10 changed files with 283 additions and 127 deletions

View File

@ -12,14 +12,14 @@ void ColnodAPI::downloadData()
{
Response* resp0 = reqMan->getSubjects();
connect(resp0, &Response::ready, [=](){
dataMan->localSaveSubjects(resp0->reply->readAll());
dataMan->localSaveSubjects(resp0->getJson());
areDataReady();
resp0->deleteLater();
});
Response* resp1 = reqMan->getTokens();
connect(resp1, &Response::ready, [=](){
dataMan->localSaveTokens(resp1->reply->readAll());
dataMan->localSaveTokens(resp1->getJson());
areDataReady();
resp1->deleteLater();
});

View File

@ -16,8 +16,9 @@ RequestManager::RequestManager()
QObject::connect(manager, &QNetworkAccessManager::sslErrors, this, &RequestManager::onSSLError);
}
void RequestManager::login(QString host, QString username, QString password)
Response* RequestManager::login()
{
loginResponse = new Response;
QNetworkRequest request;
QString hash = encryptedPassword(this->password);
authHeader = getLoginHeader(this->user, hash);
@ -25,9 +26,6 @@ void RequestManager::login(QString host, QString username, QString password)
{"password", hash},
{"username", this->user}
};
//this->host = host;
request.setUrl(this->host + "/AaaManager/authSession");
request.setRawHeader("Authorization", authHeader.toLocal8Bit());
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json; charset=UTF-8");
@ -35,6 +33,7 @@ void RequestManager::login(QString host, QString username, QString password)
QJsonDocument jsonDocument;
jsonDocument.setObject(reqBody);
QNetworkReply* reply = manager->post(request, jsonDocument.toJson());
loginResponse->setReply(reply);
QObject::connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error())
{
@ -43,36 +42,14 @@ void RequestManager::login(QString host, QString username, QString password)
reply->deleteLater();
return;
}
jsonResponse = reply->readAll();
prepareAuthHeader();
if (loginStatus)
return;
qDebug() << "Logged in successfully.";
loginStatus = true;
emit successLogin();
reply->deleteLater();
});
}
QNetworkReply* RequestManager::getRequest(QString endpoint)
{
QNetworkRequest request;
request.setUrl(host + endpoint);
request.setRawHeader("Authorization", authHeader.toLocal8Bit());
QNetworkReply* reply = manager->post(request, QByteArray());
QObject::connect(reply, &QNetworkReply::finished, [=]() {
if (reply->error())
{
qDebug() << reply->errorString();
loginStatus = false;
reply->deleteLater();
return;
}
qDebug() << "Authorized successfully, response ready.";
emit responseReady();
reply->deleteLater();
});
return reply;
connect(this, &RequestManager::successLogin, loginResponse, &Response::ready);
connect(this, &RequestManager::successLogin, this, &RequestManager::prepareAuthHeader);
return loginResponse;
}
QNetworkReply* RequestManager::postRequest(QString endpoint, QByteArray json)
@ -97,41 +74,36 @@ QNetworkReply* RequestManager::postRequest(QString endpoint, QByteArray json)
return reply;
}
Response* RequestManager::getRequestReturnLogic(QString endpoint)
{
Response* response = new Response;
if (!loginStatus){
login(host, user, password);
connect(this, &RequestManager::successLogin, [=](){
response->reply = getRequest(endpoint);
connect(response->reply, &QNetworkReply::finished, response, &Response::ready);
});
}
else
{
response->reply = getRequest(endpoint);
connect(response->reply, &QNetworkReply::finished, response, &Response::ready);
}
return response;
Response* RequestManager::getLoginResponse() {
if (!loginResponse){
loginResponse = login();
}
return loginResponse;
}
Response* RequestManager::postRequestReturnLogic(QString endpoint, QByteArray data)
{
auto loginResponse = getLoginResponse();
// This will ensure login is called only once
Q_ASSERT(loginResponse);
Response* response = new Response;
if (!loginStatus){
login(host, user, password);
connect(this, &RequestManager::successLogin, [=](){
response->reply = postRequest(endpoint, data);
connect(response->reply, &QNetworkReply::finished, response, &Response::ready);
response->setReply(postRequest(endpoint, data));
connect(response->getReply(), &QNetworkReply::finished, response, &Response::ready);
});
}
else
{
response->reply = postRequest(endpoint, data);
connect(response->reply, &QNetworkReply::finished, response, &Response::ready);
response->setReply(postRequest(endpoint, data));
connect(response->getReply(), &QNetworkReply::finished, response, &Response::ready);
}
return response;
}
@ -159,6 +131,7 @@ QString RequestManager::getLoginHeader(QString username, QString hash)
void RequestManager::prepareAuthHeader()
{
jsonResponse = loginResponse->getJson();
token = getFromJson(jsonResponse, "id");
QString authValue = token + ":";
authHeader = "Basic " + authValue.toLocal8Bit().toBase64();
@ -166,12 +139,12 @@ void RequestManager::prepareAuthHeader()
void RequestManager::onSSLError(QNetworkReply *reply, const QList<QSslError> &errors)
{
qDebug() << "Network SSL errors";
//qDebug() << "Network SSL errors";
for (const auto &error : errors)
{
if (error.error() == QSslError::SelfSignedCertificate)
reply->ignoreSslErrors(errors);
qDebug() << error.errorString();
//qDebug() << error.errorString();
}
}
@ -229,17 +202,17 @@ QByteArray RequestManager::makeIdsJson(QList<QString> ids)
Response* RequestManager::getSubjects()
{
return getRequestReturnLogic("/SubjectManager/getSubjects");
return postRequestReturnLogic("/SubjectManager/getSubjects");
}
Response* RequestManager::getTokens()
{
return getRequestReturnLogic("/TokenManager/getTokens");
return postRequestReturnLogic("/TokenManager/getTokens");
}
Response* RequestManager::getTokenSubject()
{
return getRequestReturnLogic("/OpenManager/getTokenSubject");
return postRequestReturnLogic("/OpenManager/getTokenSubject");
}
Response* RequestManager::getSubjectsUpdated(uint64_t time)
@ -264,7 +237,7 @@ Response* RequestManager::getTokensDeleted(uint64_t time)
Response* RequestManager::getAccessGroups()
{
return getRequestReturnLogic("/AccessManager/getAccessGroups");
return postRequestReturnLogic("/AccessManager/getAccessGroups");
}
Response* RequestManager::getAccessGroupsUpdated(uint64_t time)
@ -279,7 +252,7 @@ Response* RequestManager::getAccessGroupsDeleted(uint64_t time)
Response* RequestManager::getAccessGroupMembership()
{
return getRequestReturnLogic("/AccessManager/getAccessGroupMembership");
return postRequestReturnLogic("/AccessManager/getAccessGroupMembership");
}
Response* RequestManager::getAccessGroupMembershipUpdated(uint64_t time)
@ -301,15 +274,3 @@ Response* RequestManager::deleteTokens(QList<QString> ids)
{
return postRequestReturnLogic("/TokenManager/deleteTokens", makeIdsJson(ids));
}

View File

@ -52,27 +52,26 @@ public:
Response* setTokens(QList<QPointer<Token>> tokens);
Response* deleteTokens(QList<QString> ids);
void login(QString endpoint, QString username, QString password); //I want it private, but unittest???
Response* login(); //I want it private, but unittest???
const QJsonDocument &getConfig() const {return config;}
const QString &getResponse() const {return jsonResponse;}
private:
QNetworkReply* getRequest(QString endpoint);
QNetworkReply* postRequest(QString endpoints, QByteArray json);
Response* getRequestReturnLogic(QString endpoint);
Response* postRequestReturnLogic(QString endpoint, QByteArray data);
QNetworkReply* postRequest(QString endpoint, QByteArray json = QByteArray());
Response* postRequestReturnLogic(QString endpoint, QByteArray data = QByteArray());
QString getFromJson(QString json, const QString &member);
QString encryptedPassword(QString password);
QString getLoginHeader(QString username, QString hash);
void prepareAuthHeader();
QByteArray makeTimeStampJson(uint64_t time);
QByteArray makeTokensJson(QList<QPointer<Token>> tokens);
QByteArray makeIdsJson(QList<QString> ids);
Response* getLoginResponse();
private slots:
void onSSLError(QNetworkReply *reply, const QList<QSslError> &errors);
void prepareAuthHeader();
signals:
void successLogin();
@ -81,6 +80,7 @@ signals:
private:
QNetworkAccessManager* manager = nullptr;
Response* loginResponse = nullptr;
QJsonDocument config;
QString authHeader;
QString host = "https://192.168.1.3:8443";

View File

@ -2,5 +2,10 @@
Response::Response()
{
connect(this, &Response::ready, this, &Response::setJson);
}
int Response::getStatusCode()
{
return reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
}

View File

@ -8,18 +8,28 @@ class Response : public QObject
{
Q_OBJECT
public:
Response();
int getStatusCode();
QString getJson() {return json;}
void setReply(QNetworkReply* rpl) {reply = rpl;}
QNetworkReply* getReply() {return reply;}
public:
QNetworkReply *reply = nullptr;
signals:
void ready();
public slots:
private slots:
void setJson() {json = reply->readAll();}
private:
QString json;
QNetworkReply *reply = nullptr;
};
#endif // RESPONSE_H

View File

@ -1,13 +1,19 @@
#include "unittest.h"
void UnitTest::initTestCase()
{
}
void UnitTest::loginSuccessfully()
{
RequestManager* testAccess = new RequestManager();
QJsonDocument config = testAccess->getConfig();
QSignalSpy spy(testAccess, SIGNAL(successLogin()));
testAccess->login(host, email, password);
spy.wait(15000);
QVERIFY(spy.isValid());
testAccess->login();
spy.wait(15000);
QCOMPARE(spy.count(), 1);
QString json = testAccess->getResponse();
qDebug() << json;
@ -20,11 +26,15 @@ void UnitTest::getSubjects()
{
RequestManager* testAccess = new RequestManager();
QSignalSpy spy(testAccess, SIGNAL(responseReady()));
Response* response = testAccess->getSubjects();
spy.wait(15000);
QVERIFY(spy.isValid());
Response* response = testAccess->getSubjects();
QSignalSpy spy1(response, &Response::ready);
spy.wait(15000);
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QCOMPARE(spy1.count(), 1);
QString json = response->getJson();
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QVERIFY(doc.isObject());
QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response");
@ -42,7 +52,7 @@ void UnitTest::getTokens()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QVERIFY(doc.isObject());
QVERIFY2(doc.object().value("items").isArray(), "No parameter 'id' in response");
@ -59,7 +69,7 @@ void UnitTest::getTokenSubject()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -72,7 +82,7 @@ void UnitTest::getSubjectsUpdated()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -85,7 +95,7 @@ void UnitTest::getSubjectsDeleted()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -98,7 +108,7 @@ void UnitTest::getTokensUpdated()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -111,7 +121,7 @@ void UnitTest::getTokensDeleted()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -124,7 +134,7 @@ void UnitTest::getAccessGroups()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -137,7 +147,7 @@ void UnitTest::getAccessGroupsUpdated()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -150,7 +160,7 @@ void UnitTest::getAccessGroupsDeleted()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -163,7 +173,7 @@ void UnitTest::getAccessGroupMembership()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -176,7 +186,7 @@ void UnitTest::getAccessGroupMembershipUpdated()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -189,7 +199,7 @@ void UnitTest::getAccessGroupMembershipDeleted()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -197,12 +207,7 @@ void UnitTest::setTokens()
{
QFile jsonData(QDir::current().filePath("tokens.json"));
if (!jsonData.open(QIODevice::ReadOnly)) {
qCritical() << "Couldn't open config file config.json" << QDir::current().filePath("tokens.json");
QCoreApplication::exit(-1);
return;
}
QVERIFY2(jsonData.open(QIODevice::ReadOnly), "Couldn't open config file tokens.json");
QJsonDocument doc = QJsonDocument::fromJson(jsonData.readAll());
QJsonObject obj = doc.object();
QJsonArray arr = obj["items"].toArray();
@ -222,7 +227,7 @@ void UnitTest::setTokens()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -238,7 +243,7 @@ void UnitTest::deleteTokens()
spy.wait(15000);
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QString json = response->reply->readAll();
QString json = response->getJson();
QVERIFY(!json.isEmpty());
}
@ -261,7 +266,7 @@ void UnitTest::subjectJSONParser()
QSignalSpy spy(testAccess, SIGNAL(responseReady()));
Response* response = testAccess->getSubjects();
spy.wait(15000);
QString json = response->reply->readAll();
QString json = response->getJson();
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QJsonArray arr = doc.object()["items"].toArray();
auto testSubject = new Subject();
@ -276,7 +281,7 @@ void UnitTest::tokenJSONParser()
QSignalSpy spy(testAccess, SIGNAL(responseReady()));
Response* response = testAccess->getTokens();
spy.wait(15000);
QString json = response->reply->readAll();
QString json = response->getJson();
QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8());
QJsonArray arr = doc.object()["items"].toArray();
auto testToken = new Token();
@ -351,4 +356,5 @@ void UnitTest::getUuid()
}
QTEST_MAIN(UnitTest)
//QTEST_MAIN(UnitTest)

View File

@ -0,0 +1,137 @@
#include "complextest.h"
void ComplexTest::initTestCase()
{
reqMan = new RequestManager;
start = QDateTime::currentMSecsSinceEpoch()-1000;
qDebug() << start;
}
void ComplexTest::complexTest()
{
// LOGIN_BEGIN
QSignalSpy loginSpy(reqMan, &RequestManager::successLogin);
Response* loginResp = reqMan->login();
QSignalSpy loginRespSpy(loginResp, &Response::ready);
QCOMPARE(loginSpy.count(), 0);
QCOMPARE(loginRespSpy.count(), 0);
loginSpy.wait(10000);
QCOMPARE(loginResp->getStatusCode(), 200); // HTTP status code check
QCOMPARE(loginSpy.count(), 1); // Checking multiple calls
QCOMPARE(loginRespSpy.count(), 1);
auto doc0 = getJsonDoc(loginResp->getJson());
QVERIFY(doc0.object()["id"].isString());
// LOGIN_END
// NUMBER_OF_SUBJECTS_AND_TOKENS_BEGIN
int numOfSubjects = getNumOfSubjects();
QCOMPARE(numOfSubjects, 2893); // should be still the same, if false db has been changed
int numOfTokens = getNumOfTokens();
QCOMPARE(numOfTokens, 2881); // should be still the same, if false db has been changed, or deleteTokens didnt work in previous test
// NUMBER_OF_SUBJECTS_AND_TOKENS_END
// ADD_TOKENS_CHECK_BEGIN
QList<QPointer<Token>> tokens;
tokens.append(getTestToken());
Response* setTokensResp = reqMan->setTokens(tokens);
QSignalSpy setTokensRespSpy(setTokensResp, &Response::ready);
QCOMPARE(setTokensRespSpy.count(), 0);
setTokensRespSpy.wait(10000);
QCOMPARE(setTokensRespSpy.count(), 1);
QCOMPARE(setTokensResp->getStatusCode(), 200);
QCOMPARE(getNumOfTokens(), numOfTokens + 1);
// ADD_TOKENS_CHEK_END
// CHECK_UPDATED_TOKENS_BEGIN
Response* getTokensUpdatedResp = reqMan->getTokensUpdated(start);
//start = QDateTime::currentMSecsSinceEpoch();
QSignalSpy getTokensUpdatedRespSpy(getTokensUpdatedResp, &Response::ready);
QCOMPARE(getTokensUpdatedRespSpy.count(), 0);
getTokensUpdatedRespSpy.wait(10000);
QCOMPARE(getTokensUpdatedResp->getStatusCode(), 200);
QCOMPARE(getTokensUpdatedRespSpy.count(), 1);
auto doc1 = getJsonDoc(getTokensUpdatedResp->getJson());
QCOMPARE(doc1.object()["items"].toArray().size(), 1);
// CHECK_UPDATED_TOKENS_END
// DELETE_TOKENS_CHECK_BEGIN
QList<QString> ids;
ids.append("582c982d-6fd7-4856-8548-7ce542791c7a");
Response* deleteTokensResp = reqMan->deleteTokens(ids);
QSignalSpy deleteTokensRespSpy(deleteTokensResp, &Response::ready);
QCOMPARE(deleteTokensRespSpy.count(), 0);
deleteTokensRespSpy.wait(10000);
QCOMPARE(deleteTokensRespSpy.count(), 1);
QCOMPARE(deleteTokensResp->getStatusCode(), 200);
// DELETE_TOKENS_CHECK_END
// CHECK_DELETED_TOKENS_BEGIN
Response* getTokensDeletedResp = reqMan->getTokensDeleted(start);
start = QDateTime::currentMSecsSinceEpoch();
QSignalSpy getTokensDeletedRespSpy(getTokensDeletedResp, &Response::ready);
QCOMPARE(getTokensDeletedRespSpy.count(), 0);
getTokensDeletedRespSpy.wait(10000);
QCOMPARE(getTokensDeletedResp->getStatusCode(), 200);
QCOMPARE(getTokensDeletedRespSpy.count(), 1);
auto doc2 = getJsonDoc(getTokensDeletedResp->getJson());
QCOMPARE(doc2.object()["items"].toArray().size(), 1);
QVERIFY(doc2.object()["items"].toArray().contains("582c982d-6fd7-4856-8548-7ce542791c7a"));
// CHECK_DELETED_TOKENS_END
// LAST_TESTS (for sure)
QCOMPARE(loginSpy.count(), 1); // Checking multiple calls
QCOMPARE(loginRespSpy.count(), 1);
QCOMPARE(getNumOfSubjects(), numOfSubjects);
QCOMPARE(getNumOfTokens(), numOfTokens);
}
// HELPFUL_FUNCTIONS
int ComplexTest::getNumOfSubjects()
{
Response* subjectsResp = reqMan->getSubjects();
QSignalSpy subjectsRespSpy(subjectsResp, &Response::ready);
subjectsRespSpy.wait(10000);
auto doc = getJsonDoc(subjectsResp->getJson());
return doc.object()["items"].toArray().size();
}
int ComplexTest::getNumOfTokens()
{
Response* tokensResp = reqMan->getTokens();
QSignalSpy tokensRespSpy(tokensResp, &Response::ready);
tokensRespSpy.wait(10000);
auto doc = getJsonDoc(tokensResp->getJson());
return doc.object()["items"].toArray().size();
}
QJsonDocument ComplexTest::getJsonDoc(QString json)
{
return QJsonDocument::fromJson(json.toUtf8());
}
Token* ComplexTest::getTestToken()
{
QJsonObject jsonToken;
jsonToken.insert("id", "582c982d-6fd7-4856-8548-7ce542791c7a");
jsonToken.insert("name", "test");
jsonToken.insert("description", "mobile");
jsonToken.insert("tokenType", "Token");
jsonToken.insert("tokenBits", 32);
jsonToken.insert("tokenData", "7B9D32");
jsonToken.insert("timeToLive", 255);
jsonToken.insert("authErrors", 255);
QJsonArray flags;
flags.push_back("Enabled");
flags.push_back("NoValidity");
jsonToken.insert("flags", flags);
jsonToken.insert("subjectId", "72b37f7e-5761-4e6c-8e87-20c0bed0d904");
Token* token = new Token;
token->fromJSON(jsonToken);
return token;
}
QTEST_MAIN(ComplexTest)

View File

@ -0,0 +1,33 @@
#pragma once
#include <QObject>
#include <QtTest/QtTest>
#include "response.h"
#include "requestmanager.h"
class ComplexTest : public QObject
{
Q_OBJECT
private slots:
void initTestCase();
void complexTest();
private:
// FUNCTIONS
int getNumOfSubjects();
int getNumOfTokens();
QJsonDocument getJsonDoc(QString json);
Token* getTestToken();
// VARIABLES
QString host = "https://192.168.1.3";
QString user = "spaceti";
QString password = "spaceti1";
RequestManager* reqMan = nullptr;
uint64_t start = 0;
};

View File

@ -3,8 +3,10 @@ QT += core sql network testlib
CONFIG += testcase # neccesary to have posibility to run: make check UnitTest
HEADERS += \
complextest.h \
unittest.h
SOURCES += \
complextest.cpp \
unittest.cpp
include(../../src/colnod/colnod.pri)

View File

@ -17,6 +17,8 @@ class UnitTest : public QObject
private slots:
void initTestCase();
void loginSuccessfully(); // /AaaManager/authSession
void getSubjects(); // /SubjectManager/getSubjects
void getTokens(); // /TokenManager/getTokens