[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdelibs/kdecore
From: David Faure <faure () kde ! org>
Date: 2010-12-08 13:35:15
Message-ID: 20101208133515.6347EAC8A5 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1204637 by dfaure:
Further fixes to kDebug:
* Since KConfig works without a main componentdata nowadays (auto-created by \
kglobal), make kDebug work pretty much the same in qt-only apps as in kde apps, \
including obeying kdebugrc settings. The only difference is that area 0 (and unknown \
areas) are called qAppName() rather than main-component-data-name.
* Update that name when the main component data gets created, even after early \
kDebugs.
* Make the handling of unknown numbered areas more consistent (using the settings for \
area 0)
* Complete unittest for the "no component data" case, in a separate program called by \
kdebug_unittest.
CCMAIL: mpyne@kde.org
M +26 -23 io/kdebug.cpp
M +1 -0 tests/CMakeLists.txt
A tests/kdebug_qcoreapptest.cpp [License: LGPL (v2+)]
M +43 -5 tests/kdebug_unittest.cpp
M +1 -0 tests/kdebug_unittest.h
M +0 -4 tests/qcoreapptest.cpp
--- trunk/KDE/kdelibs/kdecore/io/kdebug.cpp #1204636:1204637
@@ -217,7 +217,7 @@
typedef QHash<unsigned int, Area> Cache;
KDebugPrivate()
- : config(0), kDebugDBusIface(0), m_disableAll(false)
+ : config(0), kDebugDBusIface(0), m_disableAll(false), \
m_seenMainComponent(false) {
Q_ASSERT(int(QtDebugMsg) == 0);
Q_ASSERT(int(QtFatalMsg) == 3);
@@ -252,14 +252,20 @@
void loadAreaNames()
{
- cache.clear();
+ // Don't clear the cache here, that would lose previously registered dynamic \
areas + //cache.clear();
Area &areaData = cache[0];
areaData.clear();
- Q_ASSERT(KGlobal::hasMainComponent());
+ if (KGlobal::hasMainComponent()) {
areaData.name = KGlobal::mainComponent().componentName().toUtf8();
- //qDebug() << "loadAreaNames: area 0 has name" << \
KGlobal::mainComponent().componentName().toUtf8(); + m_seenMainComponent = \
true; + } else {
+ areaData.name = qApp ? qAppName().toUtf8() : QByteArray("unnamed app");
+ m_seenMainComponent = false;
+ }
+ //qDebug() << "loadAreaNames: area 0 has name" << areaData.name;
for (int i = 0; i < 8; i++) {
m_nullOutputYesNoCache[i] = -1;
@@ -325,7 +331,7 @@
OutputMode areaOutputMode(QtMsgType type, unsigned int area, bool \
enableByDefault) {
- if (!config)
+ if (!configObject())
return QtOutput;
QString key;
@@ -355,7 +361,7 @@
QString logFileName(QtMsgType type, unsigned int area)
{
- if (!config)
+ if (!configObject())
return QString();
const char* aKey;
@@ -391,30 +397,22 @@
Cache::Iterator areaData(QtMsgType type, unsigned int num, bool enableByDefault \
= true) {
- if (!configObject() || !KGlobal::hasMainComponent()) {
- // we don't have a config and we can't create one...
- // or we don't have a main component (yet?)
- Area &area = cache[0]; // create a dummy entry
- if (area.name.isEmpty()) {
- if (KGlobal::hasMainComponent())
- area.name = KGlobal::mainComponent().componentName().toUtf8();
- else
- area.name = qApp ? qAppName().toUtf8() : QByteArray("unnamed \
app");
- }
- //qDebug() << "Created dummy entry for area 0 with name" << area.name;
- return cache.find(0);
- }
-
- if (!cache.contains(0) || (cache.count() == 1 && \
KGlobal::hasMainComponent())) { + if (!cache.contains(0)) {
//qDebug() << "cache size=" << cache.count() << "loading area names";
loadAreaNames(); // fills 'cache'
+ Q_ASSERT(cache.contains(0));
+ } else if (!m_seenMainComponent && KGlobal::hasMainComponent()) {
+ // Update the name for area 0 once a main component exists
+ cache[0].name = KGlobal::mainComponent().componentName().toUtf8();
+ m_seenMainComponent = true;
}
Cache::Iterator it = cache.find(num);
if (it == cache.end()) {
// unknown area
Q_ASSERT(cache.contains(0));
- return cache.find(0);
+ it = cache.find(0);
+ num = 0;
}
if (num == 0 && type == QtDebugMsg) { // area 0 is special, it becomes the \
named area "appname" @@ -433,6 +431,8 @@
if (it->mode[lev] == FileOutput && it->logFileName[lev].isEmpty())
it->logFileName[lev] = logFileName(type, num);
+ Q_ASSERT(it->mode[lev] != Unknown);
+
return it;
}
@@ -630,6 +630,7 @@
static bool env_colored = (!qgetenv("KDE_COLOR_DEBUG").isEmpty());
Cache::Iterator it = areaData(type, area);
OutputMode mode = it->mode[level(type)];
+ Q_ASSERT(mode != Unknown);
QString file = it->logFileName[level(type)];
QByteArray areaName = it->name;
@@ -649,11 +650,11 @@
case SyslogOutput:
s = setupSyslogWriter(type);
break;
- case Unknown: // don't want kdelibs debug output in Qt-only programs with no \
componentdata (-> no kdebugrc) case NoOutput:
s = QDebug(&devnull);
return s; //no need to take the time to "print header" if we don't want \
to output anyway break;
+ case Unknown: // should not happen
default: // QtOutput
s = setupQtWriter(type);
#ifndef Q_OS_WIN
@@ -686,6 +687,7 @@
KDebugDBusIface *kDebugDBusIface;
Cache cache;
bool m_disableAll;
+ bool m_seenMainComponent; // false: area zero still contains qAppName
int m_nullOutputYesNoCache[8];
KNoDebugStream devnull;
@@ -861,6 +863,7 @@
}
KDebugPrivate::Area areaData;
areaData.name = areaName;
+ //qDebug() << "Assigning area number" << areaNumber << "for name" << areaName;
d->cache.insert(areaNumber, areaData);
d->writeGroupForNamedArea(areaName, enabled);
return areaNumber;
--- trunk/KDE/kdelibs/kdecore/tests/CMakeLists.txt #1204636:1204637
@@ -68,6 +68,7 @@
kdebug_unittest
kencodingdetectortest
qcoreapptest
+ kdebug_qcoreapptest
)
if(NOT KDE_NO_DEPRECATED)
--- trunk/KDE/kdelibs/kdecore/tests/kdebug_unittest.cpp #1204636:1204637
@@ -23,6 +23,7 @@
#include <kconfiggroup.h>
#include <qtest_kde.h>
#include <kdebug.h>
+#include <kprocess.h>
#include <kstandarddirs.h>
#include "kdebug_unittest.moc"
@@ -45,9 +46,11 @@
config.group("qttest").writeEntry("WarnOutput", 0 /*FileOutput*/);
config.sync();
+ //QCOMPARE(KDebug::hasNullOutput(QtDebugMsg, true, 0, false), false);
+
// Test for crash that used to happen when using an unknown area after only \
dynamic areas
- KDebug::registerArea("somearea");
- KDebug::registerArea("someotherarea");
+ KDebug::registerArea("somearea"); // gets number 1
+ KDebug::registerArea("someotherarea"); // gets number 2
QCOMPARE(KDebug::hasNullOutput(QtDebugMsg, true, 4242, false), false); // \
unknown area -> area 0 is being used
kClearDebugConfig();
@@ -179,14 +182,14 @@
void KDebugTest::testDynamicArea()
{
- const int myArea = KDebug::registerArea("myarea");
- QVERIFY(myArea > 0);
+ const int myArea = KDebug::registerArea("myarea"); // gets number 3
+ QCOMPARE(myArea, 3);
KConfig config("kdebugrc");
QVERIFY(!config.hasGroup(QString::number(myArea)));
QVERIFY(config.hasGroup("myarea"));
kDebug(myArea) << "TEST DEBUG using myArea" << myArea;
QList<QByteArray> expected;
- expected << "/myarea KDebugTest::testDynamicArea: TEST DEBUG using myArea 1\n";
+ expected << "/myarea KDebugTest::testDynamicArea: TEST DEBUG using myArea 3\n";
compareLines(expected, "myarea.dbg");
}
@@ -252,6 +255,41 @@
kClearDebugConfig();
}
+void KDebugTest::testNoMainComponentData()
+{
+ // This test runs kdebug_qcoreapptest and checks its output
+ KProcess proc;
+ proc.setEnv("KDE_DEBUG_NOPROCESSINFO", "1");
+ proc.setOutputChannelMode(KProcess::OnlyStderrChannel);
+#ifdef Q_OS_WIN
+ proc << "kdebug_qcoreapptest.exe";
+#else
+ if (QFile::exists("./kdebug_qcoreapptest.shell"))
+ proc << "./kdebug_qcoreapptest.shell";
+ else {
+ QVERIFY(QFile::exists("./kdebug_qcoreapptest"));
+ proc << "./kdebug_qcoreapptest";
+ }
+#endif
+ // kDebug() << proc.args();
+ const int ok = proc.execute();
+ QVERIFY(ok == 0);
+ const QByteArray allOutput = proc.readAllStandardError();
+ const QList<QByteArray> receivedLines = allOutput.split('\n');
+ //qDebug() << receivedLines;
+ QList<QByteArray> expectedLines;
+ expectedLines << "qcoreapp_myarea main: Test debug using qcoreapp_myarea 1";
+ expectedLines << "kdebug_qcoreapptest main: Debug in area 100";
+ expectedLines << "kdebug_qcoreapptest main: Simple debug";
+ expectedLines << "kdebug_qcoreapptest_mainData main: This should appear, under \
the kdebug_qcoreapptest_mainData area"; + expectedLines << \
"kdebug_qcoreapptest_mainData main: Debug in area 100"; + expectedLines << ""; // \
artefact of split, I guess? + for (int i = 0; i < qMin(expectedLines.count(), \
receivedLines.count()); ++i) + QCOMPARE(QString::fromLatin1(receivedLines[i]), \
QString::fromLatin1(expectedLines[i])); + QCOMPARE(receivedLines.count(), \
expectedLines.count()); + QCOMPARE(receivedLines, expectedLines);
+}
+
#include <QThreadPool>
#include <qtconcurrentrun.h>
--- trunk/KDE/kdelibs/kdecore/tests/kdebug_unittest.h #1204636:1204637
@@ -37,6 +37,7 @@
void testDisabledDynamicArea();
void testDisableAll();
void testHasNullOutput();
+ void testNoMainComponentData();
void testMultipleThreads();
private:
--- trunk/KDE/kdelibs/kdecore/tests/qcoreapptest.cpp #1204636:1204637
@@ -36,10 +36,6 @@
const QString ok = i18n("OK");
Q_UNUSED(ok);
- // Test that KDebug works
- kDebug() << "This should appear, but disabling qcoreapptest in kdebugdialog \
should make it go away.";
- // TODO automate the above test, see kdebug_unittest.cpp
-
return 0;
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic