#ADD_SUBDIRECTORY( media )
ADD_SUBDIRECTORY( zypp )
ADD_SUBDIRECTORY( parser )
-ADD_SUBDIRECTORY( source )
+ADD_SUBDIRECTORY( repository )
ADD_TEST(CacheInitializer ${CMAKE_CURRENT_BINARY_DIR}/CacheInitializer ${CMAKE_CURRENT_SOURCE_DIR}/data )
ADD_TEST(CacheStore ${CMAKE_CURRENT_BINARY_DIR}/CacheStore ${CMAKE_CURRENT_SOURCE_DIR}/data )
-ADD_TEST(CacheQuery ${CMAKE_CURRENT_BINARY_DIR}/CacheQuery ${CMAKE_CURRENT_SOURCE_DIR}/data )
+
+# run this test against a YUM repo
+ADD_TEST(CacheQuery ${CMAKE_CURRENT_BINARY_DIR}/CacheQuery ${CMAKE_SOURCE_DIR}/tests/repository/yum/data/10.2-updates-subset )
#include "zypp/TmpPath.h"
#include "zypp2/cache/CacheStore.h"
-#include "zypp2/cache/CapabilityQuery.h"
#include "zypp/data/ResolvableData.h"
#include "zypp2/cache/ResolvableQuery.h"
-
-#include "SimplePackagesParser.h"
+#include "zypp2/parser/yum/YUMParser.h"
using namespace std;
using namespace zypp;
using namespace zypp::capability;
using namespace zypp::filesystem;
using namespace zypp::cache;
+using namespace zypp::parser::yum;
using namespace boost::unit_test;
bool result(const data::RecordId &id, data::ResObject_Ptr ptr )
void resolvable_query_test(const string &dir)
{
- Pathname nvra_list = Pathname(dir) + "package-set.txt.gz";
-
- MIL << "parsing " << nvra_list << endl;
-
- list<MiniResolvable> res_list;
-
- parse_mini_file( nvra_list, res_list );
-
filesystem::TmpDir tmpdir;
// let the store go out of scope to drop the connection
{
data::RecordId repository_id = store.lookupOrAppendRepository( Url("http://novell.com"), "/");
- zypp::debug::Measure cap_parse_timer("store resolvables");
- for ( list<MiniResolvable>::iterator it = res_list.begin(); it != res_list.end(); it++)
- {
- data::RecordId id = store.appendResolvable( repository_id,
- ResTraits<Package>::kind,
- (*it).nvra,
- (*it).deps );
- }
-
- MIL << "packages writen to store" << endl;
+ YUMParser parser( repository_id, store );
+ parser.parse(dir);
+ store.commit();
}
ResolvableQuery query(tmpdir.path() );
query.query(10, &result);
+
+ MIL << query.queryTranslatedStringAttribute( 10, "ResObject", "summary" ).text() << endl;
}
test_suite*
if (argc < 2)
{
datadir = TESTS_SRC_DIR;
- datadir = (Pathname(datadir) + "/cache/data").asString();
+ datadir = (Pathname(datadir) + "/repository/yum/data/10.2-updates-subset").asString();
cout << "CacheStore_test:"
" path to directory with test data required as parameter. Using " << datadir << endl;
//return (test_suite *)0;
#include "zypp/Url.h"
#include "zypp/PathInfo.h"
-using std::cout;
-using std::endl;
-using std::string;
+using namespace std;
using namespace zypp;
using namespace boost::unit_test;
ADD_EXECUTABLE( Fetcher Fetcher_test.cc )
TARGET_LINK_LIBRARIES( Fetcher zypp boost_unit_test_framework )
+ADD_EXECUTABLE( FileChecker FileChecker_test.cc )
+TARGET_LINK_LIBRARIES( FileChecker zypp boost_unit_test_framework )
+
ADD_TEST(ArchTest ${CMAKE_CURRENT_BINARY_DIR}/Arch)
ADD_TEST(UrlTest ${CMAKE_CURRENT_BINARY_DIR}/Url)
ADD_TEST(Edition ${CMAKE_CURRENT_BINARY_DIR}/Edition)
ADD_TEST(Signature ${CMAKE_CURRENT_BINARY_DIR}/Signature)
ADD_TEST(KeyRingTest ${CMAKE_CURRENT_BINARY_DIR}/KeyRing)
ADD_TEST(MediaSetAccessTest ${CMAKE_CURRENT_BINARY_DIR}/MediaSetAccess ${CMAKE_CURRENT_SOURCE_DIR}/data/mediasetaccess)
+ADD_TEST(FileCheckerTest ${CMAKE_CURRENT_BINARY_DIR}/FileChecker ${CMAKE_CURRENT_SOURCE_DIR}/data/FileChecker)
ADD_TEST(FetcherTest ${CMAKE_CURRENT_BINARY_DIR}/Fetcher)
--- /dev/null
+
+#include <iostream>
+#include <fstream>
+#include <list>
+#include <string>
+
+#include "zypp/base/Logger.h"
+#include "zypp/base/Exception.h"
+#include "zypp/KeyRing.h"
+#include "zypp/PublicKey.h"
+#include "zypp/TmpPath.h"
+
+#include "zypp/FileChecker.h"
+
+#include <boost/test/unit_test.hpp>
+#include <boost/test/parameterized_test.hpp>
+#include <boost/test/unit_test_log.hpp>
+
+#include "KeyRingTestReceiver.h"
+
+using boost::unit_test::test_suite;
+using boost::unit_test::test_case;
+using namespace boost::unit_test::log;
+
+using namespace std;
+using namespace zypp;
+using namespace zypp::filesystem;
+
+void keyring_test( const string &dir )
+{
+ Pathname file( Pathname(dir) + "hello.txt" );
+ Pathname file2( Pathname(dir) + "hello2.txt" );
+ Pathname pubkey( Pathname(dir) + "hello.txt.key" );
+ Pathname signature( Pathname(dir) + "hello.txt.asc" );
+
+ /**
+ * 1st scenario, the signature does
+ * match
+ */
+ {
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
+
+ keyring_callbacks.answerTrustKey(true);
+ SignatureFileChecker sigchecker( signature );
+ sigchecker.addPublicKey(pubkey);
+ sigchecker(file);
+ }
+
+ /**
+ * second scenario, the signature does not
+ * match, an exception has to be thrown
+ */
+ {
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
+
+ keyring_callbacks.answerTrustKey(true);
+ SignatureFileChecker sigchecker( signature );
+ sigchecker.addPublicKey(pubkey);
+
+ BOOST_CHECK_THROW( sigchecker(file2), zypp::Exception );
+
+ }
+
+}
+
+void checksum_test( const string &dir )
+{
+ Pathname file( Pathname(dir) + "hello.txt" );
+ Pathname file2( Pathname(dir) + "hello2.txt" );
+ Pathname pubkey( Pathname(dir) + "hello.txt.key" );
+ Pathname signature( Pathname(dir) + "hello.txt.asc" );
+
+ /**
+ * 1st scenario, checksum matches
+ */
+ {
+ ChecksumFileChecker checker( CheckSum("sha1", "f2105202a0f017ab818b670d04982a89f55f090b") );
+ checker(file);
+ }
+
+ /**
+ * 1st scenario, checksum does not matches
+ */
+ {
+ ChecksumFileChecker checker( CheckSum("sha1", "f2105202a0f017ab818b670d04982a89f55f090b") );
+ BOOST_CHECK_THROW( checker(file2), zypp::FileCheckException );
+ }
+}
+
+test_suite*
+init_unit_test_suite( int argc, char* argv[] )
+{
+ string datadir;
+ if (argc < 2)
+ {
+ datadir = TESTS_SRC_DIR;
+ datadir = (Pathname(datadir) + "/zypp/data/FileChecker").asString();
+ cout << "filechecker_test:"
+ " path to directory with test data required as parameter. Using " << datadir << endl;
+ //return (test_suite *)0;
+ }
+ else
+ {
+ datadir = argv[1];
+ }
+
+ std::string const params[] = { datadir };
+ //set_log_stream( std::cout );
+ test_suite* test= BOOST_TEST_SUITE( "FileCheckerTest" );
+ test->add(BOOST_PARAM_TEST_CASE( &keyring_test,
+ (std::string const*)params, params+1));
+ test->add(BOOST_PARAM_TEST_CASE( &checksum_test,
+ (std::string const*)params, params+1));
+ return test;
+}
+
#include <boost/test/parameterized_test.hpp>
#include <boost/test/unit_test_log.hpp>
+#include "KeyRingTestReceiver.h"
+
using boost::unit_test::test_suite;
using boost::unit_test::test_case;
using namespace boost::unit_test::log;
using namespace zypp;
using namespace zypp::filesystem;
-/**
- * Keyring Callback Receiver with some features
- * Allows to simulate and configure user answer
- * Can record which callbacks were called
- */
-struct KeyRingReceive : public zypp::callback::ReceiveReport<zypp::KeyRingReport>
-{
- KeyRingReceive()
- {
- reset();
- connect();
- }
-
- void reset()
- {
- _answer_accept_unknown_key = false;
- _answer_trust_key = false;
- _answer_import_key = false;
- _answer_ver_failed = false;
- _answer_accept_unsigned_file = false;
- _asked_user_to_accept_unknown_key = false;
- _asked_user_to_trust_key = false;
- _asked_user_to_import_key = false;
- _asked_user_to_accept_ver_failed = false;
- _asked_user_to_accept_unsigned_file = false;
- }
-
- ~KeyRingReceive()
- {
- disconnect();
- }
-
- void answerAcceptVerFailed( bool answer )
- { _answer_ver_failed = answer; }
-
- bool askedAcceptVerFailed() const
- { return _asked_user_to_accept_ver_failed; }
-
- void answerAcceptUnknownKey( bool answer )
- { _answer_accept_unknown_key = answer; }
-
- bool askedAcceptUnknownKey() const
- { return _asked_user_to_accept_unknown_key; }
-
- void answerTrustKey( bool answer )
- { _answer_trust_key = answer; }
-
- bool askedTrustKey() const
- { return _asked_user_to_trust_key; }
-
- void answerImportKey( bool answer )
- { _answer_import_key = answer; }
-
- bool askedImportKey() const
- { return _asked_user_to_import_key; }
-
- void answerAcceptUnsignedFile( bool answer )
- { _answer_accept_unsigned_file = answer; }
-
- bool askedAcceptUnsignedFile() const
- { return _asked_user_to_accept_unsigned_file; }
-
- virtual bool askUserToAcceptUnsignedFile( const std::string &file )
- {
- MIL << std::endl;
- _asked_user_to_accept_unsigned_file = true;
- return _answer_accept_unsigned_file;
- }
-
- virtual bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id )
- {
- MIL << std::endl;
- _asked_user_to_accept_unknown_key = true;
- return _answer_accept_unknown_key;
- }
-
- virtual bool askUserToImportKey( const PublicKey &key )
- {
- MIL << std::endl;
- _asked_user_to_import_key = true;
- return _answer_import_key;
- }
-
- virtual bool askUserToTrustKey( const PublicKey &key )
- {
- MIL << std::endl;
- _asked_user_to_trust_key = true;
- return _answer_trust_key;
- }
- virtual bool askUserToAcceptVerificationFailed( const std::string &file, const PublicKey &key )
- {
- MIL << std::endl;
- _asked_user_to_accept_ver_failed = true;
- return _answer_ver_failed;
- }
-
- // how to answer
- bool _answer_accept_unknown_key;
- bool _answer_trust_key;
- bool _answer_import_key;
- bool _answer_ver_failed;
- bool _answer_accept_unsigned_file;
-
- // we use this variables to check that the
- // callbacks were called
- bool _asked_user_to_accept_unknown_key;
- bool _asked_user_to_trust_key;
- bool _asked_user_to_import_key;
- bool _asked_user_to_accept_ver_failed;
- bool _asked_user_to_accept_unsigned_file;
-};
-
-/**
- * Keyring Signal Receiver with some features
- * Allows to simulate and configure user answer
- * Can record which callbacks were called
- */
-struct KeyRingSignalReceiver : callback::ReceiveReport<KeyRingSignals>
-{
- KeyRingSignalReceiver(/*RpmDb &rpmdb*/)
- : _trusted_key_added_called(false)
- {
- MIL << "KeyRing signals enabled" << endl;
- connect();
- }
-
- ~KeyRingSignalReceiver()
- {
- disconnect();
- }
-
- virtual void trustedKeyAdded( const PublicKey &key )
- {
- MIL << "TEST: trusted key added to zypp Keyring. Syncronizing keys with fake rpm keyring" << std::endl;
- _trusted_key_added_called = true;
- //std::cout << "trusted key added to zypp Keyring. Syncronizing keys with rpm keyring" << std::endl;
- //_rpmdb.importZyppKeyRingTrustedKeys();
- //_rpmdb.exportTrustedKeysInZyppKeyRing();
- }
-
- virtual void trustedKeyRemoved( const PublicKey &key )
- {
- }
-
- bool _trusted_key_added_called;
-
-};
-
void keyring_test( const string &dir )
{
PublicKey key( Pathname(dir) + "public.asc" );
* ask for import, answer no
*/
{
- KeyRingReceive keyring_callbacks;
- KeyRingSignalReceiver receiver;
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
// base sandbox for playing
TmpDir tmp_dir;
KeyRing keyring( tmp_dir.path() );
* vorrupt the file and check
*/
{
- KeyRingReceive keyring_callbacks;
- KeyRingSignalReceiver receiver;
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
// base sandbox for playing
TmpDir tmp_dir;
KeyRing keyring( tmp_dir.path() );
* check without signature
*/
{
- KeyRingReceive keyring_callbacks;
- KeyRingSignalReceiver receiver;
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
// base sandbox for playing
TmpDir tmp_dir;
KeyRing keyring( tmp_dir.path() );
* answer no
*/
{
- KeyRingReceive keyring_callbacks;
- KeyRingSignalReceiver receiver;
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
// base sandbox for playing
TmpDir tmp_dir;
KeyRing keyring( tmp_dir.path() );
* should emit signal
*/
{
- KeyRingReceive keyring_callbacks;
- KeyRingSignalReceiver receiver;
+ KeyRingTestReceiver keyring_callbacks;
+ KeyRingTestSignalReceiver receiver;
// base sandbox for playing
TmpDir tmp_dir;
KeyRing keyring( tmp_dir.path() );
--- /dev/null
+
+#ifndef _ZYPP_KEYRING_TEST_RECEIVER_H
+#define _ZYPP_KEYRING_TEST_RECEIVER_H
+
+#include "zypp/Callback.h"
+#include "zypp/KeyRing.h"
+#include "zypp/PublicKey.h"
+
+/**
+ * Keyring Callback Receiver with some features
+ * Allows to simulate and configure user answer
+ * Can record which callbacks were called
+ */
+struct KeyRingTestReceiver : public zypp::callback::ReceiveReport<zypp::KeyRingReport>
+{
+ KeyRingTestReceiver()
+ {
+ reset();
+ connect();
+ }
+
+ void reset()
+ {
+ _answer_accept_unknown_key = false;
+ _answer_trust_key = false;
+ _answer_import_key = false;
+ _answer_ver_failed = false;
+ _answer_accept_unsigned_file = false;
+ _asked_user_to_accept_unknown_key = false;
+ _asked_user_to_trust_key = false;
+ _asked_user_to_import_key = false;
+ _asked_user_to_accept_ver_failed = false;
+ _asked_user_to_accept_unsigned_file = false;
+ }
+
+ ~KeyRingTestReceiver()
+ {
+ disconnect();
+ }
+
+ void answerAcceptVerFailed( bool answer )
+ { _answer_ver_failed = answer; }
+
+ bool askedAcceptVerFailed() const
+ { return _asked_user_to_accept_ver_failed; }
+
+ void answerAcceptUnknownKey( bool answer )
+ { _answer_accept_unknown_key = answer; }
+
+ bool askedAcceptUnknownKey() const
+ { return _asked_user_to_accept_unknown_key; }
+
+ void answerTrustKey( bool answer )
+ { _answer_trust_key = answer; }
+
+ bool askedTrustKey() const
+ { return _asked_user_to_trust_key; }
+
+ void answerImportKey( bool answer )
+ { _answer_import_key = answer; }
+
+ bool askedImportKey() const
+ { return _asked_user_to_import_key; }
+
+ void answerAcceptUnsignedFile( bool answer )
+ { _answer_accept_unsigned_file = answer; }
+
+ bool askedAcceptUnsignedFile() const
+ { return _asked_user_to_accept_unsigned_file; }
+
+ virtual bool askUserToAcceptUnsignedFile( const std::string &file )
+ {
+ MIL << std::endl;
+ _asked_user_to_accept_unsigned_file = true;
+ return _answer_accept_unsigned_file;
+ }
+
+ virtual bool askUserToAcceptUnknownKey( const std::string &file, const std::string &id )
+ {
+ MIL << std::endl;
+ _asked_user_to_accept_unknown_key = true;
+ return _answer_accept_unknown_key;
+ }
+
+ virtual bool askUserToImportKey( const zypp::PublicKey &key )
+ {
+ MIL << std::endl;
+ _asked_user_to_import_key = true;
+ return _answer_import_key;
+ }
+
+ virtual bool askUserToTrustKey( const zypp::PublicKey &key )
+ {
+ MIL << std::endl;
+ _asked_user_to_trust_key = true;
+ return _answer_trust_key;
+ }
+ virtual bool askUserToAcceptVerificationFailed( const std::string &file, const zypp::PublicKey &key )
+ {
+ MIL << std::endl;
+ _asked_user_to_accept_ver_failed = true;
+ return _answer_ver_failed;
+ }
+
+ // how to answer
+ bool _answer_accept_unknown_key;
+ bool _answer_trust_key;
+ bool _answer_import_key;
+ bool _answer_ver_failed;
+ bool _answer_accept_unsigned_file;
+
+ // we use this variables to check that the
+ // callbacks were called
+ bool _asked_user_to_accept_unknown_key;
+ bool _asked_user_to_trust_key;
+ bool _asked_user_to_import_key;
+ bool _asked_user_to_accept_ver_failed;
+ bool _asked_user_to_accept_unsigned_file;
+};
+
+/**
+ * Keyring Signal Receiver with some features
+ * Allows to simulate and configure user answer
+ * Can record which callbacks were called
+ */
+struct KeyRingTestSignalReceiver : zypp::callback::ReceiveReport<zypp::KeyRingSignals>
+{
+ KeyRingTestSignalReceiver(/*RpmDb &rpmdb*/)
+ : _trusted_key_added_called(false)
+ {
+ MIL << "KeyRing signals enabled" << std::endl;
+ connect();
+ }
+
+ ~KeyRingTestSignalReceiver()
+ {
+ disconnect();
+ }
+
+ virtual void trustedKeyAdded( const zypp::PublicKey &key )
+ {
+ MIL << "TEST: trusted key added to zypp Keyring. Syncronizing keys with fake rpm keyring" << std::endl;
+ _trusted_key_added_called = true;
+ //std::cout << "trusted key added to zypp Keyring. Syncronizing keys with rpm keyring" << std::endl;
+ //_rpmdb.importZyppKeyRingTrustedKeys();
+ //_rpmdb.exportTrustedKeysInZyppKeyRing();
+ }
+
+ virtual void trustedKeyRemoved( const zypp::PublicKey &key )
+ {
+ }
+
+ bool _trusted_key_added_called;
+
+};
+
+#endif
--- /dev/null
+hello this is a test
--- /dev/null
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+iD8DBQBGXW7Gm+zCtd2wN1YRAuAXAJ9e2obl0RWM9eBQz8dmPdQjclmamQCfRnJS
+XFIPNZAA1XeQL/Dvi51EIwc=
+=3TuF
+-----END PGP SIGNATURE-----
--- /dev/null
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.6 (GNU/Linux)
+
+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
+yqfsg94RICpbr50=
+=NAat
+-----END PGP PUBLIC KEY BLOCK-----
--- /dev/null
+this is another text
+