summaryrefslogtreecommitdiffstats
path: root/tests/arthur/common/baselineprotocol.h
blob: 42f9729f3090566d6e446c6923bcd569a1a5fac0 (plain)
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
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
84
85
86
87
88
89
90
91
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
#ifndef BASELINEPROTOCOL_H
#define BASELINEPROTOCOL_H

#include <QDataStream>
#include <QTcpSocket>
#include <QImage>
#include <QVector>

#define QLS QLatin1String
#define QLC QLatin1Char

#define FileFormat "png"

struct PlatformInfo
{
    PlatformInfo(bool useLocal = false);

    QString hostName;
    QString osName;
    int     osVersion;
    QString qtVersion;
    QString buildKey;
    QString gitCommit;
};
QDataStream & operator<< (QDataStream &stream, const PlatformInfo &p);
QDataStream & operator>> (QDataStream& stream, PlatformInfo& p);

struct ImageItem
{
public:
    ImageItem()
        : status(Ok), renderFormat(QImage::Format_Invalid), engine(Raster), scriptChecksum(0)
    {}
    ImageItem(const ImageItem &other)
    { *this = other; }
    ~ImageItem()
    {}
    ImageItem &operator=(const ImageItem &other);
    static quint64 computeChecksum(const QImage& image);
    QString engineAsString() const;
    QString formatAsString() const;

    enum ItemStatus {
        Ok = 0,
        BaselineNotFound = 1,
        IgnoreItem = 2
    };

    enum GraphicsEngine {
        Raster = 0,
        OpenGL = 1
    };

    QString scriptName;
    ItemStatus status;
    QImage::Format renderFormat;
    GraphicsEngine engine;
    QImage image;
    QList<quint64> imageChecksums;
    // tbd: add diffscore
    quint16 scriptChecksum;
};
QDataStream & operator<< (QDataStream &stream, const ImageItem &ii);
QDataStream & operator>> (QDataStream& stream, ImageItem& ii);

Q_DECLARE_METATYPE(ImageItem);

typedef QVector<ImageItem> ImageItemList;

class BaselineProtocol
{
public:
    BaselineProtocol() {}
    ~BaselineProtocol();

    // ****************************************************
    // Important constants here
    // ****************************************************
    enum Constant {
        ProtocolVersion = 1,
        ServerPort = 54129,
        Timeout = 10000
    };

    enum Command {
        UnknownError = 0,
        // Queries
        AcceptPlatformInfo = 1,
        RequestBaselineChecksums = 2,
        AcceptNewBaseline = 4,
        AcceptMismatch = 5,
        // Responses
        Ack = 128,
    };

    // For client:
    bool connect();
    bool requestBaselineChecksums(ImageItemList *itemList);
    bool submitNewBaseline(const ImageItem &item, QByteArray *serverMsg);
    bool submitMismatch(const ImageItem &item, QByteArray *serverMsg);

    // For server:
    bool acceptConnection(PlatformInfo *pi);

    QString errorMessage();

private:
    bool sendItem(Command cmd, const ImageItem &item);

    bool sendBlock(Command cmd, const QByteArray &block);
    bool receiveBlock(Command *cmd, QByteArray *block);
    QString errMsg;
    QTcpSocket socket;

    friend class BaselineThread;
    friend class BaselineHandler;
};


#endif // BASELINEPROTOCOL_H