[libcalamares] Add tests for file-overwrite

This commit is contained in:
Adriaan de Groot 2020-02-24 12:38:08 +01:00
parent f89951716e
commit 862b7e34df

View File

@ -49,6 +49,8 @@ private Q_SLOTS:
void testCreationResult(); void testCreationResult();
void testTargetPath(); void testTargetPath();
void testCreateTarget(); void testCreateTarget();
void testCreateTargetExists();
void testCreateTargetOverwrite();
void testCreateTargetBasedirs(); void testCreateTargetBasedirs();
private: private:
@ -96,31 +98,32 @@ TestPaths::init()
m_gs->insert( "rootMountPoint", "/tmp" ); m_gs->insert( "rootMountPoint", "/tmp" );
} }
void TestPaths::testCreationResult() void
TestPaths::testCreationResult()
{ {
using Code = CalamaresUtils::CreationResult::Code; using Code = CalamaresUtils::CreationResult::Code;
for( auto c : { Code::OK, Code::AlreadyExists, Code::Failed, Code::Invalid } ) for ( auto c : { Code::OK, Code::AlreadyExists, Code::Failed, Code::Invalid } )
{ {
auto r = CalamaresUtils::CreationResult( c ); auto r = CalamaresUtils::CreationResult( c );
QVERIFY( r.path().isEmpty() ); QVERIFY( r.path().isEmpty() );
QCOMPARE( r.path(), QString() ); QCOMPARE( r.path(), QString() );
// Get a warning from Clang if we're not covering everything // Get a warning from Clang if we're not covering everything
switch( r.code() ) switch ( r.code() )
{ {
case Code::OK: case Code::OK:
QVERIFY( !r.failed() ); QVERIFY( !r.failed() );
QVERIFY( r ); QVERIFY( r );
break; break;
case Code::AlreadyExists: case Code::AlreadyExists:
QVERIFY( !r.failed() ); QVERIFY( !r.failed() );
QVERIFY( !r ); QVERIFY( !r );
break; break;
case Code::Failed: case Code::Failed:
case Code::Invalid: case Code::Invalid:
QVERIFY( r.failed() ); QVERIFY( r.failed() );
QVERIFY( !r ); QVERIFY( !r );
break; break;
} }
} }
@ -168,6 +171,75 @@ TestPaths::testCreateTarget()
QVERIFY( !fi2.exists() ); QVERIFY( !fi2.exists() );
} }
struct GSRollback
{
GSRollback( const QString& key )
: m_key( key )
, m_value( Calamares::JobQueue::instance()->globalStorage()->value( key ) )
{
}
~GSRollback() { Calamares::JobQueue::instance()->globalStorage()->insert( m_key, m_value ); }
QString m_key;
QVariant m_value;
};
void
TestPaths::testCreateTargetExists()
{
static const char ltestFile[] = "cala-test-world";
GSRollback g( QStringLiteral( "rootMountPoint" ) );
QTemporaryDir d;
d.setAutoRemove( true );
Calamares::JobQueue::instance()->globalStorage()->insert( QStringLiteral( "rootMountPoint" ), d.path() );
QVERIFY( QFileInfo( d.path() ).exists() );
auto r = m_system->createTargetFile( ltestFile, "Hello" );
QVERIFY( r );
QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 );
r = m_system->createTargetFile( ltestFile, "Goodbye" );
QVERIFY( !r.failed() ); // It didn't fail!
QVERIFY( !r ); // But not unqualified success, either
QVERIFY( r.path().isEmpty() );
QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 ); // Unchanged!
}
void
TestPaths::testCreateTargetOverwrite()
{
static const char ltestFile[] = "cala-test-world";
GSRollback g( QStringLiteral( "rootMountPoint" ) );
QTemporaryDir d;
d.setAutoRemove( true );
Calamares::JobQueue::instance()->globalStorage()->insert( QStringLiteral( "rootMountPoint" ), d.path() );
QVERIFY( QFileInfo( d.path() ).exists() );
auto r = m_system->createTargetFile( ltestFile, "Hello" );
QVERIFY( r );
QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 );
r = m_system->createTargetFile( ltestFile, "Goodbye", CalamaresUtils::System::WriteMode::KeepExisting );
QVERIFY( !r.failed() ); // It didn't fail!
QVERIFY( !r ); // But not unqualified success, either
QVERIFY( r.path().isEmpty() );
QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 5 ); // Unchanged!
r = m_system->createTargetFile( ltestFile, "Goodbye", CalamaresUtils::System::WriteMode::Overwrite );
QVERIFY( !r.failed() ); // It didn't fail!
QVERIFY( r ); // Total success
QVERIFY( r.path().endsWith( QString( ltestFile ) ) );
QCOMPARE( QFileInfo( d.filePath( QString( ltestFile ) ) ).size(), 7 );
}
struct DirRemover struct DirRemover
{ {
DirRemover( const QString& base, const QString& dir ) DirRemover( const QString& base, const QString& dir )