compatdb: Use a seperate endpoint for testcase submission
This commit is contained in:
		
							parent
							
								
									a9dc34ea5c
								
							
						
					
					
						commit
						585b6a6a50
					
				@ -153,6 +153,7 @@ struct VisitorInterface : NonCopyable {
 | 
			
		||||
 | 
			
		||||
    /// Completion method, called once all fields have been visited
 | 
			
		||||
    virtual void Complete() = 0;
 | 
			
		||||
    virtual bool SubmitTestcase() = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -178,6 +179,9 @@ struct NullVisitor : public VisitorInterface {
 | 
			
		||||
    void Visit(const Field<std::chrono::microseconds>& /*field*/) override {}
 | 
			
		||||
 | 
			
		||||
    void Complete() override {}
 | 
			
		||||
    bool SubmitTestcase() override {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// Appends build-specific information to the given FieldCollection,
 | 
			
		||||
 | 
			
		||||
@ -184,4 +184,13 @@ TelemetrySession::~TelemetrySession() {
 | 
			
		||||
    backend = nullptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TelemetrySession::SubmitTestcase() {
 | 
			
		||||
#ifdef ENABLE_WEB_SERVICE
 | 
			
		||||
    field_collection.Accept(*backend);
 | 
			
		||||
    return backend->SubmitTestcase();
 | 
			
		||||
#else
 | 
			
		||||
    return false;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Core
 | 
			
		||||
 | 
			
		||||
@ -31,6 +31,12 @@ public:
 | 
			
		||||
        field_collection.AddField(type, name, std::move(value));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Submits a Testcase.
 | 
			
		||||
     * @returns A bool indicating whether the submission succeeded
 | 
			
		||||
     */
 | 
			
		||||
    bool SubmitTestcase();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    Telemetry::FieldCollection field_collection; ///< Tracks all added fields for the session
 | 
			
		||||
    std::unique_ptr<Telemetry::VisitorInterface> backend; ///< Backend interface that logs fields
 | 
			
		||||
 | 
			
		||||
@ -102,16 +102,27 @@ void TelemetryJson::Complete() {
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::App, "App");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::Session, "Session");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::Performance, "Performance");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::UserConfig, "UserConfig");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
 | 
			
		||||
 | 
			
		||||
    auto content = impl->TopSection().dump();
 | 
			
		||||
    // Send the telemetry async but don't handle the errors since they were written to the log
 | 
			
		||||
    Common::DetachedTasks::AddTask(
 | 
			
		||||
        [host{impl->host}, username{impl->username}, token{impl->token}, content]() {
 | 
			
		||||
            Client{host, username, token}.PostJson("/telemetry", content, true);
 | 
			
		||||
        });
 | 
			
		||||
    Common::DetachedTasks::AddTask([host{impl->host}, content]() {
 | 
			
		||||
        Client{host, "", ""}.PostJson("/telemetry", content, true);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TelemetryJson::SubmitTestcase() {
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::App, "App");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::Session, "Session");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::UserFeedback, "UserFeedback");
 | 
			
		||||
    impl->SerializeSection(Telemetry::FieldType::UserSystem, "UserSystem");
 | 
			
		||||
 | 
			
		||||
    auto content = impl->TopSection().dump();
 | 
			
		||||
    Client client(impl->host, impl->username, impl->token);
 | 
			
		||||
    auto value = client.PostJson("/gamedb/testcase", content, false);
 | 
			
		||||
 | 
			
		||||
    return value.result_code == Common::WebResult::Code::Success;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace WebService
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ public:
 | 
			
		||||
    void Visit(const Telemetry::Field<std::chrono::microseconds>& field) override;
 | 
			
		||||
 | 
			
		||||
    void Complete() override;
 | 
			
		||||
    bool SubmitTestcase() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    struct Impl;
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#include <QButtonGroup>
 | 
			
		||||
#include <QMessageBox>
 | 
			
		||||
#include <QPushButton>
 | 
			
		||||
#include <QtConcurrent/qtconcurrentrun.h>
 | 
			
		||||
#include "common/logging/log.h"
 | 
			
		||||
#include "common/telemetry.h"
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
@ -23,6 +24,8 @@ CompatDB::CompatDB(QWidget* parent)
 | 
			
		||||
    connect(ui->radioButton_IntroMenu, &QRadioButton::clicked, this, &CompatDB::EnableNext);
 | 
			
		||||
    connect(ui->radioButton_WontBoot, &QRadioButton::clicked, this, &CompatDB::EnableNext);
 | 
			
		||||
    connect(button(NextButton), &QPushButton::clicked, this, &CompatDB::Submit);
 | 
			
		||||
    connect(&testcase_watcher, &QFutureWatcher<bool>::finished, this,
 | 
			
		||||
            &CompatDB::OnTestcaseSubmitted);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CompatDB::~CompatDB() = default;
 | 
			
		||||
@ -48,18 +51,38 @@ void CompatDB::Submit() {
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case CompatDBPage::Final:
 | 
			
		||||
        back();
 | 
			
		||||
        LOG_DEBUG(Frontend, "Compatibility Rating: {}", compatibility->checkedId());
 | 
			
		||||
        Core::Telemetry().AddField(Telemetry::FieldType::UserFeedback, "Compatibility",
 | 
			
		||||
                                   compatibility->checkedId());
 | 
			
		||||
        // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
 | 
			
		||||
        // workaround
 | 
			
		||||
 | 
			
		||||
        button(NextButton)->setEnabled(false);
 | 
			
		||||
        button(NextButton)->setText(tr("Submitting"));
 | 
			
		||||
        button(QWizard::CancelButton)->setVisible(false);
 | 
			
		||||
 | 
			
		||||
        testcase_watcher.setFuture(QtConcurrent::run(
 | 
			
		||||
            [this]() { return Core::System::GetInstance().TelemetrySession().SubmitTestcase(); }));
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        LOG_ERROR(Frontend, "Unexpected page: {}", currentId());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompatDB::OnTestcaseSubmitted() {
 | 
			
		||||
    if (!testcase_watcher.result()) {
 | 
			
		||||
        QMessageBox::critical(this, tr("Communication error"),
 | 
			
		||||
                              tr("An error occured while sending the Testcase"));
 | 
			
		||||
        button(NextButton)->setEnabled(true);
 | 
			
		||||
        button(NextButton)->setText(tr("Next"));
 | 
			
		||||
        button(QWizard::CancelButton)->setVisible(true);
 | 
			
		||||
    } else {
 | 
			
		||||
        next();
 | 
			
		||||
        // older versions of QT don't support the "NoCancelButtonOnLastPage" option, this is a
 | 
			
		||||
        // workaround
 | 
			
		||||
        button(QWizard::CancelButton)->setVisible(false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CompatDB::EnableNext() {
 | 
			
		||||
    button(NextButton)->setEnabled(true);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <QFutureWatcher>
 | 
			
		||||
#include <QWizard>
 | 
			
		||||
 | 
			
		||||
namespace Ui {
 | 
			
		||||
@ -19,8 +20,11 @@ public:
 | 
			
		||||
    ~CompatDB();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QFutureWatcher<bool> testcase_watcher;
 | 
			
		||||
 | 
			
		||||
    std::unique_ptr<Ui::CompatDB> ui;
 | 
			
		||||
 | 
			
		||||
    void Submit();
 | 
			
		||||
    void OnTestcaseSubmitted();
 | 
			
		||||
    void EnableNext();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user