ยปCore Development>Code coverage>Lib/bsddb/test/test_dbtables.py

Python code coverage for Lib/bsddb/test/test_dbtables.py

#countcontent
1n/a#!/usr/bin/env python
2n/a#
3n/a#-----------------------------------------------------------------------
4n/a# A test suite for the table interface built on bsddb.db
5n/a#-----------------------------------------------------------------------
6n/a#
7n/a# Copyright (C) 2000, 2001 by Autonomous Zone Industries
8n/a# Copyright (C) 2002 Gregory P. Smith
9n/a#
10n/a# March 20, 2000
11n/a#
12n/a# License: This is free software. You may use this software for any
13n/a# purpose including modification/redistribution, so long as
14n/a# this header remains intact and that you do not claim any
15n/a# rights of ownership or authorship of this software. This
16n/a# software has been tested, but no warranty is expressed or
17n/a# implied.
18n/a#
19n/a# -- Gregory P. Smith <greg@krypto.org>
20n/a#
21n/a# $Id: test_dbtables.py 79285 2010-03-22 14:22:26Z jesus.cea $
22n/a
23n/aimport os, re, sys
24n/a
25n/aif sys.version_info[0] < 3 :
26n/a try:
27n/a import cPickle
28n/a pickle = cPickle
29n/a except ImportError:
30n/a import pickle
31n/aelse :
32n/a import pickle
33n/a
34n/aimport unittest
35n/afrom test_all import db, dbtables, test_support, verbose, \
36n/a get_new_environment_path, get_new_database_path
37n/a
38n/a#----------------------------------------------------------------------
39n/a
40n/aclass TableDBTestCase(unittest.TestCase):
41n/a db_name = 'test-table.db'
42n/a
43n/a def setUp(self):
44n/a import sys
45n/a if sys.version_info[0] >= 3 :
46n/a from test_all import do_proxy_db_py3k
47n/a self._flag_proxy_db_py3k = do_proxy_db_py3k(False)
48n/a
49n/a self.testHomeDir = get_new_environment_path()
50n/a self.tdb = dbtables.bsdTableDB(
51n/a filename='tabletest.db', dbhome=self.testHomeDir, create=1)
52n/a
53n/a def tearDown(self):
54n/a self.tdb.close()
55n/a import sys
56n/a if sys.version_info[0] >= 3 :
57n/a from test_all import do_proxy_db_py3k
58n/a do_proxy_db_py3k(self._flag_proxy_db_py3k)
59n/a test_support.rmtree(self.testHomeDir)
60n/a
61n/a def test01(self):
62n/a tabname = "test01"
63n/a colname = 'cool numbers'
64n/a try:
65n/a self.tdb.Drop(tabname)
66n/a except dbtables.TableDBError:
67n/a pass
68n/a self.tdb.CreateTable(tabname, [colname])
69n/a import sys
70n/a if sys.version_info[0] < 3 :
71n/a self.tdb.Insert(tabname, {colname: pickle.dumps(3.14159, 1)})
72n/a else :
73n/a self.tdb.Insert(tabname, {colname: pickle.dumps(3.14159,
74n/a 1).decode("iso8859-1")}) # 8 bits
75n/a
76n/a if verbose:
77n/a self.tdb._db_print()
78n/a
79n/a values = self.tdb.Select(
80n/a tabname, [colname], conditions={colname: None})
81n/a
82n/a import sys
83n/a if sys.version_info[0] < 3 :
84n/a colval = pickle.loads(values[0][colname])
85n/a else :
86n/a colval = pickle.loads(bytes(values[0][colname], "iso8859-1"))
87n/a self.assert_(colval > 3.141)
88n/a self.assert_(colval < 3.142)
89n/a
90n/a
91n/a def test02(self):
92n/a tabname = "test02"
93n/a col0 = 'coolness factor'
94n/a col1 = 'but can it fly?'
95n/a col2 = 'Species'
96n/a
97n/a import sys
98n/a if sys.version_info[0] < 3 :
99n/a testinfo = [
100n/a {col0: pickle.dumps(8, 1), col1: 'no', col2: 'Penguin'},
101n/a {col0: pickle.dumps(-1, 1), col1: 'no', col2: 'Turkey'},
102n/a {col0: pickle.dumps(9, 1), col1: 'yes', col2: 'SR-71A Blackbird'}
103n/a ]
104n/a else :
105n/a testinfo = [
106n/a {col0: pickle.dumps(8, 1).decode("iso8859-1"),
107n/a col1: 'no', col2: 'Penguin'},
108n/a {col0: pickle.dumps(-1, 1).decode("iso8859-1"),
109n/a col1: 'no', col2: 'Turkey'},
110n/a {col0: pickle.dumps(9, 1).decode("iso8859-1"),
111n/a col1: 'yes', col2: 'SR-71A Blackbird'}
112n/a ]
113n/a
114n/a try:
115n/a self.tdb.Drop(tabname)
116n/a except dbtables.TableDBError:
117n/a pass
118n/a self.tdb.CreateTable(tabname, [col0, col1, col2])
119n/a for row in testinfo :
120n/a self.tdb.Insert(tabname, row)
121n/a
122n/a import sys
123n/a if sys.version_info[0] < 3 :
124n/a values = self.tdb.Select(tabname, [col2],
125n/a conditions={col0: lambda x: pickle.loads(x) >= 8})
126n/a else :
127n/a values = self.tdb.Select(tabname, [col2],
128n/a conditions={col0: lambda x:
129n/a pickle.loads(bytes(x, "iso8859-1")) >= 8})
130n/a
131n/a self.assertEqual(len(values), 2)
132n/a if values[0]['Species'] == 'Penguin' :
133n/a self.assertEqual(values[1]['Species'], 'SR-71A Blackbird')
134n/a elif values[0]['Species'] == 'SR-71A Blackbird' :
135n/a self.assertEqual(values[1]['Species'], 'Penguin')
136n/a else :
137n/a if verbose:
138n/a print "values= %r" % (values,)
139n/a raise RuntimeError("Wrong values returned!")
140n/a
141n/a def test03(self):
142n/a tabname = "test03"
143n/a try:
144n/a self.tdb.Drop(tabname)
145n/a except dbtables.TableDBError:
146n/a pass
147n/a if verbose:
148n/a print '...before CreateTable...'
149n/a self.tdb._db_print()
150n/a self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])
151n/a if verbose:
152n/a print '...after CreateTable...'
153n/a self.tdb._db_print()
154n/a self.tdb.Drop(tabname)
155n/a if verbose:
156n/a print '...after Drop...'
157n/a self.tdb._db_print()
158n/a self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])
159n/a
160n/a try:
161n/a self.tdb.Insert(tabname,
162n/a {'a': "",
163n/a 'e': pickle.dumps([{4:5, 6:7}, 'foo'], 1),
164n/a 'f': "Zero"})
165n/a self.fail('Expected an exception')
166n/a except dbtables.TableDBError:
167n/a pass
168n/a
169n/a try:
170n/a self.tdb.Select(tabname, [], conditions={'foo': '123'})
171n/a self.fail('Expected an exception')
172n/a except dbtables.TableDBError:
173n/a pass
174n/a
175n/a self.tdb.Insert(tabname,
176n/a {'a': '42',
177n/a 'b': "bad",
178n/a 'c': "meep",
179n/a 'e': 'Fuzzy wuzzy was a bear'})
180n/a self.tdb.Insert(tabname,
181n/a {'a': '581750',
182n/a 'b': "good",
183n/a 'd': "bla",
184n/a 'c': "black",
185n/a 'e': 'fuzzy was here'})
186n/a self.tdb.Insert(tabname,
187n/a {'a': '800000',
188n/a 'b': "good",
189n/a 'd': "bla",
190n/a 'c': "black",
191n/a 'e': 'Fuzzy wuzzy is a bear'})
192n/a
193n/a if verbose:
194n/a self.tdb._db_print()
195n/a
196n/a # this should return two rows
197n/a values = self.tdb.Select(tabname, ['b', 'a', 'd'],
198n/a conditions={'e': re.compile('wuzzy').search,
199n/a 'a': re.compile('^[0-9]+$').match})
200n/a self.assertEqual(len(values), 2)
201n/a
202n/a # now lets delete one of them and try again
203n/a self.tdb.Delete(tabname, conditions={'b': dbtables.ExactCond('good')})
204n/a values = self.tdb.Select(
205n/a tabname, ['a', 'd', 'b'],
206n/a conditions={'e': dbtables.PrefixCond('Fuzzy')})
207n/a self.assertEqual(len(values), 1)
208n/a self.assertEqual(values[0]['d'], None)
209n/a
210n/a values = self.tdb.Select(tabname, ['b'],
211n/a conditions={'c': lambda c: c == 'meep'})
212n/a self.assertEqual(len(values), 1)
213n/a self.assertEqual(values[0]['b'], "bad")
214n/a
215n/a
216n/a def test04_MultiCondSelect(self):
217n/a tabname = "test04_MultiCondSelect"
218n/a try:
219n/a self.tdb.Drop(tabname)
220n/a except dbtables.TableDBError:
221n/a pass
222n/a self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e'])
223n/a
224n/a try:
225n/a self.tdb.Insert(tabname,
226n/a {'a': "",
227n/a 'e': pickle.dumps([{4:5, 6:7}, 'foo'], 1),
228n/a 'f': "Zero"})
229n/a self.fail('Expected an exception')
230n/a except dbtables.TableDBError:
231n/a pass
232n/a
233n/a self.tdb.Insert(tabname, {'a': "A", 'b': "B", 'c': "C", 'd': "D",
234n/a 'e': "E"})
235n/a self.tdb.Insert(tabname, {'a': "-A", 'b': "-B", 'c': "-C", 'd': "-D",
236n/a 'e': "-E"})
237n/a self.tdb.Insert(tabname, {'a': "A-", 'b': "B-", 'c': "C-", 'd': "D-",
238n/a 'e': "E-"})
239n/a
240n/a if verbose:
241n/a self.tdb._db_print()
242n/a
243n/a # This select should return 0 rows. it is designed to test
244n/a # the bug identified and fixed in sourceforge bug # 590449
245n/a # (Big Thanks to "Rob Tillotson (n9mtb)" for tracking this down
246n/a # and supplying a fix!! This one caused many headaches to say
247n/a # the least...)
248n/a values = self.tdb.Select(tabname, ['b', 'a', 'd'],
249n/a conditions={'e': dbtables.ExactCond('E'),
250n/a 'a': dbtables.ExactCond('A'),
251n/a 'd': dbtables.PrefixCond('-')
252n/a } )
253n/a self.assertEqual(len(values), 0, values)
254n/a
255n/a
256n/a def test_CreateOrExtend(self):
257n/a tabname = "test_CreateOrExtend"
258n/a
259n/a self.tdb.CreateOrExtendTable(
260n/a tabname, ['name', 'taste', 'filling', 'alcohol content', 'price'])
261n/a try:
262n/a self.tdb.Insert(tabname,
263n/a {'taste': 'crap',
264n/a 'filling': 'no',
265n/a 'is it Guinness?': 'no'})
266n/a self.fail("Insert should've failed due to bad column name")
267n/a except:
268n/a pass
269n/a self.tdb.CreateOrExtendTable(tabname,
270n/a ['name', 'taste', 'is it Guinness?'])
271n/a
272n/a # these should both succeed as the table should contain the union of both sets of columns.
273n/a self.tdb.Insert(tabname, {'taste': 'crap', 'filling': 'no',
274n/a 'is it Guinness?': 'no'})
275n/a self.tdb.Insert(tabname, {'taste': 'great', 'filling': 'yes',
276n/a 'is it Guinness?': 'yes',
277n/a 'name': 'Guinness'})
278n/a
279n/a
280n/a def test_CondObjs(self):
281n/a tabname = "test_CondObjs"
282n/a
283n/a self.tdb.CreateTable(tabname, ['a', 'b', 'c', 'd', 'e', 'p'])
284n/a
285n/a self.tdb.Insert(tabname, {'a': "the letter A",
286n/a 'b': "the letter B",
287n/a 'c': "is for cookie"})
288n/a self.tdb.Insert(tabname, {'a': "is for aardvark",
289n/a 'e': "the letter E",
290n/a 'c': "is for cookie",
291n/a 'd': "is for dog"})
292n/a self.tdb.Insert(tabname, {'a': "the letter A",
293n/a 'e': "the letter E",
294n/a 'c': "is for cookie",
295n/a 'p': "is for Python"})
296n/a
297n/a values = self.tdb.Select(
298n/a tabname, ['p', 'e'],
299n/a conditions={'e': dbtables.PrefixCond('the l')})
300n/a self.assertEqual(len(values), 2, values)
301n/a self.assertEqual(values[0]['e'], values[1]['e'], values)
302n/a self.assertNotEqual(values[0]['p'], values[1]['p'], values)
303n/a
304n/a values = self.tdb.Select(
305n/a tabname, ['d', 'a'],
306n/a conditions={'a': dbtables.LikeCond('%aardvark%')})
307n/a self.assertEqual(len(values), 1, values)
308n/a self.assertEqual(values[0]['d'], "is for dog", values)
309n/a self.assertEqual(values[0]['a'], "is for aardvark", values)
310n/a
311n/a values = self.tdb.Select(tabname, None,
312n/a {'b': dbtables.Cond(),
313n/a 'e':dbtables.LikeCond('%letter%'),
314n/a 'a':dbtables.PrefixCond('is'),
315n/a 'd':dbtables.ExactCond('is for dog'),
316n/a 'c':dbtables.PrefixCond('is for'),
317n/a 'p':lambda s: not s})
318n/a self.assertEqual(len(values), 1, values)
319n/a self.assertEqual(values[0]['d'], "is for dog", values)
320n/a self.assertEqual(values[0]['a'], "is for aardvark", values)
321n/a
322n/a def test_Delete(self):
323n/a tabname = "test_Delete"
324n/a self.tdb.CreateTable(tabname, ['x', 'y', 'z'])
325n/a
326n/a # prior to 2001-05-09 there was a bug where Delete() would
327n/a # fail if it encountered any rows that did not have values in
328n/a # every column.
329n/a # Hunted and Squashed by <Donwulff> (Jukka Santala - donwulff@nic.fi)
330n/a self.tdb.Insert(tabname, {'x': 'X1', 'y':'Y1'})
331n/a self.tdb.Insert(tabname, {'x': 'X2', 'y':'Y2', 'z': 'Z2'})
332n/a
333n/a self.tdb.Delete(tabname, conditions={'x': dbtables.PrefixCond('X')})
334n/a values = self.tdb.Select(tabname, ['y'],
335n/a conditions={'x': dbtables.PrefixCond('X')})
336n/a self.assertEqual(len(values), 0)
337n/a
338n/a def test_Modify(self):
339n/a tabname = "test_Modify"
340n/a self.tdb.CreateTable(tabname, ['Name', 'Type', 'Access'])
341n/a
342n/a self.tdb.Insert(tabname, {'Name': 'Index to MP3 files.doc',
343n/a 'Type': 'Word', 'Access': '8'})
344n/a self.tdb.Insert(tabname, {'Name': 'Nifty.MP3', 'Access': '1'})
345n/a self.tdb.Insert(tabname, {'Type': 'Unknown', 'Access': '0'})
346n/a
347n/a def set_type(type):
348n/a if type is None:
349n/a return 'MP3'
350n/a return type
351n/a
352n/a def increment_access(count):
353n/a return str(int(count)+1)
354n/a
355n/a def remove_value(value):
356n/a return None
357n/a
358n/a self.tdb.Modify(tabname,
359n/a conditions={'Access': dbtables.ExactCond('0')},
360n/a mappings={'Access': remove_value})
361n/a self.tdb.Modify(tabname,
362n/a conditions={'Name': dbtables.LikeCond('%MP3%')},
363n/a mappings={'Type': set_type})
364n/a self.tdb.Modify(tabname,
365n/a conditions={'Name': dbtables.LikeCond('%')},
366n/a mappings={'Access': increment_access})
367n/a
368n/a try:
369n/a self.tdb.Modify(tabname,
370n/a conditions={'Name': dbtables.LikeCond('%')},
371n/a mappings={'Access': 'What is your quest?'})
372n/a except TypeError:
373n/a # success, the string value in mappings isn't callable
374n/a pass
375n/a else:
376n/a raise RuntimeError, "why was TypeError not raised for bad callable?"
377n/a
378n/a # Delete key in select conditions
379n/a values = self.tdb.Select(
380n/a tabname, None,
381n/a conditions={'Type': dbtables.ExactCond('Unknown')})
382n/a self.assertEqual(len(values), 1, values)
383n/a self.assertEqual(values[0]['Name'], None, values)
384n/a self.assertEqual(values[0]['Access'], None, values)
385n/a
386n/a # Modify value by select conditions
387n/a values = self.tdb.Select(
388n/a tabname, None,
389n/a conditions={'Name': dbtables.ExactCond('Nifty.MP3')})
390n/a self.assertEqual(len(values), 1, values)
391n/a self.assertEqual(values[0]['Type'], "MP3", values)
392n/a self.assertEqual(values[0]['Access'], "2", values)
393n/a
394n/a # Make sure change applied only to select conditions
395n/a values = self.tdb.Select(
396n/a tabname, None, conditions={'Name': dbtables.LikeCond('%doc%')})
397n/a self.assertEqual(len(values), 1, values)
398n/a self.assertEqual(values[0]['Type'], "Word", values)
399n/a self.assertEqual(values[0]['Access'], "9", values)
400n/a
401n/a
402n/adef test_suite():
403n/a suite = unittest.TestSuite()
404n/a suite.addTest(unittest.makeSuite(TableDBTestCase))
405n/a return suite
406n/a
407n/a
408n/aif __name__ == '__main__':
409n/a unittest.main(defaultTest='test_suite')