Imported Upstream version 17.22.1
[platform/upstream/libzypp.git] / tests / zypp / Fetcher_test.cc
index dc10a34..ca18c96 100644 (file)
-#include <stdio.h>
-#include <iostream>
-#include <boost/test/unit_test.hpp>
-#include <boost/test/parameterized_test.hpp>
-#include <boost/test/unit_test_log.hpp>
+#include "TestSetup.h"
 
 #include "zypp/MediaSetAccess.h"
 #include "zypp/Fetcher.h"
-#include "zypp/Url.h"
 
-using std::cout;
-using std::endl;
-using std::string;
-using namespace zypp;
-using namespace zypp::media;
-using namespace boost::unit_test;
+#include "WebServer.h"
 
-void fetcher_simple_test()
+#define BOOST_TEST_MODULE fetcher_test
+
+#define DATADIR (Pathname(TESTS_SRC_DIR) + "/zypp/data/Fetcher/remote-site")
+
+BOOST_AUTO_TEST_SUITE( fetcher_test );
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_noindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // Now test that without trusting it, it should throw
+  // do the test by trusting the SHA1SUMS file signature key
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      fetcher.enqueueDir(OnMediaLocation("/complexdir"), true);
+      fetcher.start( dest.path(), media );
+      fetcher.reset();
+
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
+  }
+}
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_autoindex_untrustedkey)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key
+  {
+      filesystem::TmpDir dest;
+
+      // add the key as untrusted, which is the same as not adding it and
+      // let autodiscovery to add it
+
+      Fetcher fetcher;
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDir(OnMediaLocation("/complexdir"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
+
+      fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueuedir_autoindex)
 {
-  //TESTS_SRC_DIR
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key
+  {
+      filesystem::TmpDir dest;
+
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir/subdir1/SHA1SUMS.key"), true);
+      Fetcher fetcher;
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDir(OnMediaLocation("/complexdir"), true);
+      fetcher.start( dest.path(), media );
+
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
+
+      fetcher.reset();
+  }
 }
 
-test_suite*
-init_unit_test_suite( int argc, char *argv[] )
+BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_dir_autoindex)
 {
-//   if (argc < 2)
-//   {
-//     cout << "mediasetaccesstest:"
-//       " path to directory with test data required as parameter" << endl;
-//     return (test_suite *)0;
-//   }
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDigestedDir(OnMediaLocation("/complexdir-broken"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException);
+      fetcher.reset();
+  }
+}
 
-  test_suite* test= BOOST_TEST_SUITE("Fetcher_test");
+BOOST_AUTO_TEST_CASE(fetcher_enqueuebrokendir_noindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true);
+      // this should not throw as we provided no indexes and the
+      // enqueue is not digested
+      fetcher.start( dest.path(), media );
+      fetcher.reset();
 
-  // simple test
-  test->add(BOOST_TEST_CASE(&fetcher_simple_test));
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file2.txt").isExist() );
 
-  return test;
+  }
 }
 
+BOOST_AUTO_TEST_CASE(fetcher_enqueuebrokendir_index)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+      fetcher.reset();
+  }
+}
+
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueue_digesteddir_brokendir_with_index)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDigestedDir(OnMediaLocation("/complexdir-broken"), true);
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+      fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_broken_with_autoindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key but with a broken file
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir-broken/subdir1/SHA1SUMS.key"), true);
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDigested(OnMediaLocation("/complexdir-broken/subdir1/subdir1-file2.txt"));
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+      fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueue_digested_with_autoindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  // do the test by trusting the SHA1SUMS file signature key with a good file
+  // checksum in auto discovered index
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      // add the key as trusted
+      getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/complexdir/subdir1/SHA1SUMS.key"), true);
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDigested(OnMediaLocation("/complexdir/subdir1/subdir1-file1.txt"));
+      fetcher.start( dest.path(), media );
+      fetcher.reset();
+  }
+}
+
+
+BOOST_AUTO_TEST_CASE(fetcher_enqueuefile_noindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  {
+      filesystem::TmpDir dest;
+      Fetcher fetcher;
+      fetcher.enqueue(OnMediaLocation("/file-1.txt"));
+      fetcher.start( dest.path(), media );
+      BOOST_CHECK( PathInfo(dest.path() + "/file-1.txt").isExist() );
+  }
+
+  //MIL << fetcher;
+}
+
+BOOST_AUTO_TEST_CASE(fetcher_simple)
+{
+    MediaSetAccess media( (DATADIR).asUrl(), "/" );
+    Fetcher fetcher;
+
+    {
+        filesystem::TmpDir dest;
+        OnMediaLocation loc("/complexdir/subdir1/subdir1-file1.txt");
+        loc.setChecksum(CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec15"));
+        fetcher.enqueueDigested(loc);
+        fetcher.start(dest.path(), media);
+        fetcher.reset();
+        // now we break the checksum and it should fail
+        loc.setChecksum(CheckSum::sha1("f1d2d2f924e986ac86fdf7b36c94bcdf32beec16"));
+        fetcher.enqueueDigested(loc);
+        BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+        fetcher.reset();
+
+    }
+}
+
+BOOST_AUTO_TEST_CASE(content_index)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  Fetcher fetcher;
+
+  // test transfering one file by setting the index
+  {
+        filesystem::TmpDir dest;
+        OnMediaLocation loc("/contentindex/subdir1/subdir1-file1.txt");
+        // trust the key manually
+        getZYpp()->keyRing()->importKey(PublicKey(DATADIR + "/contentindex/content.key"), true);
+        fetcher.addIndex(OnMediaLocation("/contentindex/content", 1));
+        fetcher.enqueue(loc);
+        fetcher.start(dest.path(), media);
+        fetcher.reset();
+        BOOST_CHECK( PathInfo(dest.path() + "/contentindex/subdir1/subdir1-file1.txt").isExist() );
+  }
+
+}
+
+BOOST_AUTO_TEST_CASE(enqueue_broken_content_index)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  Fetcher fetcher;
+  filesystem::TmpDir dest;
+  {
+        OnMediaLocation loc("/contentindex-broken-digest/subdir1/subdir1-file1.txt",1);
+        // key was already imported as trusted
+        fetcher.addIndex(OnMediaLocation("/contentindex-broken-digest/content", 1));
+        fetcher.enqueue(loc);
+        fetcher.start(dest.path(), media);
+        fetcher.reset();
+        BOOST_CHECK( PathInfo(dest.path() + "/contentindex-broken-digest/subdir1/subdir1-file1.txt").isExist() );
+
+        // now retrieve a file that is modified, so the checksum has to fail
+        loc = OnMediaLocation("/contentindex-broken-digest/subdir1/subdir1-file2.txt",1);
+        fetcher.addIndex(OnMediaLocation("/contentindex-broken-digest/content", 1));
+        fetcher.enqueue(loc);
+        BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), Exception);
+        fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(enqueue_digested_images_file_content_autoindex)
+{
+  MediaSetAccess media( ( DATADIR + "/images-file").asUrl(), "/" );
+  Fetcher fetcher;
+  filesystem::TmpDir dest;
+  {
+        OnMediaLocation loc("/images/images.xml",1);
+        fetcher.setOptions( Fetcher::AutoAddIndexes );
+        fetcher.enqueueDigested(loc);
+        fetcher.start(dest.path(), media);
+        fetcher.reset();
+        BOOST_CHECK( PathInfo(dest.path() + "/images/images.xml").isExist() );
+        fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(enqueue_digested_images_file_content_autoindex_unsigned)
+{
+  MediaSetAccess media( ( DATADIR + "/images-file-unsigned").asUrl(), "/" );
+  Fetcher fetcher;
+  filesystem::TmpDir dest;
+  {
+        OnMediaLocation loc("/images/images.xml",1);
+        fetcher.setOptions( Fetcher::AutoAddIndexes );
+        fetcher.enqueueDigested(loc);
+        // it should throw because unsigned file throws
+        BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException);
+        fetcher.reset();
+        // the target file was NOT transferred
+        BOOST_CHECK( ! PathInfo(dest.path() + "/images/images.xml").isExist() );
+        fetcher.reset();
+  }
+}
+
+BOOST_AUTO_TEST_CASE(enqueue_broken_content_noindex)
+{
+  MediaSetAccess media( ( DATADIR).asUrl(), "/" );
+  Fetcher fetcher;
+
+  {
+        filesystem::TmpDir dest;
+        OnMediaLocation loc("/contentindex-broken-digest/subdir1/subdir1-file1.txt",1);
+        // key was already imported as trusted
+        fetcher.enqueue(loc);
+        fetcher.start(dest.path(), media);
+        fetcher.reset();
+        // now retrieve a file that is modified, so the checksum has to fail
+        loc = OnMediaLocation("/contentindex-broken-digest/subdir1/subdir1-file2.txt",1);
+        fetcher.enqueue(loc);
+        fetcher.start( dest.path(), media );
+        fetcher.reset();
+        BOOST_CHECK( PathInfo(dest.path() + "/contentindex-broken-digest/subdir1/subdir1-file2.txt").isExist() );
+
+  }
+}
+
+
+BOOST_AUTO_TEST_CASE(enqueuedir_http)
+{
+    WebServer web((Pathname(TESTS_SRC_DIR) + "/zypp/data/Fetcher/remote-site").c_str(), 10001);
+    BOOST_REQUIRE( web.start() );
+
+  // at this point the key is already trusted
+  {
+      MediaSetAccess media( web.url(), "/" );
+      Fetcher fetcher;
+      filesystem::TmpDir dest;
+
+      // auto add the SHA1SUMS
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDir(OnMediaLocation("/complexdir"), true);
+      fetcher.start( dest.path(), media );
+
+      fetcher.reset();
+
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir2/subdir2-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file1.txt").isExist() );
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir/subdir1/subdir1-file2.txt").isExist() );
+  }
+
+  // test broken tree
+  {
+      MediaSetAccess media( web.url(), "/" );
+      Fetcher fetcher;
+      filesystem::TmpDir dest;
+
+      // auto add the SHA1SUMS
+      fetcher.setOptions( Fetcher::AutoAddIndexes );
+      fetcher.enqueueDir(OnMediaLocation("/complexdir-broken"), true);
+      // should throw because wrong checksum
+      BOOST_CHECK_THROW( fetcher.start( dest.path(), media ), FileCheckException);
+      fetcher.reset();
+
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir2").isExist() );
+
+      // unprocessed after failure:
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir-broken/subdir2/subdir2-file1.txt").isExist() );
+
+      // this one got transferred before the failure, so it is there
+      BOOST_CHECK( PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file1.txt").isExist() );
+      // broken:
+      BOOST_CHECK( ! PathInfo(dest.path() + "/complexdir-broken/subdir1/subdir1-file2.txt").isExist() );
+
+      fetcher.reset();
+  }
+  
+  web.stop();
+}
+
+BOOST_AUTO_TEST_SUITE_END();
+
 // vim: set ts=2 sts=2 sw=2 ai et: