source: calamares/trunk/fuentes/src/calamares/testmain.cpp @ 7538

Last change on this file since 7538 was 7538, checked in by kbut, 13 months ago

sync with github

File size: 5.5 KB
Line 
1/* === This file is part of Calamares - <https://github.com/calamares> ===
2 *
3 *   Copyright 2018, Adriaan de Groot <groot@kde.org>
4 *
5 *   Calamares is free software: you can redistribute it and/or modify
6 *   it under the terms of the GNU General Public License as published by
7 *   the Free Software Foundation, either version 3 of the License, or
8 *   (at your option) any later version.
9 *
10 *   Calamares is distributed in the hope that it will be useful,
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 *   GNU General Public License for more details.
14 *
15 *   You should have received a copy of the GNU General Public License
16 *   along with Calamares. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/*
20 * This executable loads and runs a Calamares Python module
21 * within a C++ application, in order to test the different
22 * bindings.
23 */
24
25#include "utils/Logger.h"
26#include "utils/YamlUtils.h"
27#include "modulesystem/Module.h"
28
29#include "Settings.h"
30#include "Job.h"
31#include "JobQueue.h"
32
33#include <QCommandLineOption>
34#include <QCommandLineParser>
35#include <QCoreApplication>
36#include <QFileInfo>
37
38#include <memory>
39
40struct ModuleConfig : public QPair< QString, QString >
41{
42    ModuleConfig( const QString& a, const QString& b ) : QPair< QString, QString >(a, b) { }
43    ModuleConfig() : QPair< QString, QString >( QString(), QString() ) { }
44
45    QString moduleName() const { return first; }
46    QString configFile() const { return second; }
47} ;
48
49static ModuleConfig
50handle_args( QCoreApplication& a )
51{
52    QCommandLineOption debugLevelOption( QStringLiteral("D"),
53                                          "Verbose output for debugging purposes (0-8).", "level" );
54
55    QCommandLineParser parser;
56    parser.setApplicationDescription( "Calamares module tester" );
57    parser.addHelpOption();
58    parser.addVersionOption();
59
60    parser.addOption( debugLevelOption );
61    parser.addPositionalArgument( "module", "Path or name of module to run." );
62
63    parser.process( a );
64
65    if ( parser.isSet( debugLevelOption ) )
66    {
67        bool ok = true;
68        int l = parser.value( debugLevelOption ).toInt( &ok );
69        unsigned int dlevel = 0;
70        if ( !ok || ( l < 0 ) )
71            dlevel = Logger::LOGVERBOSE;
72        else
73            dlevel = l;
74        Logger::setupLogLevel( dlevel );
75    }
76
77    const QStringList args = parser.positionalArguments();
78    if ( args.isEmpty() )
79    {
80        cError() << "Missing <module> path.\n";
81        parser.showHelp();
82        return ModuleConfig();  // NOTREACHED
83    }
84    if ( args.size() > 2 )
85    {
86        cError() << "More than one <module> path.\n";
87        parser.showHelp();
88        return ModuleConfig();  // NOTREACHED
89    }
90
91    return ModuleConfig( args.first(), args.size() == 2 ? args.at(1) : QString() );
92}
93
94
95static Calamares::Module*
96load_module( const ModuleConfig& moduleConfig )
97{
98    QString moduleName = moduleConfig.moduleName();
99    QFileInfo fi;
100
101    bool ok = false;
102    QVariantMap descriptor;
103
104    for ( const QString& prefix : QStringList{ "./", "src/modules/", "modules/" } )
105    {
106        // Could be a complete path, eg. src/modules/dummycpp/module.desc
107        fi = QFileInfo( prefix + moduleName );
108        if ( fi.exists() && fi.isFile() )
109            descriptor = CalamaresUtils::loadYaml( fi, &ok );
110        if ( ok )
111            break;
112
113        // Could be a path without module.desc
114        fi = QFileInfo( prefix + moduleName );
115        if ( fi.exists() && fi.isDir() )
116        {
117            fi = QFileInfo( prefix + moduleName + "/module.desc" );
118            if ( fi.exists() && fi.isFile() )
119                descriptor = CalamaresUtils::loadYaml( fi, &ok );
120            if ( ok ) break;
121        }
122    }
123
124    if ( !ok )
125    {
126        cWarning() << "No suitable module descriptor found.";
127        return nullptr;
128    }
129
130    QString name = descriptor.value( "name" ).toString();
131    if ( name.isEmpty() )
132    {
133        cWarning() << "No name found in module descriptor" << fi.absoluteFilePath();
134        return nullptr;
135    }
136
137    QString moduleDirectory = fi.absolutePath();
138    QString configFile(
139        moduleConfig.configFile().isEmpty()
140        ? moduleDirectory + '/' + name + ".conf"
141        : moduleConfig.configFile() );
142
143    Calamares::Module* module = Calamares::Module::fromDescriptor(
144        descriptor, name, configFile, moduleDirectory );
145
146    return module;
147}
148
149int
150main( int argc, char* argv[] )
151{
152    QCoreApplication a( argc, argv );
153
154    ModuleConfig module = handle_args( a );
155    if ( module.moduleName().isEmpty() )
156        return 1;
157
158    std::unique_ptr< Calamares::Settings > settings_p( new Calamares::Settings( QString(), true ) );
159    std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) );
160
161    cDebug() << "Calamares test module-loader" << module.moduleName();
162    Calamares::Module* m = load_module( module );
163    if ( !m )
164    {
165        cError() << "Could not load module" << module.moduleName();
166        return 1;
167    }
168
169    if ( !m->isLoaded() )
170        m->loadSelf();
171
172    if ( !m->isLoaded() )
173    {
174        cError() << "Module" << module.moduleName() << "could not be loaded.";
175        return 1;
176    }
177
178    cDebug() << "Module" << m->name() << m->typeString() << m->interfaceString();
179
180    Calamares::JobList jobList = m->jobs();
181    unsigned int count = 1;
182    for ( const auto& p : jobList )
183    {
184        cDebug() << count << p->prettyName();
185        Calamares::JobResult r = p->exec();
186        if ( !r )
187            cDebug() << count << ".. failed" << r;
188        ++count;
189    }
190
191    return 0;
192}
Note: See TracBrowser for help on using the repository browser.