50f42d3eddab4999255e770a4e66ff3f20792448
[platform/upstream/libzypp.git] / tests / zypp / RepoManager_test.cc
1
2 #include <iostream>
3 #include <fstream>
4 #include <list>
5 #include <string>
6
7 #include "zypp/base/Logger.h"
8 #include "zypp/base/Exception.h"
9 #include "zypp/KeyRing.h"
10 #include "zypp/PublicKey.h"
11 #include "zypp/TmpPath.h"
12 #include "zypp/PathInfo.h"
13
14 #include "zypp/RepoManager.h"
15
16 #include <boost/test/unit_test.hpp>
17 #include <boost/test/parameterized_test.hpp>
18 #include <boost/test/unit_test_log.hpp>
19
20 #include "KeyRingTestReceiver.h"
21
22 using boost::unit_test::test_suite;
23 using boost::unit_test::test_case;
24 using namespace boost::unit_test::log;
25
26 using namespace std;
27 using namespace zypp;
28 using namespace zypp::filesystem;
29 using namespace zypp::repo;
30
31 void repomanager_test( const string &dir )
32 {
33   RepoManagerOptions opts;
34   
35   TmpDir tmpCachePath;
36   TmpDir tmpRawCachePath;
37   TmpDir tmpKnownReposPath;
38   
39   BOOST_CHECK_EQUAL( filesystem::copy_dir_content( Pathname(dir) + "/repos.d", tmpKnownReposPath.path() ), 0 );
40   
41   opts.repoCachePath = tmpCachePath.path();
42   opts.repoRawCachePath = tmpRawCachePath.path();
43   opts.knownReposPath = tmpKnownReposPath.path();
44   
45   RepoManager manager(opts);
46   
47   list<RepoInfo> repos = manager.knownRepositories();
48   BOOST_CHECK_EQUAL(repos.size(), (unsigned) 4);
49   
50   // now add a .repo file with 2 repositories in it
51   Url url;
52   url.setPathName((Pathname(dir) + "/proprietary.repo").asString());
53   url.setScheme("file");
54
55   manager.addRepositories(url);
56   
57   // check it was not overwriten the proprietary.repo file
58   BOOST_CHECK( PathInfo(tmpKnownReposPath.path() + "/proprietary.repo_1").isExist() );
59   
60   // now there should be 6 repos
61   repos = manager.knownRepositories();
62   BOOST_CHECK_EQUAL(repos.size(), (unsigned) 6);
63   
64   RepoInfo office_dup;
65   office_dup.setAlias("office");
66   BOOST_CHECK_THROW(manager.addRepository(office_dup), RepoAlreadyExistsException);
67
68   // delete the office repo inside the propietary_1.repo
69   RepoInfo office;
70   office.setAlias("office");
71   manager.removeRepository(office);
72   // now there should be 5 repos
73   repos = manager.knownRepositories();
74   BOOST_CHECK_EQUAL(repos.size(), (unsigned) 5);
75   // the file still contained one repo, so it should still exists
76   BOOST_CHECK( PathInfo(tmpKnownReposPath.path() + "/proprietary.repo_1").isExist() );
77   
78   // now delete the macromedia one
79   RepoInfo macromedia;
80   macromedia.setAlias("macromedia");
81   manager.removeRepository(macromedia);
82   repos = manager.knownRepositories();
83   BOOST_CHECK_EQUAL(repos.size(), (unsigned) 4);
84   // the file should not exist anymore
85   BOOST_CHECK( ! PathInfo(tmpKnownReposPath.path() + "/proprietary.repo_1").isExist() );
86   
87
88   // let test cache creation
89
90   RepoInfo repo;
91   repo.setAlias("foo");
92   Url repourl("dir:" + string(TESTS_SRC_DIR) + "/repo/yum/data/10.2-updates-subset");
93   //Url repourl("dir:/mounts/dist/install/stable-x86/suse");
94   //BOOST_CHECK_MESSAGE(0, repourl.asString());
95   repo.setBaseUrl(repourl);
96
97   KeyRingTestReceiver keyring_callbacks;
98   KeyRingTestSignalReceiver receiver;
99   
100   // disable sgnature checking
101   keyring_callbacks.answerTrustKey(true);
102   keyring_callbacks.answerAcceptVerFailed(true);
103   keyring_callbacks.answerAcceptUnknownKey(true);
104
105   // we have no metadata yet so this should throw
106   BOOST_CHECK_THROW( manager.buildCache(repo),
107                      RepoMetadataException );
108
109   // now refresh the metadata
110   manager.refreshMetadata(repo);
111   
112   BOOST_CHECK_MESSAGE( ! manager.isCached(repo),
113                        "Repo is not yet cached" );
114
115   // it is not cached, this should throw
116   BOOST_CHECK_THROW( manager.loadFromCache(repo),
117                      RepoNotCachedException );
118
119   // now cache should build normally
120   manager.buildCache(repo);
121
122    // the solv file should exists now
123   Pathname base = (opts.repoCachePath + repo.alias());
124   Pathname solvfile = base.extend(".solv");
125   Pathname cookiefile = base.extend(".cookie");
126   BOOST_CHECK_MESSAGE( PathInfo(solvfile).isExist(), "Solv file is created after caching: " + solvfile.asString());
127   BOOST_CHECK_MESSAGE( PathInfo(cookiefile).isExist(), "Cookie file is created after caching: " + cookiefile.asString());
128
129   BOOST_CHECK_MESSAGE( manager.isCached(repo),
130                        "Repo is cached now" );
131
132   MIL << "Repo already in cache, clean cache"<< endl;
133   manager.cleanCache(repo);
134
135   BOOST_CHECK_MESSAGE( !manager.isCached(repo),
136                        "Repo cache was just deleted, should not be cached now" );
137
138   // now cache should build normally
139   manager.buildCache(repo);
140
141   manager.loadFromCache(repo);
142
143   if ( manager.isCached(repo ) )
144   {
145     MIL << "Repo already in cache, clean cache"<< endl;
146     manager.cleanCache(repo);
147   }
148   MIL << "Parsing repository metadata..." << endl;
149   manager.buildCache(repo);
150 }
151
152 test_suite*
153 init_unit_test_suite( int argc, char* argv[] )
154 {
155   string datadir;
156   if (argc < 2)
157   {
158     datadir = TESTS_SRC_DIR;
159     datadir = (Pathname(datadir) + "/zypp/data/RepoManager").asString();
160     cout << "repomanager_test:"
161       " path to directory with test data required as parameter. Using " << datadir  << endl;
162     //return (test_suite *)0;
163   }
164   else
165   {
166     datadir = argv[1];
167   }
168
169   std::string const params[] = { datadir };
170     //set_log_stream( std::cout );
171   test_suite* test= BOOST_TEST_SUITE( "RepoManagerTest" );
172   test->add(BOOST_PARAM_TEST_CASE( &repomanager_test,
173                               (std::string const*)params, params+1));
174   return test;
175 }
176