9
from gi.repository import GObject
11
10
from piston_mini_client import PistonResponseObject
12
11
from mock import Mock, patch
14
from testutils import setup_test_env
13
from tests.utils import (
18
make_software_center_agent_subscription_dict,
19
make_software_center_agent_app_dict,
17
24
import softwarecenter.paths
25
import softwarecenter.distro
18
27
from softwarecenter.db.application import Application, AppDetails
19
28
from softwarecenter.db.database import StoreDatabase
20
29
from softwarecenter.db.enquire import AppEnquire
21
30
from softwarecenter.db.database import parse_axi_values_file
22
from softwarecenter.db.pkginfo import get_pkg_info
31
from softwarecenter.db.pkginfo import get_pkg_info, _Version
23
32
from softwarecenter.db.update import (
24
33
make_doc_from_parser,
25
34
update_from_app_install_data,
26
35
update_from_var_lib_apt_lists,
27
36
update_from_appstream_xml,
37
update_from_json_string,
28
38
update_from_software_center_agent,
29
39
SCAPurchasedApplicationParser,
30
40
SCAApplicationParser,
32
from softwarecenter.distro import get_distro
42
from softwarecenter.db.utils import (
43
get_installed_package_list,
44
get_installed_apps_list,
33
46
from softwarecenter.enums import (
37
from softwarecenter.testutils import (
41
make_software_center_agent_subscription_dict,
42
make_software_center_agent_app_dict,
44
from softwarecenter.region import REGIONTAG
50
from softwarecenter.region import REGION_BLACKLIST_TAG, REGIONTAG
52
PKD_DIR = os.path.join(DATA_DIR, 'appdetails', 'var', 'lib', 'dpkg', 'status')
53
TEST_DB = os.path.join(DATA_DIR, "test.db")
46
56
class TestDatabase(unittest.TestCase):
47
57
""" tests the store database """
50
apt.apt_pkg.config.set("Dir::State::status",
51
"./data/appdetails/var/lib/dpkg/status")
60
apt.apt_pkg.config.set("Dir::State::status", PKD_DIR)
52
61
self.cache = get_pkg_info()
72
81
def test_update_from_desktop_file(self):
73
82
# ensure we index with german locales to test i18n
74
83
os.environ["LANGUAGE"] = "de"
75
db = xapian.WritableDatabase("./data/test.db",
84
db = xapian.WritableDatabase(TEST_DB,
76
85
xapian.DB_CREATE_OR_OVERWRITE)
77
res = update_from_app_install_data(db, self.cache, datadir="./data/desktop")
86
res = update_from_app_install_data(db, self.cache,
87
datadir=os.path.join(DATA_DIR, "desktop"))
78
88
self.assertTrue(res)
79
89
self.assertEqual(db.get_doccount(), 5)
80
90
# test if Name[de] was picked up
84
94
self.assertEqual(i, 1)
86
96
def test_update_from_appstream_xml(self):
87
db = xapian.WritableDatabase("./data/test.db",
97
db = xapian.WritableDatabase(TEST_DB,
88
98
xapian.DB_CREATE_OR_OVERWRITE)
89
res = update_from_appstream_xml(db, self.cache, "./data/app-info/")
99
res = update_from_appstream_xml(db, self.cache,
100
os.path.join(DATA_DIR, "app-info"))
90
101
self.assertTrue(res)
91
102
self.assertEqual(db.get_doccount(), 1)
92
103
# FIXME: improve tests
93
104
for p in db.postlist(""):
94
105
doc = db.get_document(p.docid)
95
106
for term in doc.termlist():
107
self.assertIsInstance(term, xapian.TermListItem)
108
self.assertIsInstance(term.term, basestring)
97
109
for value in doc.values():
98
print value, value.num, value.value
110
self.assertIsInstance(value, xapian.ValueItem)
111
self.assertIsInstance(value.num, long)
112
self.assertIsInstance(value.value, basestring)
100
114
def test_update_from_var_lib_apt_lists(self):
101
115
# ensure we index with german locales to test i18n
102
116
os.environ["LANGUAGE"] = "de"
103
db = xapian.WritableDatabase("./data/test.db",
117
db = xapian.WritableDatabase(TEST_DB,
104
118
xapian.DB_CREATE_OR_OVERWRITE)
105
res = update_from_var_lib_apt_lists(db, self.cache, listsdir="./data/app-info/")
119
res = update_from_var_lib_apt_lists(db, self.cache,
120
listsdir=os.path.join(DATA_DIR, "app-info"))
106
121
self.assertTrue(res)
107
122
self.assertEqual(db.get_doccount(), 1)
108
123
# test if Name-de was picked up
123
138
self.assertTrue(found_gettext_translation)
125
140
def test_update_from_json_string(self):
126
from softwarecenter.db.update import update_from_json_string
127
db = xapian.WritableDatabase("./data/test.db",
141
db = xapian.WritableDatabase(TEST_DB,
128
142
xapian.DB_CREATE_OR_OVERWRITE)
129
143
cache = apt.Cache()
130
p = os.path.abspath("./data/app-info-json/apps.json")
144
p = os.path.join(DATA_DIR, "app-info-json", "apps.json")
131
145
res = update_from_json_string(db, cache, open(p).read(), origin=p)
132
146
self.assertTrue(res)
133
147
self.assertEqual(db.get_doccount(), 1)
135
149
def test_build_from_software_center_agent(self):
136
db = xapian.WritableDatabase("./data/test.db",
150
db = xapian.WritableDatabase(TEST_DB,
137
151
xapian.DB_CREATE_OR_OVERWRITE)
138
152
cache = apt.Cache()
139
153
# monkey patch distro to ensure we get data
140
import softwarecenter.distro
141
154
distro = softwarecenter.distro.get_distro()
142
155
distro.get_codename = lambda: "natty"
143
156
# we test against the real https://software-center.ubuntu.com here
166
179
# staging does not have a valid cert
167
180
os.environ["PISTON_MINI_CLIENT_DISABLE_SSL_VALIDATION"] = "1"
168
181
cache = get_test_pkg_info()
169
db = xapian.WritableDatabase("./data/test.db",
182
db = xapian.WritableDatabase(TEST_DB,
170
183
xapian.DB_CREATE_OR_OVERWRITE)
171
184
res = update_from_software_center_agent(db, cache, ignore_cache=True)
172
185
self.assertTrue(res)
184
197
self.assertRaises(ValueError, AppDetails, db)
186
199
def test_application_details(self):
187
db = xapian.WritableDatabase("./data/test.db",
200
db = xapian.WritableDatabase(TEST_DB,
188
201
xapian.DB_CREATE_OR_OVERWRITE)
189
res = update_from_app_install_data(db, self.cache, datadir="./data/desktop")
202
res = update_from_app_install_data(db, self.cache,
203
datadir=os.path.join(DATA_DIR, "desktop"))
190
204
self.assertTrue(res)
191
db = StoreDatabase("./data/test.db", self.cache)
205
db = StoreDatabase(TEST_DB, self.cache)
192
206
db.open(use_axi=False, use_agent=False)
193
207
self.assertEqual(len(db), 5)
243
257
self.assertEqual(app.pkgname, 'linux-headers-'+os.uname()[2])
245
259
details = app.get_details(db)
246
distro = get_distro().get_codename()
260
distro = softwarecenter.distro.get_distro().get_codename()
247
261
self.assertEqual(app.request, 'channel=' + distro + '-partner')
249
263
def ensure_installation_date_and_lazy_history_loading(self, appdetails):
250
264
# we run two tests, the first is to ensure that we get a
251
265
# result from installation_data immediately (at this point the
262
275
self.assertNotEqual(appdetails.installation_date, None)
264
277
def test_package_states(self):
265
db = xapian.WritableDatabase("./data/test.db",
278
db = xapian.WritableDatabase(TEST_DB,
266
279
xapian.DB_CREATE_OR_OVERWRITE)
267
res = update_from_app_install_data(db, self.cache, datadir="./data/desktop")
280
res = update_from_app_install_data(db, self.cache,
281
datadir=os.path.join(DATA_DIR, "desktop"))
268
282
self.assertTrue(res)
269
db = StoreDatabase("./data/test.db", self.cache)
283
db = StoreDatabase(TEST_DB, self.cache)
270
284
db.open(use_axi=False)
271
285
# test PkgStates.INSTALLED
272
286
# FIXME: this will only work if software-center is installed
323
337
last_time = doc.get_value(value_time)
325
339
def test_for_purchase_apps_date_published(self):
326
from softwarecenter.testutils import get_test_pkg_info
327
340
#os.environ["SOFTWARE_CENTER_DEBUG_HTTP"] = "1"
328
341
#os.environ["SOFTWARE_CENTER_AGENT_HOST"] = "http://sc.staging.ubuntu.com/"
329
342
# staging does not have a valid cert
330
343
os.environ["PISTON_MINI_CLIENT_DISABLE_SSL_VALIDATION"] = "1"
331
344
cache = get_test_pkg_info()
332
db = xapian.WritableDatabase("./data/test.db",
345
db = xapian.WritableDatabase(TEST_DB,
333
346
xapian.DB_CREATE_OR_OVERWRITE)
334
347
res = update_from_software_center_agent(db, cache, ignore_cache=True)
335
348
self.assertTrue(res)
414
427
#db = StoreDatabase("/var/cache/software-center/xapian", self.cache)
415
428
axi_values = parse_axi_values_file(fname)
416
429
self.assertNotEqual(axi_values, {})
419
432
def test_appdetails(self):
420
from softwarecenter.testutils import get_test_db
421
433
db = get_test_db()
422
434
# see "apt-cache show casper|grep ^Tag"
423
435
details = AppDetails(db, application=Application("", "casper"))
443
455
class UtilsTestCase(unittest.TestCase):
445
457
def test_utils_get_installed_package_list(self):
446
from softwarecenter.db.utils import get_installed_package_list
447
458
installed_pkgs = get_installed_package_list()
448
459
self.assertTrue(len(installed_pkgs) > 0)
450
461
def test_utils_get_installed_apps_list(self):
451
from softwarecenter.db.utils import (
452
get_installed_package_list,get_installed_apps_list)
453
462
db = get_test_db()
455
464
installed_pkgs = get_installed_package_list()
508
517
app_details = self._get_app_details_from_app_dict(app_dict)
509
518
# ensure that archive.canonical.com archive roots are detected
510
519
# as the partner channel
511
dist = get_distro().get_codename()
520
dist = softwarecenter.distro.get_distro().get_codename()
512
521
self.assertEqual(app_details.channelname, "%s-partner" % dist)
514
523
@patch('os.path.exists')
515
524
def test_channel_detection_extras(self, mock):
516
525
# we need to patch os.path.exists as "AppDetails.channelname" will
541
550
@patch("softwarecenter.db.update.get_region_cached")
542
551
def test_region_blacklist(self, get_region_cached_mock):
543
from softwarecenter.region import REGION_BLACKLIST_TAG
544
552
get_region_cached_mock.return_value = { "countrycode" : "es",
546
554
app_dict = make_software_center_agent_app_dict()
547
app_dict["debtags"] = ["%s%s" % (REGION_BLACKLIST_TAG, "es"),
555
app_dict["debtags"] = ["%s%s" % (REGION_BLACKLIST_TAG, "es")]
549
556
# see _get_app_details_from_app_dict
550
557
item = PistonResponseObject.from_dict(app_dict)
551
558
parser = SCAApplicationParser(item)
552
559
doc = make_doc_from_parser(parser, self.db._aptcache)
553
560
self.assertEqual(doc, None)
556
563
class AppDetailsPkgStateTestCase(unittest.TestCase):
619
626
PkgStates.PURCHASED_BUT_REPO_MUST_BE_ENABLED,
622
630
class MultipleVersionsSupportTestCase(unittest.TestCase):
624
632
def _make_version(self, not_automatic):
625
from softwarecenter.db.pkginfo import _Version
626
633
ver = Mock(_Version)
627
634
ver.description ="not_automatic: %s" % not_automatic
628
635
ver.summary ="summary not_automatic: %s" % not_automatic
640
647
db = get_test_db()
641
648
app = Application("", "software-center")
642
649
details = app.get_details(db)
644
651
self._make_version(not_automatic=True),
645
652
self._make_version(not_automatic=False) ]
646
653
details._pkg.versions = versions
647
654
details._pkg.candidate = versions[1]
648
655
self.assertEqual(
649
details.get_not_automatic_archive_versions(),
656
details.get_not_automatic_archive_versions(),
650
657
[ (versions[1].version, "precise"),
651
658
(versions[0].version, "precise-backports") ])
691
698
details.force_not_automatic_archive_suite("")
692
699
self.assertEqual(app.archive_suite, "")
694
702
class TrackDBTestCase(unittest.TestCase):
696
704
def test_track_db_open(self):
697
705
tmpdir = tempfile.mkdtemp()
698
706
tmpstamp = os.path.join(tmpdir, "update-stamp")