File indexing completed on 2024-04-28 16:49:47

0001 /*
0002     SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
0003     SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include <QTest>
0009 
0010 #include <QJsonArray>
0011 #include <QJsonDocument>
0012 
0013 #include <KConfig>
0014 #include <Solid/Block>
0015 #include <Solid/Device>
0016 #include <Solid/Predicate>
0017 #include <Solid/StorageAccess>
0018 #include <Solid/StorageVolume>
0019 
0020 #include "SensorFaceController.h"
0021 
0022 #include "SensorFaceController_p.h"
0023 
0024 class SensorFaceControllerTest : public QObject
0025 {
0026     Q_OBJECT
0027 private Q_SLOTS:
0028     void testSensorIdConversion_data()
0029     {
0030         QTest::addColumn<QJsonArray>("oldSensors");
0031         QTest::addColumn<QJsonArray>("expectedSensors");
0032 
0033         QTest::addRow("network")
0034         << QJsonArray {
0035             QStringLiteral("network/all/sentDataRate"),
0036             QStringLiteral("network/all/totalReceivedData"),
0037             QStringLiteral("network/interfaces/test/receiver/data"),
0038             QStringLiteral("network/interfaces/test/transmitter/dataTotal"),
0039         }
0040         << QJsonArray {
0041             QStringLiteral("network/all/upload"),
0042             QStringLiteral("network/all/totalDownload"),
0043             QStringLiteral("network/test/download"),
0044             QStringLiteral("network/test/totalUpload"),
0045         };
0046 
0047         const auto storageAccesses = Solid::Device::listFromQuery(Solid::Predicate(Solid::DeviceInterface::StorageAccess, QStringLiteral("accessible"), true));
0048         for (int i = 0; i < storageAccesses.size(); ++i) {
0049             const auto storageAccess = storageAccesses[i].as<Solid::StorageAccess>();
0050             const auto blockDevice = storageAccesses[i].as<Solid::Block>();
0051             const auto storageVolume = storageAccesses[i].as<Solid::StorageVolume>();
0052             if (!storageVolume) {
0053                 continue;
0054             }
0055 
0056             const QString newPrefix = QStringLiteral("disk/") + (storageVolume->uuid().isEmpty() ? storageVolume->label() : storageVolume->uuid());
0057             // Old code uses "disk/sdc2_(8:34)/..."
0058             QString device = blockDevice->device().mid(strlen("/dev/"));
0059             const QString diskPrefix = QStringLiteral("disk/%1_(%2:%3)").arg(device).arg(blockDevice->deviceMajor()).arg(blockDevice->deviceMinor());
0060             QTest::addRow("disk%d",i)
0061             << QJsonArray {
0062                 {diskPrefix + QStringLiteral("/Rate/rio")},
0063                 {diskPrefix + QStringLiteral("/Rate/wio")},
0064             }
0065             << QJsonArray {
0066                 {newPrefix + QStringLiteral("/read")},
0067                 {newPrefix + QStringLiteral("/write")},
0068             };
0069             // Old code uses "partitions/mountPath/..."
0070             const QString mountPath = storageAccess->filePath() == QLatin1String("/") ? QStringLiteral("/__root__") : storageAccess->filePath();
0071             QString partitionPrefix = QStringLiteral("partitions") + mountPath;
0072             QTest::addRow("partition%d", i)
0073             << QJsonArray {
0074                 {partitionPrefix + QStringLiteral("/total")},
0075                 {partitionPrefix + QStringLiteral("/freespace")},
0076                 {partitionPrefix + QStringLiteral("/filllevel")},
0077                 {partitionPrefix + QStringLiteral("/usedspace")},
0078             } << QJsonArray {
0079                 {newPrefix + QStringLiteral("/total")},
0080                 {newPrefix + QStringLiteral("/free")},
0081                 {newPrefix + QStringLiteral("/usedPercent")},
0082                 {newPrefix + QStringLiteral("/used")},
0083             };
0084         }
0085 
0086         QTest::addRow("paritionsall")
0087         << QJsonArray {
0088             QStringLiteral("partitions/all/total"),
0089             QStringLiteral("partitions/all/freespace"),
0090             QStringLiteral("partitions/all/filllevel"),
0091             QStringLiteral("partitions/all/usedspace"),
0092         } <<  QJsonArray {
0093             QStringLiteral("disk/all/total"),
0094             QStringLiteral("disk/all/free"),
0095             QStringLiteral("disk/all/usedPercent"),
0096             QStringLiteral("disk/all/used"),
0097         };
0098 
0099         QTest::addRow("cpu")
0100         << QJsonArray {
0101             QStringLiteral("cpu/cpu1/clock"),
0102             QStringLiteral("cpu/cpu1/sys"),
0103             QStringLiteral("cpu/cpu1/TotalLoad"),
0104             QStringLiteral("cpu/system/sys"),
0105             QStringLiteral("cpu/system/TotalLoad"),
0106             QStringLiteral("cpu/system/user"),
0107             QStringLiteral("cpu/system/wait"),
0108         }
0109         << QJsonArray {
0110             QStringLiteral("cpu/cpu1/frequency"),
0111             QStringLiteral("cpu/cpu1/system"),
0112             QStringLiteral("cpu/cpu1/usage"),
0113             QStringLiteral("cpu/all/system"),
0114             QStringLiteral("cpu/all/usage"),
0115             QStringLiteral("cpu/all/user"),
0116             QStringLiteral("cpu/all/wait"),
0117         };
0118 
0119         QTest::addRow("memory")
0120         << QJsonArray{
0121             QStringLiteral("mem/physical/allocated"),
0122             QStringLiteral("mem/physical/allocatedlevel"),
0123             QStringLiteral("mem/physical/application"),
0124             QStringLiteral("mem/physical/applicationlevel"),
0125             QStringLiteral("mem/physical/available"),
0126             QStringLiteral("mem/physical/availablelevel"),
0127             QStringLiteral("mem/physical/buf"),
0128             QStringLiteral("mem/physical/buflevel"),
0129             QStringLiteral("mem/physical/cached"),
0130             QStringLiteral("mem/physical/cachedlevel"),
0131             QStringLiteral("mem/physical/free"),
0132             QStringLiteral("mem/physical/freelevel"),
0133             QStringLiteral("mem/physical/total"),
0134             QStringLiteral("mem/physical/used"),
0135             QStringLiteral("mem/physical/usedlevel"),
0136             QStringLiteral("mem/swap/free"),
0137             QStringLiteral("mem/swap/used"),
0138         } << QJsonArray {
0139             QStringLiteral("memory/physical/used"),
0140             QStringLiteral("memory/physical/usedPercent"),
0141             QStringLiteral("memory/physical/application"),
0142             QStringLiteral("memory/physical/applicationPercent"),
0143             QStringLiteral("memory/physical/free"),
0144             QStringLiteral("memory/physical/freePercent"),
0145             QStringLiteral("memory/physical/buffer"),
0146             QStringLiteral("memory/physical/bufferPercent"),
0147             QStringLiteral("memory/physical/cache"),
0148             QStringLiteral("memory/physical/cachePercent"),
0149             QStringLiteral("memory/physical/free"),
0150             QStringLiteral("memory/physical/freePercent"),
0151             QStringLiteral("memory/physical/total"),
0152             QStringLiteral("memory/physical/used"),
0153             QStringLiteral("memory/physical/usedPercent"),
0154             QStringLiteral("memory/swap/free"),
0155             QStringLiteral("memory/swap/used"),
0156         };
0157 
0158         QTest::addRow("gpu")
0159         << QJsonArray {
0160             QStringLiteral("nvidia/gpu1/temperature"),
0161             QStringLiteral("nvidia/gpu2/memory"),
0162             QStringLiteral("nvidia/gpu3/sharedMemory"),
0163             QStringLiteral("nvidia/gpu4/memoryClock"),
0164             QStringLiteral("nvidia/gpu5/processorClock"),
0165             QStringLiteral("nvidia/gpu6/encoderUsage"),
0166             QStringLiteral("nvidia/gpu7/decoderUsage"),
0167         }
0168         << QJsonArray {
0169             QStringLiteral("gpu/gpu1/temperature"),
0170             QStringLiteral("gpu/gpu2/usedVram"),
0171             QStringLiteral("gpu/gpu3/usedVram"),
0172             QStringLiteral("gpu/gpu4/memoryFrequency"),
0173             QStringLiteral("gpu/gpu5/coreFrequency"),
0174             QStringLiteral("gpu/gpu6/usage"),
0175             QStringLiteral("gpu/gpu7/usage"),
0176         };
0177 
0178         QTest::addRow("uptime")
0179         << QJsonArray {
0180             QStringLiteral("uptime"),
0181             QStringLiteral("system/uptime/uptime"),
0182         }
0183         << QJsonArray {
0184             QStringLiteral("os/system/uptime"),
0185             QStringLiteral("os/system/uptime"),
0186         };
0187     }
0188 
0189     void testSensorIdConversion()
0190     {
0191         QFETCH(QJsonArray, oldSensors);
0192         QFETCH(QJsonArray, expectedSensors);
0193         KConfig config;
0194         auto sensorsGroup = config.group("Sensors");
0195         sensorsGroup.writeEntry("sensors", QJsonDocument{oldSensors}.toJson(QJsonDocument::Compact));
0196 
0197         KSysGuard::SensorFaceControllerPrivate d;
0198 
0199         auto sensors = d.readAndUpdateSensors(sensorsGroup, QStringLiteral("sensors"));
0200 
0201         QCOMPARE(sensors.size(), expectedSensors.size());
0202 
0203         for (int i = 0; i < sensors.size(); ++i) {
0204             QCOMPARE(sensors.at(i).toString(), expectedSensors.at(i).toString());
0205         }
0206 
0207         auto newEntry = sensorsGroup.readEntry("sensors");
0208         QCOMPARE(newEntry.toUtf8(), QJsonDocument{expectedSensors}.toJson(QJsonDocument::Compact));
0209     }
0210 };
0211 
0212 QTEST_MAIN(SensorFaceControllerTest);
0213 
0214 #include "sensorfacecontrollertest.moc"