test case for versioning 10,9,8,1

This commit is contained in:
Muzahid 2021-02-24 21:43:04 +05:30
parent aed71c11ab
commit 17d40ef43c
Signed by untrusted user: cis-muzahid
GPG Key ID: 1DC85E7D3AB613EA
6 changed files with 273 additions and 50 deletions

View File

View File

@ -0,0 +1,104 @@
--- CREATE TABLE IF NOT EXISTS inbox (msgid blob, toaddress text, fromaddress text, subject text, received text, message text, folder text, encodingtype int, read bool, sighash blob, UNIQUE(msgid) ON CONFLICT REPLACE));
-- CREATE TABLE IF NOT EXISTS `inbox` (
-- `msgid` blob NOT NULL,
-- `toaddress` text DEFAULT NULL,
-- `fromaddress` text DEFAULT NULL,
-- `subject` text DEFAULT NULL,
-- `received` text DEFAULT NULL,
-- `message` text DEFAULT NULL,
-- `folder` text DEFAULT NULL,
-- `encodingtype` int DEFAULT NULL,
-- `read` bool DEFAULT NULL,
-- `sighash` blob DEFAULT NULL,
-- UNIQUE(msgid) ON CONFLICT REPLACE
-- ) ;
-- CREATE TABLE IF NOT EXISTS `sent` (
-- `msgid` blob NOT NULL,
-- `toaddress` text DEFAULT NULL,
-- `toripe` blob DEFAULT NULL,
-- `fromaddress` text DEFAULT NULL,
-- `subject` text DEFAULT NULL,
-- `message` text DEFAULT NULL,
-- `ackdata` blob DEFAULT NULL,
-- `senttime` integer DEFAULT NULL,
-- `lastactiontime` integer DEFAULT NULL,
-- `sleeptill` integer DEFAULT NULL,
-- `status` text DEFAULT NULL,
-- `retrynumber` integer DEFAULT NULL,
-- `folder` text DEFAULT NULL,
-- `encodingtype` int DEFAULT NULL,
-- `ttl` int DEFAULT NULL,
-- UNIQUE(msgid) ON CONFLICT REPLACE
-- ) ;
--
-- Table structure for table `settings`
--
CREATE TABLE IF NOT EXISTS `settings` (
`key` blob NOT NULL,
`value` text DEFAULT NULL,
UNIQUE(key) ON CONFLICT REPLACE
) ;
--
-- Dumping data for table `settings`
--
INSERT INTO `settings` VALUES ('version','1');
--
-- Table structure for table `inventory`
--
CREATE TABLE IF NOT EXISTS `inventory` (
`hash` blob NOT NULL,
`objecttype` int DEFAULT NULL,
`streamnumber` int NOT NULL,
`payload` blob DEFAULT NULL,
`integer` integer NOT NULL,
-- `tag` blob DEFAULT NULL,
UNIQUE(hash) ON CONFLICT REPLACE
) ;
-- self.cur.execute(
-- '''CREATE TABLE inbox (msgid blob, toaddress text, fromaddress text, subject text,'''
-- ''' received text, message text, folder text, encodingtype int, read bool, sighash blob,'''
-- ''' UNIQUE(msgid) ON CONFLICT REPLACE)''')
-- self.cur.execute(
-- '''CREATE TABLE sent (msgid blob, toaddress text, toripe blob, fromaddress text, subject text,'''
-- ''' message text, ackdata blob, senttime integer, lastactiontime integer,'''
-- ''' sleeptill integer, status text, retrynumber integer, folder text, encodingtype int, ttl int)''')
-- self.cur.execute(
-- '''CREATE TABLE subscriptions (label text, address text, enabled bool)''')
-- self.cur.execute(
-- '''CREATE TABLE addressbook (label text, address text, UNIQUE(address) ON CONFLICT IGNORE)''')
-- self.cur.execute(
-- '''CREATE TABLE blacklist (label text, address text, enabled bool)''')
-- self.cur.execute(
-- '''CREATE TABLE whitelist (label text, address text, enabled bool)''')
-- self.cur.execute(
-- '''CREATE TABLE pubkeys (address text, addressversion int, transmitdata blob, time int,'''
-- ''' usedpersonally text, UNIQUE(address) ON CONFLICT REPLACE)''')
-- # self.cur.execute(
-- # '''CREATE TABLE inventory (hash blob, objecttype int, streamnumber int, payload blob,'''
-- # ''' expirestime integer, tag blob, UNIQUE(hash) ON CONFLICT REPLACE)''')
-- self.cur.execute(
-- '''CREATE TABLE inventory (hash blob, objecttype int, streamnumber int, payload blob,'''
-- ''' expirestime integer, UNIQUE(hash) ON CONFLICT REPLACE)''')
-- # self.cur.execute(
-- # '''INSERT INTO subscriptions VALUES'''
-- # '''('Bitmessage new releases/announcements','BM-GtovgYdgs7qXPkoYaRgrLFuFKz1SFpsw',1)''')
-- self.cur.execute('''CREATE TABLE settings (key blob, value blob, UNIQUE(key) ON CONFLICT REPLACE)''')
-- # self.cur.execute('''INSERT INTO settings VALUES('version','11')''')
-- # self.cur.execute('''INSERT INTO settings VALUES('lastvacuumtime',?)''', (
-- # int(time.time()),))
-- self.cur.execute(
-- '''CREATE TABLE objectprocessorqueue'''
-- ''' (objecttype int, data blob, UNIQUE(objecttype, data) ON CONFLICT REPLACE)''')
-- self.conn.commit()

View File

@ -0,0 +1,9 @@
--
-- Table structure for table `addressbook`
--
CREATE TABLE IF NOT EXISTS `addressbook` (
`label` blob NOT NULL,
`address` text DEFAULT NULL,
UNIQUE(address) ON CONFLICT IGNORE
) ;

View File

@ -0,0 +1,16 @@
--
-- Table structure for table `inbox`
--
CREATE TABLE IF NOT EXISTS `inbox` (
`msgid` blob NOT NULL,
`toaddress` text DEFAULT NULL,
`fromaddress` text DEFAULT NULL,
`subject` text DEFAULT NULL,
`received` text DEFAULT NULL,
`message` text DEFAULT NULL,
`folder` text DEFAULT NULL,
`encodingtype` int DEFAULT NULL,
`read` bool DEFAULT NULL,
UNIQUE(msgid) ON CONFLICT REPLACE
) ;

View File

@ -0,0 +1,37 @@
--
-- Table structure for table `sent`
--
CREATE TABLE IF NOT EXISTS `sent` (
`msgid` blob NOT NULL,
`toaddress` text DEFAULT NULL,
`toripe` blob DEFAULT NULL,
`fromaddress` text DEFAULT NULL,
`subject` text DEFAULT NULL,
`message` text DEFAULT NULL,
`ackdata` blob DEFAULT NULL,
`senttime` integer DEFAULT NULL,
`lastactiontime` integer DEFAULT NULL,
`sleeptill` integer DEFAULT NULL,
`status` text DEFAULT NULL,
`retrynumber` integer DEFAULT NULL,
`folder` text DEFAULT NULL,
`encodingtype` int DEFAULT NULL,
`ttl` int DEFAULT NULL,
UNIQUE(msgid) ON CONFLICT REPLACE
) ;
--
-- Table structure for table `pubkeys`
--
CREATE TABLE IF NOT EXISTS `pubkeys` (
`hash` text,
`addressversion` int,
`transmitdata` blob,
`time` int,
`usedpersonally` text,
UNIQUE(hash) ON CONFLICT REPLACE
) ;

View File

@ -1,6 +1,7 @@
""" """
Test for ECC blind signatures Test for sqlThread blind signatures
""" """
import os import os
import unittest import unittest
import shutil # used for moving the messages.dat file import shutil # used for moving the messages.dat file
@ -10,9 +11,10 @@ import threading
import time import time
# print sys.path # print sys.path
# import state # import state
# import sql
# from sql import init_version_1.sql
from ..state import appdata from ..state import appdata
from ..helper_sql import sqlStoredProcedure from ..helper_sql import sqlStoredProcedure
# import threading # import threading
# from hashlib import sha256 # from hashlib import sha256
# from ..helper_sql import sqlQuery # from ..helper_sql import sqlQuery
@ -20,13 +22,12 @@ from ..helper_sql import sqlStoredProcedure
# from common import cleanup # from common import cleanup
from ..class_sqlThread import (sqlThread, UpgradeDB) from ..class_sqlThread import (sqlThread, UpgradeDB)
class TestSqlThread(unittest.TestCase): class TestSqlThread(unittest.TestCase):
""" """
Test case for SQLThread Test case for SQLThread
""" """
# def __init__(self):
# initialise Db connection
conn = sqlite3.connect(appdata + 'messages.dat') conn = sqlite3.connect(appdata + 'messages.dat')
conn.text_factory = str conn.text_factory = str
cur = conn.cursor() cur = conn.cursor()
@ -38,77 +39,133 @@ class TestSqlThread(unittest.TestCase):
sqlLookup.daemon = False sqlLookup.daemon = False
sqlLookup.start() sqlLookup.start()
@classmethod
def setUp(cls):
tables = list(cls.cur.execute("select name from sqlite_master where type is 'table'"))
cls.cur.executescript(';'.join(["drop table if exists %s" % i for i in tables]))
@classmethod
def tearDown(cls):
pass
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
# Stop sql thread # Stop sql thread
sqlStoredProcedure('exit') sqlStoredProcedure('exit')
print "...TearDown"
def db_connection(self): def db_connection(self):
conn = sqlite3.connect(appdata + 'messages.dat') conn = sqlite3.connect(appdata + 'messages.dat')
conn.text_factory = str conn.text_factory = str
return conn.cursor() return conn.cursor()
def normalize_version(self): def normalize_version(self, file):
try: try:
self.cur.execute( root_path = os.path.dirname(os.path.dirname(__file__))
'''CREATE TABLE inbox (msgid blob, toaddress text, fromaddress text, subject text,''' sql_file_path = os.path.join(root_path, 'tests/sql/')
''' received text, message text, folder text, encodingtype int, read bool, sighash blob,''' sql_file_path = os.path.join(sql_file_path, "init_version_"+file+".sql")
''' UNIQUE(msgid) ON CONFLICT REPLACE)''') sql_file = open(sql_file_path)
self.cur.execute( sql_as_string = sql_file.read()
'''CREATE TABLE sent (msgid blob, toaddress text, toripe blob, fromaddress text, subject text,''' self.cur.executescript(sql_as_string)
''' message text, ackdata blob, senttime integer, lastactiontime integer,'''
''' sleeptill integer, status text, retrynumber integer, folder text, encodingtype int, ttl int)''')
self.cur.execute(
'''CREATE TABLE subscriptions (label text, address text, enabled bool)''')
self.cur.execute(
'''CREATE TABLE addressbook (label text, address text, UNIQUE(address) ON CONFLICT IGNORE)''')
self.cur.execute(
'''CREATE TABLE blacklist (label text, address text, enabled bool)''')
self.cur.execute(
'''CREATE TABLE whitelist (label text, address text, enabled bool)''')
self.cur.execute(
'''CREATE TABLE pubkeys (address text, addressversion int, transmitdata blob, time int,'''
''' usedpersonally text, UNIQUE(address) ON CONFLICT REPLACE)''')
# self.cur.execute(
# '''CREATE TABLE inventory (hash blob, objecttype int, streamnumber int, payload blob,'''
# ''' expirestime integer, tag blob, UNIQUE(hash) ON CONFLICT REPLACE)''')
self.cur.execute(
'''CREATE TABLE inventory (hash blob, objecttype int, streamnumber int, payload blob,'''
''' expirestime integer, UNIQUE(hash) ON CONFLICT REPLACE)''')
# self.cur.execute(
# '''INSERT INTO subscriptions VALUES'''
# '''('Bitmessage new releases/announcements','BM-GtovgYdgs7qXPkoYaRgrLFuFKz1SFpsw',1)''')
self.cur.execute('''CREATE TABLE settings (key blob, value blob, UNIQUE(key) ON CONFLICT REPLACE)''')
# self.cur.execute('''INSERT INTO settings VALUES('version','11')''')
# self.cur.execute('''INSERT INTO settings VALUES('lastvacuumtime',?)''', (
# int(time.time()),))
self.cur.execute(
'''CREATE TABLE objectprocessorqueue'''
''' (objecttype int, data blob, UNIQUE(objecttype, data) ON CONFLICT REPLACE)''')
self.conn.commit() self.conn.commit()
except Exception as err: except Exception as err:
print err.message
if str(err) == 'table inbox already exists': if str(err) == 'table inbox already exists':
print "table inbox already exists" return "table inbox already exists"
else: else:
sys.stderr.write( sys.stderr.write(
'ERROR trying to create database file (message.dat). Error message: %s\n' % str(err)) 'ERROR trying to create database file (message.dat). Error message: %s\n' % str(err))
os._exit(0) os._exit(0)
def clean_db(self): def filter_table_column(self, schema, column):
tables = list(self.cur.execute("select name from sqlite_master where type is 'table'")) for x in schema:
return self.cur.executescript(';'.join(["drop table if exists %s" % i for i in tables])) for y in x:
if y == column:
yield y
def test_sql_thread_version_one(self): def test_sql_thread_version_1(self):
""" """
Test with version 1 Test with version 1
""" """
self.clean_db() # normalise Db for version 1
self.normalize_version() self.normalize_version("1")
self.cur.execute('''INSERT INTO settings VALUES('version','1')''')
# Test versioning
upgrade_db = UpgradeDB() upgrade_db = UpgradeDB()
upgrade_db.cur = self.cur upgrade_db.cur = self.cur
upgrade_db.upgrade_schema_data_1() upgrade_db.upgrade_schema_data_1()
# Assertion after versioning
res = self.cur.execute('''PRAGMA table_info('inventory');''')
res = res.fetchall()
result = list(self.filter_table_column(res, "tag"))
res = [tup for tup in res if any(i in tup for i in ["tag"])]
self.assertEqual(result, ['tag'] , "Data not migrated for version 1")
self.assertEqual(res, [(5, 'tag', 'blob', 0, "''", 0)] , "Data not migrated for version 1")
def test_sql_thread_version_10(self):
"""
Test with version 10
"""
# Update version 10
self.normalize_version("10")
# Test versioning
upgrade_db = UpgradeDB()
upgrade_db.cur = self.cur
upgrade_db.upgrade_schema_data_10()
# Assertion
self.cur.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='old_addressbook' ''')
self.assertNotEqual(self.cur.fetchone(), 1 , "Table old_addressbook not deleted")
res = self.cur.execute('''PRAGMA table_info('addressbook');''')
res = res.fetchall()
result = list(self.filter_table_column(res, "address"))
self.assertEqual(result, ['address'] , "Data not migrated for version 10")
def test_sql_thread_version_9(self):
"""
Test with version 9
"""
# Update version 9
self.normalize_version("9")
# Test versioning
upgrade_db = UpgradeDB()
upgrade_db.cur = self.cur
upgrade_db.upgrade_schema_data_9()
# Assertion
self.cur.execute(''' SELECT count(name) FROM sqlite_master WHERE type='table' AND name='pubkeys_backup' ''')
self.assertNotEqual(self.cur.fetchone(), 1 , "Table pubkeys_backup not deleted")
res = self.cur.execute('''PRAGMA table_info('pubkeys');''')
res = res.fetchall()
result = list(self.filter_table_column(res, "address"))
self.assertEqual(result, ['address'] , "Data not migrated for version 9")
def test_sql_thread_version_8(self):
"""
Test with version 8
"""
# Update version 8
self.normalize_version("8")
# Test versioning
upgrade_db = UpgradeDB()
upgrade_db.cur = self.cur
upgrade_db.upgrade_schema_data_8()
# # Assertion
res = self.cur.execute('''PRAGMA table_info('inbox');''')
res = res.fetchall()
result = list(self.filter_table_column(res, "sighash"))
self.assertEqual(result, ['sighash'] , "Data not migrated for version 8")