File: startclose.cpp

package info (click to toggle)
qt6-virtualkeyboard 6.9.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 6,860 kB
  • sloc: javascript: 42,429; cpp: 21,832; python: 355; sh: 37; makefile: 24
file content (96 lines) | stat: -rw-r--r-- 3,176 bytes parent folder | download | duplicates (3)
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
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include <QProcess>
#include <QFile>
#include <QTextStream>
#include <QTimer>
#include <QRegularExpression>

#include "startclose.h"

namespace  {
const QString KTest_Name = "Test start/close %1 times.";
const quint16 KTestCycles = 25;
const int KTestMultiplier = 2;
}

StartClose::StartClose(QProcess &proc, quint32 numberOfTests, QObject *parent)
    : TestBase (parent, KTest_Name, numberOfTests),
    m_procToTest(proc),
    m_results(QStringList()),
    m_testCycleCount(0)
{
    this->setTestRepeats(KTestCycles);
    this->setTestName();
    QObject::connect(&m_procToTest, &QProcess::started, this, &StartClose::runCycles);
    QObject::connect(&m_procToTest, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                     this, &StartClose::runCycles);
}

void StartClose::startTest()
{
    m_testTimer.start();
    m_procToTest.start();
}

void StartClose::runCycles()
{
    QTimer::singleShot(50, this, [&]() {
        if (m_testCycleCount == 0) {
            m_results << QString::number(this->currentTotalAvailableMemory());
        }
        // The original number of tests will be multiplied by 2 because we always need to
        // have even number of test cycles because one cycle consists off ON & OFF.
        if (m_testCycleCount == (m_numberOfTests * KTestMultiplier)) {
            m_results << QString::number(this->currentTotalAvailableMemory());
            QObject::disconnect(&m_procToTest, &QProcess::started, this, &StartClose::startTest);
            QObject::disconnect(&m_procToTest,
                                static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished),
                                this, &StartClose::startTest);

            m_passed = true;
            m_timeElapsed = m_testTimer.elapsed();

            emit endTest();
            return;
        }
        m_testCycleCount ++;

        if (m_procToTest.state() == QProcess::Running) {
            m_procToTest.kill();
        } else {
            m_procToTest.start();
        }
    });
}

QString StartClose::reportResult()
{
    m_testResult =
        QString("Total free system memory at start: %1 KB\nTotal free system memory at end: %2 KB\nDifference: %3 KB")
            .arg(m_results.value(0).toInt()).arg(m_results.value(1).toInt())
            .arg(m_results.value(1).toInt() - m_results.value(0).toInt());
    return m_testResult;
}

/**
 * @brief StartClose::currentTotalAvailableMemory
 * @return current free system memory by procID in kB
 * Getting current free memory using Linux proc
 * filesystem.
 */
ulong StartClose::currentTotalAvailableMemory() const
{
    ulong availableMemSize = 0UL;
    QString str = QString("/proc/meminfo");
    QFile procFile(str);

    if (procFile.open(QIODevice::ReadOnly)) {
        QTextStream procStream(&procFile);
        procStream.readLine(); // "Read away" the first row
        availableMemSize = procStream.readLine().split(QRegularExpression("\\s+")).at(1).toULong();
        procFile.close();
    }
    return availableMemSize;
}