blob: 2738dc2654da0288552fca10f4e579618bb4be86 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QProcess>
#include <QFile>
#include <QTextStream>
#include <QTimer>
#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(QRegExp("\\s+")).at(1).toULong();
procFile.close();
}
return availableMemSize;
}