PageRenderTime 46ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/lib-python/2.7/bsddb/test/test_dbtables.py

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