summaryrefslogtreecommitdiffstats
path: root/certmanager/lib/tests/test_cryptoconfig.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'certmanager/lib/tests/test_cryptoconfig.cpp')
-rw-r--r--certmanager/lib/tests/test_cryptoconfig.cpp365
1 files changed, 365 insertions, 0 deletions
diff --git a/certmanager/lib/tests/test_cryptoconfig.cpp b/certmanager/lib/tests/test_cryptoconfig.cpp
new file mode 100644
index 00000000..17d1b447
--- /dev/null
+++ b/certmanager/lib/tests/test_cryptoconfig.cpp
@@ -0,0 +1,365 @@
+/*
+ test_cryptoconfig.cpp
+
+ This file is part of libkleopatra's test suite.
+ Copyright (c) 2004 Klarälvdalens Datakonsult AB
+
+ Libkleopatra is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License,
+ version 2, as published by the Free Software Foundation.
+
+ Libkleopatra is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+*/
+
+#include <backends/qgpgme/qgpgmecryptoconfig.h>
+
+#include <kapplication.h>
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <iostream>
+using namespace std;
+
+#include <stdlib.h>
+#include <assert.h>
+
+int main( int argc, char** argv ) {
+
+ KAboutData aboutData( "test_cryptoconfig", "CryptoConfig Test", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KApplication app( false, false );
+
+ Kleo::CryptoConfig * config = new QGpgMECryptoConfig();
+
+ // Dynamic querying of the options
+ cout << "Components:" << endl;
+ QStringList components = config->componentList();
+
+ for( QStringList::Iterator compit = components.begin(); compit != components.end(); ++compit ) {
+ cout << "Component " << (*compit).local8Bit() << ":" << endl;
+ const Kleo::CryptoConfigComponent* comp = config->component( *compit );
+ assert( comp );
+ QStringList groups = comp->groupList();
+ for( QStringList::Iterator groupit = groups.begin(); groupit != groups.end(); ++groupit ) {
+ const Kleo::CryptoConfigGroup* group = comp->group( *groupit );
+ assert( group );
+ cout << " Group " << (*groupit).local8Bit() << ": descr=\"" << group->description().local8Bit() << "\""
+ << " level=" << group->level() << endl;
+ QStringList entries = group->entryList();
+ for( QStringList::Iterator entryit = entries.begin(); entryit != entries.end(); ++entryit ) {
+ const Kleo::CryptoConfigEntry* entry = group->entry( *entryit );
+ assert( entry );
+ cout << " Entry " << (*entryit).local8Bit() << ":"
+ << " descr=\"" << entry->description().local8Bit() << "\""
+ << " " << ( entry->isSet() ? "is set" : "is not set" );
+ if ( !entry->isList() )
+ switch( entry->argType() ) {
+ case Kleo::CryptoConfigEntry::ArgType_None:
+ break;
+ case Kleo::CryptoConfigEntry::ArgType_Int:
+ cout << " int value=" << entry->intValue();
+ break;
+ case Kleo::CryptoConfigEntry::ArgType_UInt:
+ cout << " uint value=" << entry->uintValue();
+ break;
+ case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
+ case Kleo::CryptoConfigEntry::ArgType_URL:
+ cout << " URL value=" << entry->urlValue().prettyURL().local8Bit();
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_Path:
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_DirPath:
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_String:
+
+ cout << " string value=" << entry->stringValue().local8Bit();
+ break;
+ }
+ else // lists
+ {
+ switch( entry->argType() ) {
+ case Kleo::CryptoConfigEntry::ArgType_None: {
+ cout << " set " << entry->numberOfTimesSet() << " times";
+ break;
+ }
+ case Kleo::CryptoConfigEntry::ArgType_Int: {
+ assert( entry->isOptional() ); // empty lists must be allowed (see issue121)
+ QValueList<int> lst = entry->intValueList();
+ QString str;
+ for( QValueList<int>::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ str += QString::number( *it );
+ }
+ cout << " int values=" << str.local8Bit();
+ break;
+ }
+ case Kleo::CryptoConfigEntry::ArgType_UInt: {
+ assert( entry->isOptional() ); // empty lists must be allowed (see issue121)
+ QValueList<uint> lst = entry->uintValueList();
+ QString str;
+ for( QValueList<uint>::Iterator it = lst.begin(); it != lst.end(); ++it ) {
+ str += QString::number( *it );
+ }
+ cout << " uint values=" << str.local8Bit();
+ break;
+ }
+ case Kleo::CryptoConfigEntry::ArgType_LDAPURL:
+ case Kleo::CryptoConfigEntry::ArgType_URL: {
+ assert( entry->isOptional() ); // empty lists must be allowed (see issue121)
+ KURL::List urls = entry->urlValueList();
+ cout << " url values=" << urls.toStringList().join(" ").local8Bit() << "\n ";
+ }
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_Path:
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_DirPath:
+ // fallthrough
+ case Kleo::CryptoConfigEntry::ArgType_String: {
+ assert( entry->isOptional() ); // empty lists must be allowed (see issue121)
+ QStringList lst = entry->stringValueList();
+ cout << " string values=" << lst.join(" ").local8Bit();
+ break;
+ }
+ }
+ }
+ cout << endl;
+ }
+ // ...
+ }
+ }
+
+ {
+ // Static querying of a single boolean option
+ static const char* s_groupName = "Monitor";
+ static const char* s_entryName = "quiet";
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ if ( entry ) {
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_None );
+ bool val = entry->boolValue();
+ cout << "quiet option initially: " << ( val ? "is set" : "is not set" ) << endl;
+
+ entry->setBoolValue( !val );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ // Clear cached values!
+ config->clear();
+
+ // Check new value
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( entry );
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_None );
+ cout << "quiet option now: " << ( val ? "is set" : "is not set" ) << endl;
+ assert( entry->boolValue() == !val );
+
+ // Set to default
+ entry->resetToDefault();
+ assert( entry->boolValue() == false ); // that's the default
+ assert( entry->isDirty() );
+ assert( !entry->isSet() );
+ config->sync( true );
+ config->clear();
+
+ // Check value
+ entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( !entry->isDirty() );
+ assert( !entry->isSet() );
+ cout << "quiet option reset to default: " << ( entry->boolValue() ? "is set" : "is not set" ) << endl;
+ assert( entry->boolValue() == false );
+
+ // Reset old value
+ entry->setBoolValue( val );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ cout << "quiet option reset to initial: " << ( val ? "is set" : "is not set" ) << endl;
+ }
+ else
+ cout << "Entry 'dirmngr/" << s_groupName << "/" << s_entryName << "' not found" << endl;
+ }
+
+ {
+ // Static querying and setting of a single int option
+ static const char* s_groupName = "LDAP";
+ static const char* s_entryName = "ldaptimeout";
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ if ( entry ) {
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_UInt );
+ uint val = entry->uintValue();
+ cout << "LDAP timeout initially: " << val << " seconds." << endl;
+
+ // Test setting the option directly, then querying again
+ //system( "echo 'ldaptimeout:0:101' | gpgconf --change-options dirmngr" );
+ // Now let's do it with the C++ API instead
+ entry->setUIntValue( 101 );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ // Clear cached values!
+ config->clear();
+
+ // Check new value
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( entry );
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_UInt );
+ cout << "LDAP timeout now: " << entry->uintValue() << " seconds." << endl;
+ assert( entry->uintValue() == 101 );
+
+ // Set to default
+ entry->resetToDefault();
+ assert( entry->uintValue() == 100 );
+ assert( entry->isDirty() );
+ assert( !entry->isSet() );
+ config->sync( true );
+ config->clear();
+
+ // Check value
+ entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( !entry->isDirty() );
+ assert( !entry->isSet() );
+ cout << "LDAP timeout reset to default, " << entry->uintValue() << " seconds." << endl;
+ assert( entry->uintValue() == 100 );
+
+ // Reset old value
+ entry->setUIntValue( val );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ cout << "LDAP timeout reset to initial " << val << " seconds." << endl;
+ }
+ else
+ cout << "Entry 'dirmngr/" << s_groupName << "/" << s_entryName << "' not found" << endl;
+ }
+
+ {
+ // Static querying and setting of a single string option
+ static const char* s_groupName = "Debug";
+ static const char* s_entryName = "log-file";
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ if ( entry ) {
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_Path );
+ QString val = entry->stringValue();
+ cout << "Log-file initially: " << val.local8Bit() << endl;
+
+ // Test setting the option, sync'ing, then querying again
+ entry->setStringValue( QString::fromUtf8( "/tmp/test:%e5ä" ) );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ // Let's see how it prints it
+ system( "gpgconf --list-options dirmngr | grep log-file" );
+
+ // Clear cached values!
+ config->clear();
+
+ // Check new value
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( entry );
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_Path );
+ cout << "Log-file now: " << entry->stringValue().local8Bit() << endl;
+ assert( entry->stringValue() == QString::fromUtf8( "/tmp/test:%e5ä" ) ); // (or even with %e5 decoded)
+
+ // Reset old value
+#if 0
+ QString arg( val );
+ if ( !arg.isEmpty() )
+ arg.prepend( '"' );
+ QCString sys;
+ sys.sprintf( "echo 'log-file:%s' | gpgconf --change-options dirmngr", arg.local8Bit().data() );
+ system( sys.data() );
+#endif
+ entry->setStringValue( val );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ cout << "Log-file reset to initial " << val.local8Bit() << endl;
+ }
+ else
+ cout << "Entry 'dirmngr/" << s_groupName << "/" << s_entryName << "' not found" << endl;
+ }
+
+ {
+ // Static querying and setting of the LDAP URL list option
+ static const char* s_groupName = "LDAP";
+ static const char* s_entryName = "LDAP Server";
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ if ( entry ) {
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_LDAPURL );
+ assert( entry->isList() );
+ KURL::List val = entry->urlValueList();
+ cout << "URL list initially: " << val.toStringList().join(", ").local8Bit() << endl;
+
+ // Test setting the option, sync'ing, then querying again
+ KURL::List lst;
+ // We use non-empty paths to workaround a bug in KURL (kdelibs-3.2)
+ lst << KURL( "ldap://a:389/?b" );
+ // Test with query containing a litteral ':' (KURL supports this)
+ // and a ' ' (KURL will escape it, see issue119)
+ lst << KURL( "ldap://foo:389/?a:b c" );
+ lst << KURL( "ldap://server:389/?a%3db,c=DE" ); // the query contains a litteral ','
+ //cout << " trying to set: " << lst.toStringList().join(", ").local8Bit() << endl;
+ assert( lst[0].query() == "?b" );
+ assert( lst[1].query() == "?a:b%20c" ); // see, the space got escaped
+ entry->setURLValueList( lst );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ // Let's see how it prints it
+ system( "gpgconf --list-options dirmngr | grep 'LDAP Server'" );
+
+ // Clear cached values!
+ config->clear();
+
+ // Check new value
+ Kleo::CryptoConfigEntry* entry = config->entry( "dirmngr", s_groupName, s_entryName );
+ assert( entry );
+ assert( entry->argType() == Kleo::CryptoConfigEntry::ArgType_LDAPURL );
+ assert( entry->isList() );
+ // Get raw a:b:c:d:e form
+ QStringList asStringList = entry->stringValueList();
+ assert( asStringList.count() == 3 );
+ cout << "asStringList[0]=" << asStringList[0].local8Bit() << endl;
+ cout << "asStringList[1]=" << asStringList[1].local8Bit() << endl;
+ cout << "asStringList[2]=" << asStringList[2].local8Bit() << endl;
+ assert( asStringList[0] == "a:389:::b" );
+ assert( asStringList[1] == "foo:389:::a%3ab c" ); // the space must be decoded (issue119)
+ assert( asStringList[2] == "server:389:::a=b,c=DE" ); // all decoded
+ // Get KURL form
+ KURL::List newlst = entry->urlValueList();
+ cout << "URL list now: " << newlst.toStringList().join(", ").local8Bit() << endl;
+ assert( newlst.count() == 3 );
+ //cout << "newlst[0]=" << newlst[0].url().local8Bit() << endl;
+ //cout << "lst[0]=" << lst[0].url().local8Bit() << endl;
+ assert( newlst[0] == lst[0] );
+ assert( newlst[1] == lst[1] );
+ assert( newlst[2].url() == "ldap://server:389/?a=b,c=DE" ); // != lst[2] due to the encoded =
+
+ // Reset old value
+ entry->setURLValueList( val );
+ assert( entry->isDirty() );
+ config->sync( true );
+
+ cout << "URL list reset to initial: " << val.toStringList().join(", ").local8Bit() << endl;
+ }
+ else
+ cout << "Entry 'dirmngr/" << s_groupName << "/" << s_entryName << "' not found" << endl;
+ }
+
+ cout << "Done." << endl;
+}