void testInstalledPackages(installedPackageFixture *fixture, gconstpointer testData) {
    (void)testData;
    // Note: it is probably not possible to mock functions used in getInstalledPackages
    // for quering. Thus this method return list of packages installed in current system
    GPtrArray *installedPackages = getInstalledPackages(fixture->rpmDbSack);
    // We expect that the length of the list will be bigger than zero :-)
    g_assert_cmpint(installedPackages->len, >, 0);
    g_ptr_array_unref(installedPackages);
}
void setupPackageRepo(packageRepoFixture *fixture, gconstpointer testData) {
    (void) testData;
    fixture->dnfContext = dnf_context_new();
    fixture->repos = g_ptr_array_sized_new(2);
    // First repo
    DnfRepo *repo1 = dnf_repo_new(fixture->dnfContext);
    dnf_repo_set_id(repo1, "foo-bar");
    g_ptr_array_add(fixture->repos, repo1);
    // Second repo
    DnfRepo *repo2 = dnf_repo_new(fixture->dnfContext);
    dnf_repo_set_id(repo2, "foo-bar-testing");
    g_ptr_array_add(fixture->repos, repo2);
    fixture->enabledRepoAndProductIds = g_ptr_array_sized_new(fixture->repos->len);
    fixture->activeRepoAndProductIds = g_ptr_array_sized_new(fixture->repos->len);
    fixture->rpmDbSack = dnf_sack_new();
    fixture->installedPackages = getInstalledPackages(fixture->rpmDbSack);
}
// Data available in the standard stream
void OctaveBind::readyStdOut()
{
  QByteArray aux;

  aux = octaveProcess.readAllStandardOutput();
  stdOutput += aux;
  buffer    += aux;

  // Search for end of output (OCTAVE_PROMPT)
  if(buffer.trimmed().endsWith(OCTAVE_PROMPT))
  {
    // Remove prompt
    buffer = buffer.trimmed();
    buffer.chop(QString(OCTAVE_PROMPT).length());
    buffer = buffer.trimmed();

    // What we want depends of the status
    QRegExp regExp;
    int pos;
    switch(status)
    {
      // Installation prefix
      case OctaveBind::WaitingPrefix | OctaveBind::Initializing:
      case OctaveBind::WaitingPrefix:
	// Get prefix
	regExp.setPattern("Installation prefix:\\s+(\\S+)");
	if(regExp.indexIn(buffer) > -1)
	{
	  installPath = regExp.cap(1);
	  std::cout << "[OctaveBind::readyStdOut()] Installation prefix: '"
		    << installPath.toLocal8Bit().constData()
		    << "'"
		    << std::endl;
	}else
	  std::cerr << "[OctaveBind::readyStdOut()] Wrong prefix format" << std::endl;

	// If we are initializing, ask for installed packages
	if(status == (OctaveBind::WaitingPrefix | OctaveBind::Initializing))
	{
	  status = OctaveBind::Ready;
	  getInstalledPackages(true);
	}else
	  status = OctaveBind::Ready;

	break;
      // Waiting packages
      case OctaveBind::WaitingPackages:
	installedPackages.clear();
	regExp.setPattern("\\s*(\\w+)\\s*\\*?\\|\\s*(\\d+)\\.(\\d+)\\.(\\d+)\\s*\\|\\s*(\\S+)");
	pos = 0;
	while((pos = regExp.indexIn(buffer, pos)) != -1)
	{
	  Package pack;

	  pack.name      = regExp.cap(1);
	  pack.vMajor    = regExp.cap(2).toInt();
	  pack.vMinor    = regExp.cap(3).toInt();
	  pack.vRevision = regExp.cap(4).toInt();
	  pack.url       = regExp.cap(5);
	  pack.installed = true;

	  installedPackages.append(pack);

	  pos += regExp.matchedLength();
	}

	status = OctaveBind::Ready;
	break;
      // Install or remove
      case OctaveBind::Removing:
      case OctaveBind::Installing:
	status = OctaveBind::Ready;
	getInstalledPackages(true);
	break;
      // Unknown
      default:
	std::cerr << "[OctaveBind::readyStdOut()] Unknow or invalid status" << std::endl;
	status = OctaveBind::Ready;
    }


    // Signals
    emit stdOut();
    emit success();
    // Clear
    buffer.clear();
    stdOutput.clear();
  }else
  {
    // Signals
    emit stdOut();
  }
}
void
KernelModel::update()
{
    QHash<QString, QString> installedKernelPackages = getInstalledPackages();
    QHash<QString, QString> availableKernelPackages = getAvailablePackages();

    QHash<QString, QString> allKernelPackages;
    allKernelPackages.unite( installedKernelPackages );
    QHashIterator<QString, QString> i( availableKernelPackages );
    while ( i.hasNext() )
    {
        i.next();
        allKernelPackages.insert( i.key(), i.value() );
    }

    QString runningKernel = getRunningKernel();
    QStringList ltsKernels = getLtsKernels();
    QStringList recommendedKernels = getRecommendedKernels();

    QSet<QString> modulesToInstall;
    for ( const QString& module : QStringList( installedKernelPackages.keys() ).filter( QRegularExpression( "^linux[0-9][0-9]?([0-9])-" ) ) )
    {
        QString aux = QString( module ).remove( QRegularExpression( "^linux[0-9][0-9]?([0-9])-" ) );
        modulesToInstall.insert( aux );
    }

    beginResetModel();
    m_kernels.clear();
    for ( const QString& kernel : QStringList( allKernelPackages.keys() ).filter( QRegularExpression( "^linux[0-9][0-9]?([0-9])$" ) ) )
    {
        Kernel newKernel;

        newKernel.setPackage( kernel );
        newKernel.setAvailable( availableKernelPackages.contains( kernel ) );
        newKernel.setInstalled( installedKernelPackages.contains( kernel ) );
        newKernel.setVersion( allKernelPackages.value( kernel ) );
        newKernel.setAvailableModules( QStringList( availableKernelPackages.keys() )
                                       .filter( QRegularExpression( QString( "^%1-" ).arg( kernel ) ) ) );
        if ( newKernel.isInstalled() )
        {
            newKernel.setInstalledModules( QStringList( installedKernelPackages.keys() )
                                           .filter( QRegularExpression( QString( "^%1-" ).arg( kernel ) ) ) );
        }
        else
        {
            QStringList installableModules;
            for ( const QString& module : modulesToInstall )
            {
                QString modulePackage = QString( "%1-%2" ).arg( kernel ).arg( module );
                if ( availableKernelPackages.contains( modulePackage ) )
                    installableModules << modulePackage;
            }
            newKernel.setInstalledModules( installableModules );
        }
        newKernel.setLts( ltsKernels.contains( kernel ) );
        newKernel.setRecommended( recommendedKernels.contains( kernel ) );
        newKernel.setRunning( QString::compare( runningKernel, kernel ) == 0 );

        m_kernels.append( newKernel );
    }
    endResetModel();
}