The unit tests architecture
Leo Franchi
lfranchi at kde.org
Fri Jan 29 00:12:43 CET 2010
On Wed, Jan 27, 2010 at 8:00 PM, Nathan Sala <sala.nathan at gmail.com> wrote:
> Hello,
>
> Anyway, while working on Data Engines, we are stuck because we simply can't
> link to
> our engines in our test files. It is the consequence of the fact that the
> Data Engines are not
> linkable from our test directory. The tests are part of amaroklib_LIB_SRCS
> and the engines
> link to amaroklib_LIB_SRCS but are not part of it. The result is we can't
> instanciate any of
> our data engines in the test folder. Adding the DataEngines classes into
> amaroklib_LIB_SRCS
> will result in linking error due to recursive inclusion (if I understand
> correctly).
>
>
> We have thought about two solutions:
>
> Perform "black box tests" instead of "white box" ==> use the DataEngine
> methods
> instead of MyAppletDataEngine methods. But the problem is the way to request
> a
> DataEngine from the KDE plugin service seems complex regarding to the
> Applet::dataEngine(QString)
> method. If you someone knows a more simple way to request the DataEngine,
> please let us know.
I don';t know much about unit testing so i'm going to respond only to
this KDE/plasma-specific part of the email. You can't use the applet
::dataEngine() methods to load the dataengine automatically, right? so
you can load the dataengines yourself through the KTrader system.
it would look something like this: (from DataEngineManager.cpp::loadEngine()
Plasma::DataEngine *engine = 0;
// load the engine, add it to the engines
QString constraint = QString("[X-KDE-PluginInfo-Name] == 'PLUGIN
NAME OF THE DATA ENGINE YOU WANT'").arg(name);
KService::List offers =
KServiceTypeTrader::self()->query("Plasma/DataEngine", constraint);
QString error;
if (offers.isEmpty()) {
kDebug() << "offers are empty for " << name << " with
constraint " << constraint;
} else {
QVariantList allArgs;
allArgs << offers.first()->storageId();
QString api = offers.first()->property("X-Plasma-API").toString();
if (api.isEmpty()) {
if (offers.first()) {
KPluginLoader plugin(*offers.first());
if (Plasma::isPluginVersionCompatible(plugin.pluginVersion())) {
engine =
offers.first()->createInstance<Plasma::DataEngine>(0, allArgs,
&error);
}
}
} else {
engine = new DataEngine(0, offers.first());
}
}
And there you go, you have your DataEngine pointer from the plugin
name, without having to use anything plasma-specific.
hth,
leo
--
______________________________________________________
lfranchi at kde.org Tufts University 2010
leonardo.franchi at tufts.edu The KDE Project
More information about the Amarok-devel
mailing list