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