7
from pysqlite2 import dbapi2 as sqlite3
5
9
from landscape.tests.helpers import LandscapeTest
7
from landscape.package.store import PackageStore, UnknownHashIDRequest
10
class PackageStoreTest(LandscapeTest):
11
from landscape.package.store import (HashIdStore, PackageStore,
12
UnknownHashIDRequest, InvalidHashIdDb)
15
class HashIdStoreTest(LandscapeTest):
13
super(PackageStoreTest, self).setUp()
18
super(HashIdStoreTest, self).setUp()
15
20
self.filename = self.makeFile()
16
self.store1 = PackageStore(self.filename)
17
self.store2 = PackageStore(self.filename)
21
self.store1 = HashIdStore(self.filename)
22
self.store2 = HashIdStore(self.filename)
24
def test_set_and_get_hash_id(self):
25
self.store1.set_hash_ids({"ha\x00sh1": 123, "ha\x00sh2": 456})
26
self.assertEquals(self.store1.get_hash_id("ha\x00sh1"), 123)
27
self.assertEquals(self.store1.get_hash_id("ha\x00sh2"), 456)
29
def test_get_hash_ids(self):
30
hash_ids = {"hash1": 123, "hash2": 456}
31
self.store1.set_hash_ids(hash_ids)
32
self.assertEquals(self.store1.get_hash_ids(), hash_ids)
19
34
def test_wb_transactional_commits(self):
20
35
mock_db = self.mocker.replace(self.store1._db)
28
43
self.mocker.replay()
29
44
self.assertRaises(Exception, self.store1.set_hash_ids, None)
31
def test_set_and_get_hash_id(self):
32
self.store1.set_hash_ids({"ha\x00sh1": 123, "ha\x00sh2": 456})
33
self.assertEquals(self.store2.get_hash_id("ha\x00sh1"), 123)
34
self.assertEquals(self.store2.get_hash_id("ha\x00sh2"), 456)
36
46
def test_get_id_hash(self):
37
47
self.store1.set_hash_ids({"hash1": 123, "hash2": 456})
38
48
self.assertEquals(self.store2.get_id_hash(123), "hash1")
39
49
self.assertEquals(self.store2.get_id_hash(456), "hash2")
51
def test_clear_hash_ids(self):
52
self.store1.set_hash_ids({"ha\x00sh1": 123, "ha\x00sh2": 456})
53
self.store1.clear_hash_ids()
54
self.assertEquals(self.store2.get_hash_id("ha\x00sh1"), None)
55
self.assertEquals(self.store2.get_hash_id("ha\x00sh2"), None)
41
57
def test_get_unexistent_hash(self):
42
58
self.assertEquals(self.store1.get_hash_id("hash1"), None)
64
80
self.assertTrue(time.time()-started < 5,
65
81
"Setting 20k hashes took more than 5 seconds.")
83
def test_check_sanity(self):
85
store_filename = self.makeFile()
86
db = sqlite3.connect(store_filename)
88
cursor.execute("CREATE TABLE hash"
89
" (junk INTEGER PRIMARY KEY, hash BLOB UNIQUE)")
93
store = HashIdStore(store_filename)
94
self.assertRaises(InvalidHashIdDb, store.check_sanity)
97
class PackageStoreTest(LandscapeTest):
100
super(PackageStoreTest, self).setUp()
102
self.filename = self.makeFile()
103
self.store1 = PackageStore(self.filename)
104
self.store2 = PackageStore(self.filename)
106
def test_has_hash_id_db(self):
108
self.assertFalse(self.store1.has_hash_id_db())
110
hash_id_db_filename = self.makeFile()
111
HashIdStore(hash_id_db_filename)
112
self.store1.add_hash_id_db(hash_id_db_filename)
114
self.assertTrue(self.store1.has_hash_id_db())
116
def test_add_hash_id_db_with_non_sqlite_file(self):
118
def junk_db_factory():
119
filename = self.makeFile()
120
open(filename, "w").write("junk")
124
store_filename = junk_db_factory()
126
self.store1.add_hash_id_db(store_filename)
127
except InvalidHashIdDb, e:
128
self.assertEqual(str(e), store_filename)
133
self.assertFalse(self.store1.has_hash_id_db())
135
def test_add_hash_id_db_with_wrong_schema(self):
137
def non_compliant_db_factory():
138
filename = self.makeFile()
139
db = sqlite3.connect(filename)
141
cursor.execute("CREATE TABLE hash"
142
" (junk INTEGER PRIMARY KEY, hash BLOB UNIQUE)")
147
self.assertRaises(InvalidHashIdDb, self.store1.add_hash_id_db,
148
non_compliant_db_factory())
149
self.assertFalse(self.store1.has_hash_id_db())
151
def hash_id_db_factory(self, hash_ids):
152
filename = self.makeFile()
153
store = HashIdStore(filename)
154
store.set_hash_ids(hash_ids)
157
def test_get_hash_id_using_hash_id_dbs(self):
160
# Without hash=>id dbs
161
self.assertEquals(self.store1.get_hash_id("hash1"), None)
162
self.assertEquals(self.store1.get_hash_id("hash2"), None)
164
# This hash=>id will be overriden
165
self.store1.set_hash_ids({"hash1": 1})
167
# Add a couple of hash=>id dbs
168
self.store1.add_hash_id_db(self.hash_id_db_factory({"hash1": 2,
170
self.store1.add_hash_id_db(self.hash_id_db_factory({"hash2": 4,
173
# Check look-up priorities and binary hashes
174
self.assertEquals(self.store1.get_hash_id("hash1"), 2)
175
self.assertEquals(self.store1.get_hash_id("hash2"), 3)
176
self.assertEquals(self.store1.get_hash_id("ha\x00sh1"), 5)
178
def test_get_id_hash_using_hash_id_db(self):
180
When lookaside hash->id dbs are used, L{get_id_hash} has
181
to query them first, falling back to the regular db in case
182
the desired mapping is not found.
184
self.store1.add_hash_id_db(self.hash_id_db_factory({"hash1": 123}))
185
self.store1.add_hash_id_db(self.hash_id_db_factory({"hash1": 999,
187
self.store1.set_hash_ids({"hash3": 789})
188
self.assertEquals(self.store1.get_id_hash(123), "hash1")
189
self.assertEquals(self.store1.get_id_hash(456), "hash2")
190
self.assertEquals(self.store1.get_id_hash(789), "hash3")
67
192
def test_add_and_get_available_packages(self):
68
193
self.store1.add_available([1, 2])
69
194
self.assertEquals(self.store2.get_available(), [1, 2])