Publish Framework tray enhancements and idle fingerprint retry

This commit is contained in:
ajp_anton
2026-09-20 20:48:34 +00:00
parent 61ef199667
commit ddb912d4ba
25 changed files with 654 additions and 61 deletions
@@ -15,6 +15,54 @@ class HardwareTest : public QObject {
QFile file(path); QVERIFY(file.open(QIODevice::WriteOnly)); QCOMPARE(file.write(value), value.size());
}
private Q_SLOTS:
void coreGroupFrequencies() {
QTemporaryDir root;
const QString base = root.path() + "/devices/system/cpu/cpufreq/";
for (int i = 0; i < 3; ++i) {
const auto policy = base + "policy" + QString::number(i) + "/";
put(policy + "related_cpus", QByteArray::number(i));
put(policy + "scaling_cur_freq", QByteArray::number((i + 1) * 1000000));
}
// No core-type metadata: retain the original combined reading.
auto sensors = frequencySensors(root.path());
QCOMPARE(sensors.size(), 1);
QCOMPARE(sensors[0].id, QString("cpu"));
QVERIFY(sensors[0].primary);
QCOMPARE(sensorValue(sensors[0]), std::optional<double>(2000));
put(root.path() + "/bus/event_source/devices/cpu_core/cpus", "2");
put(root.path() + "/bus/event_source/devices/cpu_atom/cpus", "0-1");
sensors = frequencySensors(root.path());
QCOMPARE(sensors.size(), 5);
QCOMPARE(sensors[0].id, QString("cpu/p"));
QCOMPARE(sensors[1].id, QString("cpu/e"));
QCOMPARE(sensors[2].id, QString("cpu"));
QVERIFY(sensors[0].primary && sensors[1].primary && !sensors[2].primary);
QCOMPARE(sensorValue(sensors[0]), std::optional<double>(3000));
QCOMPARE(sensorValue(sensors[1]), std::optional<double>(1500));
QCOMPARE(sensorValue(sensors[2]), std::optional<double>(2000));
QCOMPARE(sensors[3].id, QString("cpu/p/max"));
QCOMPARE(sensors[4].id, QString("cpu/e/max"));
QVERIFY(!sensors[3].primary && !sensors[4].primary);
QCOMPARE(sensorValue(sensors[3]), std::optional<double>(3000));
QCOMPARE(sensorValue(sensors[4]), std::optional<double>(2000));
put(base + "policy0/scaling_cur_freq", "4000000");
QCOMPARE(sensorValue(sensors[4]), std::optional<double>(4000));
put(base + "policy0/scaling_cur_freq", "1000000");
QCOMPARE(sensorValue(sensors[4]), std::optional<double>(2000)); // Not a historical peak.
// Missing readings aren't zeroes, and membership isn't guessed by speed.
put(base + "policy0/scaling_cur_freq", "unavailable");
QCOMPARE(sensorValue(sensors[1]), std::optional<double>(2000));
QCOMPARE(sensorValue(sensors[4]), std::optional<double>(2000));
put(base + "policy1/scaling_cur_freq", "unavailable");
QVERIFY(!sensorValue(sensors[1]));
QVERIFY(!sensorValue(sensors[4]));
QCOMPARE(sensorValue(sensors[2]), std::optional<double>(3000));
put(base + "policy2/related_cpus", "1 2");
sensors = frequencySensors(root.path());
QCOMPARE(sensors.size(), 1); // A policy spanning types cannot be split.
QVERIFY(sensors[0].primary);
}
void energyCounters() {
EnergyCounter counter;
const quint64 range = 262143328850ULL;