From 35243cc08c2e2264c98135b45fad68fed5053d0a Mon Sep 17 00:00:00 2001 From: navjot Date: Thu, 11 Mar 2021 13:13:26 +0530 Subject: [PATCH] removed the main method and made it work like unit test cases --- src/bitmessagekivy/tests/common.py | 17 ++ src/bitmessagekivy/tests/common_data.py | 35 --- src/bitmessagekivy/tests/telenium_process.py | 79 +++--- src/bitmessagekivy/tests/test_addressbook.py | 21 +- .../tests/test_allmail_message.py | 13 +- .../tests/test_create_random_address.py | 28 +- .../tests/test_draft_message.py | 24 +- .../tests/test_myaddress_screen.py | 16 +- .../tests/test_network_screen.py | 10 +- .../tests/test_payment_subscription.py | 10 +- src/bitmessagekivy/tests/test_sent_message.py | 35 ++- .../tests/test_setting_screen.py | 17 +- src/bitmessagekivy/tests/test_tmp_db_setup.py | 240 ------------------ .../tests/test_trash_message.py | 10 +- src/bitmessagemain_mock_test.py | 22 ++ src/main_mock_test.py | 9 + 16 files changed, 174 insertions(+), 412 deletions(-) create mode 100644 src/bitmessagekivy/tests/common.py delete mode 100644 src/bitmessagekivy/tests/common_data.py delete mode 100644 src/bitmessagekivy/tests/test_tmp_db_setup.py create mode 100644 src/bitmessagemain_mock_test.py create mode 100644 src/main_mock_test.py diff --git a/src/bitmessagekivy/tests/common.py b/src/bitmessagekivy/tests/common.py new file mode 100644 index 00000000..14e59609 --- /dev/null +++ b/src/bitmessagekivy/tests/common.py @@ -0,0 +1,17 @@ +import unittest + + +def make_ordered_test(): + order = {} + + def ordered(f): + order[f.__name__] = len(order) + return f + + def compare(a, b): + return [1, -1][order[a] < order[b]] + + return ordered, compare + +ordered, compare = make_ordered_test() +unittest.defaultTestLoader.sortTestMethodsUsing = compare \ No newline at end of file diff --git a/src/bitmessagekivy/tests/common_data.py b/src/bitmessagekivy/tests/common_data.py deleted file mode 100644 index ee796a7b..00000000 --- a/src/bitmessagekivy/tests/common_data.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys -import time -import unittest - - -_files = ( - 'keys.dat', 'debug.log', 'messages.dat', 'knownnodes.dat', - '.api_started', 'unittest.lock' -) - - -def cleanup(home=None, files=_files): - """Cleanup application files""" - if not home: - import state - home = state.appdata - for pfile in files: - try: - os.remove(os.path.join(home, pfile)) - print(__file__,'.........................................(clean)', pfile) - except OSError: - pass - - -def skip_python3(): - """Raise unittest.SkipTest() if detected python3""" - # if sys.hexversion >= 0x3000000: - # raise unittest.SkipTest('Module is not ported to python3') - - -def put_signal_file(path, filename): - """Creates file, presence of which is a signal about some event.""" - with open(os.path.join(path, filename), 'wb') as outfile: - outfile.write(b'%i' % time.time()) diff --git a/src/bitmessagekivy/tests/telenium_process.py b/src/bitmessagekivy/tests/telenium_process.py index 71d64498..f2b5f34c 100644 --- a/src/bitmessagekivy/tests/telenium_process.py +++ b/src/bitmessagekivy/tests/telenium_process.py @@ -1,9 +1,9 @@ -import os +import os, signal import psutil import shutil import tempfile from telenium.tests import TeleniumTestCase -from bitmessagekivy.tests.test_process_data import TestProcessProto +from threads import addressGenerator, sqlThread _files = ( @@ -26,7 +26,7 @@ def cleanup(home=None, files=_files): os.remove(os.path.join(home, pfile)) print(__file__,'.........................................(clean)', pfile) except OSError: - print('error............................................') + # print('error............................................') pass @@ -40,45 +40,46 @@ def set_temp_data(): class TeleniumTestProcess(TeleniumTestCase): """Setting Screen Functionality Testing""" - cmd_entrypoint = ['/home/cis/py3porting/Chatroom/PyBitmessage/src/main.py'] + cmd_entrypoint = ['/home/cis/py3porting/Chatroom/PyBitmessage/src/main_mock_test.py'] @classmethod - def setUpClass(cls, is_login_screen=None): - print('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', is_login_screen) + def setUpClass(cls): + print('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', __file__) os.environ["BITMESSAGE_HOME"] = tempfile.gettempdir() - if is_login_screen: - cleanup() - else: - set_temp_data() + set_temp_data() super(TeleniumTestProcess, cls).setUpClass() - # @classmethod - # def tearDownClass(cls): - # """Ensures that pybitmessage stopped and removes files""" - # print('tearDownClass.........................................(pass)') - # try: - # if not cls._stop_process(1): - # processes = cls.process.children(recursive=True) - # processes.append(cls.process) - # for p in processes: - # try: - # p.kill() - # except psutil.NoSuchProcess: - # pass - # except psutil.NoSuchProcess: - # pass - # finally: - # # import pdb;pdb.set_trace() - # cleanup() - # # cls._cleanup_files() + @classmethod + def tearDownClass(cls): + """Ensures that pybitmessage stopped and removes files""" + # super(TeleniumTestProcess, cls).tearDownClass() + print('tearDownClass.........................................(pass)', os.getpid()) + cleanup() + pid = os.getpid() + os.kill(int(pid), signal.SIGKILL) + # import pdb;pdb.set_trace() - # @classmethod - # def _stop_process(cls, timeout=5): - # print('_stop_process.........................................(pass)') - # import signal - # cls.process.send_signal(signal.SIGTERM) - # try: - # cls.process.wait(timeout) - # except psutil.TimeoutExpired: - # return False - # return True \ No newline at end of file + # # os.kill() + # # import psutil + # # cnt = 0 + # # # print('total count=========================================', len(psutil.process_iter())) + # # for proc in psutil.process_iter(): + # # print('line...................................62', proc.name(), proc.pid) + # # cnt = cnt +1 + # # if proc.name() == 'python': + # # print('line........................69', proc.pid) + # # # os.kill(int(pid), signal.SIGKILL) + # # print('total cnt.............................', cnt) + # # # cleanup() + # # proc.kill() + # # # os.kill(int(proc.pid), signal.SIGKILL) + + @classmethod + def setUp(self): + # self.widget = Widget('The widget') + print('&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7setup') + + @classmethod + def tearDown(self): + print('###############################################tearDown') + # self.widget.dispose() diff --git a/src/bitmessagekivy/tests/test_addressbook.py b/src/bitmessagekivy/tests/test_addressbook.py index 3cfdf716..dcff126a 100644 --- a/src/bitmessagekivy/tests/test_addressbook.py +++ b/src/bitmessagekivy/tests/test_addressbook.py @@ -1,10 +1,15 @@ import time from bitmessagekivy.tests.telenium_process import TeleniumTestProcess +from bmconfigparser import BMConfigParser +from .common import ordered + +data = BMConfigParser().addresses() class AddressBook(TeleniumTestProcess): """AddressBook Screen Functionality Testing""" + @ordered def test_save_address(self): """Save Address On Address Book Screen/Window""" print("=====================Test -Save Address In Address Book=====================") @@ -48,6 +53,7 @@ class AddressBook(TeleniumTestProcess): self.cli.click_on('//MDRaisedButton[0]') time.sleep(4) + @ordered def test_cancel_address(self): """Cancel Address""" print("=====================Test -Cancel Address=====================") @@ -60,6 +66,7 @@ class AddressBook(TeleniumTestProcess): time.sleep(3) self.cli.click_on('//MDRaisedButton[1]') + @ordered def test_send_message_to_addressbook(self): """Directly Send Message To The User""" print("=====================Test -Directly Send Message To The User=====================") @@ -82,6 +89,7 @@ class AddressBook(TeleniumTestProcess): self.cli.click_on('//MDIconButton[2]') time.sleep(2) + @ordered def test_delete_address_from_address_contact(self): """Delete Address From Address Book""" print("=====================Test -Delete Address From Address Book=====================") @@ -94,16 +102,3 @@ class AddressBook(TeleniumTestProcess): '//AddressBook/BoxLayout[0]/BoxLayout[0]/ScrollView[0]/MDList[0]/Carousel[0]//TwoLineAvatarIconListItem[0]/BoxLayout[2]', 2) time.sleep(2) self.cli.click_on('//AddressBook/BoxLayout[0]/BoxLayout[0]/ScrollView[0]/MDList[0]/Carousel[0]//Button[0]') - - def test_all_address_book_method(self): - self.test_save_address() - self.test_cancel_address() - self.test_send_message_to_addressbook() - self.test_delete_address_from_address_contact() - - -if __name__ == '__main__': - """Start Application""" - obj = AddressBook() - obj.setUpClass() - obj.test_all_address_book_method() diff --git a/src/bitmessagekivy/tests/test_allmail_message.py b/src/bitmessagekivy/tests/test_allmail_message.py index 8ded060a..71003a59 100644 --- a/src/bitmessagekivy/tests/test_allmail_message.py +++ b/src/bitmessagekivy/tests/test_allmail_message.py @@ -1,10 +1,12 @@ import time from bitmessagekivy.tests.telenium_process import TeleniumTestProcess +from .common import ordered class AllMailMessage(TeleniumTestProcess): """AllMail Screen Functionality Testing""" + @ordered def test_select_all_mails(self): """Show All Messages on Mail Screen/Window""" print("=====================Test -Show Messages Of Mail Screen=====================") @@ -13,7 +15,8 @@ class AllMailMessage(TeleniumTestProcess): time.sleep(4) self.cli.click_on('//NavigationItem[5]') time.sleep(4) - + + @ordered def test_delete_message_from_draft(self): """Delete Message From Message body of Mail Screen/Window""" print("=====================Test -Delete Messages Of Mail Screen=====================") @@ -22,11 +25,3 @@ class AllMailMessage(TeleniumTestProcess): time.sleep(5) self.cli.click_on('//MDToolbar/BoxLayout[2]/MDIconButton[1]') time.sleep(3) - - -if __name__ == '__main__': - """Start Application""" - obj = AllMailMessage() - obj.setUpClass() - obj.test_select_all_mails() - obj.test_delete_message_from_draft() diff --git a/src/bitmessagekivy/tests/test_create_random_address.py b/src/bitmessagekivy/tests/test_create_random_address.py index bf3f182d..f97b378c 100644 --- a/src/bitmessagekivy/tests/test_create_random_address.py +++ b/src/bitmessagekivy/tests/test_create_random_address.py @@ -1,13 +1,23 @@ import os import tempfile import time + +from bitmessagekivy.tests.telenium_process import TeleniumTestProcess, cleanup +from .common import ordered from random import choice from string import ascii_lowercase -from bitmessagekivy.tests.telenium_process import TeleniumTestProcess class CreateRandomAddress(TeleniumTestProcess): + @classmethod + def setUpClass(cls): + print('ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ', __file__) + os.environ["BITMESSAGE_HOME"] = tempfile.gettempdir() + cleanup() + super(TeleniumTestProcess, cls).setUpClass() + + @ordered def test_login_screen(self): """Clicking on Proceed Button to Proceed to Next Screen.""" print("=====================Test - Login Screen=====================") @@ -15,6 +25,7 @@ class CreateRandomAddress(TeleniumTestProcess): self.cli.wait_click('//Login/BoxLayout[0]/BoxLayout[0]/ScreenManager[0]/Screen[0]/BoxLayout[0]/AnchorLayout[3]/MDFillRoundFlatIconButton[0]') time.sleep(3) + @ordered def test_random_screen(self): """Creating New Adress For New User.""" print("=====================Test - Create New Address=====================") @@ -33,6 +44,7 @@ class CreateRandomAddress(TeleniumTestProcess): self.cli.wait_click('//RandomBoxlayout/BoxLayout[0]/AnchorLayout[2]/MDFillRoundFlatIconButton[0]') time.sleep(5) + @ordered def test_create_new_address(self): """Clicking on Navigation Drawer To Open New Address""" print("=====================Test - Create New Address=====================") @@ -44,7 +56,9 @@ class CreateRandomAddress(TeleniumTestProcess): self.cli.click_on('//NavigationItem[9]') time.sleep(4) self.cli.wait_click('//Login/BoxLayout[0]/BoxLayout[0]/ScreenManager[0]/Screen[0]/BoxLayout[0]/AnchorLayout[3]/MDFillRoundFlatIconButton[0]') + self.test_random_screen() + @ordered def test_select_address(self): """Select First Address From Drawer-Box""" print("=====================Test - Select First Address From Drawer-Box=======================") @@ -57,15 +71,3 @@ class CreateRandomAddress(TeleniumTestProcess): self.cli.click_on('//NavigationItem[0]') time.sleep(2) self.cli.click_on('//MySpinnerOption[0]') - - -if __name__ == '__main__': - """Start Application""" - obj = CreateRandomAddress() - obj.setUpClass(True) # this is for showing another process running error - obj.test_login_screen() - obj.test_random_screen() - obj.test_create_new_address() - obj.test_random_screen() - obj.test_select_address() - # obj.remove_temp_data() diff --git a/src/bitmessagekivy/tests/test_draft_message.py b/src/bitmessagekivy/tests/test_draft_message.py index b1a0cb52..c21497c7 100644 --- a/src/bitmessagekivy/tests/test_draft_message.py +++ b/src/bitmessagekivy/tests/test_draft_message.py @@ -1,10 +1,12 @@ import time from bitmessagekivy.tests.telenium_process import TeleniumTestProcess +from .common import ordered class DraftMessage(TeleniumTestProcess): """Draft Screen Functionality Testing""" + @ordered def test_select_draft_message(self): """Select A Draft Screen From Navigaion-Drawer-Box Then Send a drafted message """ @@ -49,6 +51,7 @@ class DraftMessage(TeleniumTestProcess): self.cli.click_on('//MDToolbar/BoxLayout[0]/MDIconButton[0]') time.sleep(4) + @ordered def test_edit_draft_messgae(self): """Select A Message From List of Messages Then make changes and send it.""" @@ -74,6 +77,7 @@ class DraftMessage(TeleniumTestProcess): self.cli.click_on('//MDIconButton[2]') time.sleep(5) + @ordered def test_delete_draft_message(self): """Delete A Message From List of Messages""" print("=====================Test - Delete A Message From List of Messages=====================") @@ -88,15 +92,15 @@ class DraftMessage(TeleniumTestProcess): self.cli.click_on('//MDToolbar/BoxLayout[2]/MDIconButton[1]') time.sleep(2) - def test_all_draft_method(self): - """Calling All The Methods Draft Class""" - self.test_select_draft_message() - self.test_edit_draft_messgae() - self.test_delete_draft_message() + # def test_all_draft_method(self): + # """Calling All The Methods Draft Class""" + # self.test_select_draft_message() + # self.test_edit_draft_messgae() + # self.test_delete_draft_message() -if __name__ == '__main__': - """Start Application""" - obj = DraftMessage() - obj.setUpClass() - obj.test_all_draft_method() +# if __name__ == '__main__': +# """Start Application""" +# obj = DraftMessage() +# obj.setUpClass() +# obj.test_all_draft_method() diff --git a/src/bitmessagekivy/tests/test_myaddress_screen.py b/src/bitmessagekivy/tests/test_myaddress_screen.py index b1d0db83..bf3cd9a9 100644 --- a/src/bitmessagekivy/tests/test_myaddress_screen.py +++ b/src/bitmessagekivy/tests/test_myaddress_screen.py @@ -1,10 +1,15 @@ import time +from bmconfigparser import BMConfigParser from bitmessagekivy.tests.telenium_process import TeleniumTestProcess +from .common import ordered + +data = BMConfigParser().addresses() class MyAddressScreen(TeleniumTestProcess): """MyAddress Screen Functionality Testing""" + @ordered def test_select_myaddress_list(self): """Select Address From List of Address""" print("=====================Test -Select Address From List of Address=====================") @@ -16,6 +21,7 @@ class MyAddressScreen(TeleniumTestProcess): self.cli.click_on('//NavigationItem[11]') time.sleep(4) + @ordered def test_show_Qrcode(self): """Show the Qr code of selected address""" print("=====================Test -Show QR code of selected address=====================") @@ -27,6 +33,7 @@ class MyAddressScreen(TeleniumTestProcess): self.cli.click_on('//MDToolbar/BoxLayout[0]/MDIconButton[0]') time.sleep(3) + @ordered def test_send_message_from(self): """Send Message From Send Message From Button""" print("=====================Test -Send Message From Send Message From Button=====================") @@ -47,12 +54,3 @@ class MyAddressScreen(TeleniumTestProcess): time.sleep(2) self.cli.click_on('//MDIconButton[2]') time.sleep(2) - - -if __name__ == '__main__': - """Start Application""" - obj = MyAddressScreen() - obj.setUpClass() - obj.test_select_myaddress_list() - obj.test_show_Qrcode() - obj.test_send_message_from() diff --git a/src/bitmessagekivy/tests/test_network_screen.py b/src/bitmessagekivy/tests/test_network_screen.py index 6e87eb96..1b3c27c5 100644 --- a/src/bitmessagekivy/tests/test_network_screen.py +++ b/src/bitmessagekivy/tests/test_network_screen.py @@ -19,8 +19,8 @@ class NetwrokStatusScreen(TeleniumTestProcess): time.sleep(4) -if __name__ == '__main__': - """Start Application""" - obj = NetwrokStatusScreen() - obj.setUpClass() - obj.test_network_status() +# if __name__ == '__main__': +# """Start Application""" +# obj = NetwrokStatusScreen() +# obj.setUpClass() +# obj.test_network_status() diff --git a/src/bitmessagekivy/tests/test_payment_subscription.py b/src/bitmessagekivy/tests/test_payment_subscription.py index 320733f0..6adb7548 100644 --- a/src/bitmessagekivy/tests/test_payment_subscription.py +++ b/src/bitmessagekivy/tests/test_payment_subscription.py @@ -26,8 +26,8 @@ class PaymentScreen(TeleniumTestProcess): time.sleep(2) -if __name__ == '__main__': - """Start Application""" - obj = PaymentScreen() - obj.setUpClass() - obj.test_select_subscripton() +# if __name__ == '__main__': +# """Start Application""" +# obj = PaymentScreen() +# obj.setUpClass() +# obj.test_select_subscripton() diff --git a/src/bitmessagekivy/tests/test_sent_message.py b/src/bitmessagekivy/tests/test_sent_message.py index 68562e6e..1658c7c7 100644 --- a/src/bitmessagekivy/tests/test_sent_message.py +++ b/src/bitmessagekivy/tests/test_sent_message.py @@ -6,15 +6,19 @@ import time from bitmessagekivy.tests.telenium_process import TeleniumTestProcess from bmconfigparser import BMConfigParser +from .common import ordered -data = [] +data = BMConfigParser().addresses() class SendMessage(TeleniumTestProcess): """Sent Screen Functionality Testing""" - def test_select_sent(self): - """Sending Message From Inbox Screen - opens a pop-up(screen)which send message from sender to reciever""" + @ordered + def test_send_message_to_same_address(self): + """ + Sending Message From Inbox Screen + opens a pop-up(screen)which send message from sender to reciever + """ print("=====================Test - Sending Message From Inbox Screen=====================") time.sleep(2) # self.cli.execute('app.root.ids.nav_drawer.set_state("toggle")') @@ -64,16 +68,19 @@ class SendMessage(TeleniumTestProcess): time.sleep(3) self.cli.click_on('//MDFlatButton[0]') time.sleep(3) - + + @ordered def test_sent_multiple_message(self): - """Sending Second Message From Inbox Screen - for testing the search and delete functionality for two messages on the screen""" + """ + Sending Second Message From Inbox Screen + for testing the search and delete functionality for two messages on the screen + """ print("=====================Test - Sending Message From Inbox Screen=====================") time.sleep(3) # self.cli.execute('app.root.ids.nav_drawer.set_state("toggle")') self.cli.execute('app.clickNavDrawer()') time.sleep(5) - self.cli.click_BMConfigParseron('//NavigationItem[1]') + self.cli.click_on('//NavigationItem[1]') time.sleep(3) self.cli.click_on('//Inbox/ComposerButton[0]/MDFloatingActionButton[0]') time.sleep(3) @@ -81,7 +88,6 @@ class SendMessage(TeleniumTestProcess): time.sleep(2) self.cli.click_on('//MyTextInput[0]') time.sleep(3) - data = BMConfigParser().addresses() self.cli.setattr('//DropDownWidget/ScrollView[0]/BoxLayout[0]/BoxLayout[1]/BoxLayout[0]/MyTextInput[0]', "text", data[0]) time.sleep(3) self.cli.setattr('//DropDownWidget/ScrollView[0]/BoxLayout[0]/MyMDTextField[0]', 'text', 'Second') @@ -98,14 +104,3 @@ class SendMessage(TeleniumTestProcess): time.sleep(3) self.cli.click_on('//NavigationItem[2]') time.sleep(3) - - -if __name__ == '__main__': - """Start Application""" - obj = SendMessage() - obj.setUpClass() - # obj.set_temp_data() - # import pdb;pdb.set_trace() - obj.test_select_sent() - obj.test_sent_multiple_message() - obj.remove_temp_data() diff --git a/src/bitmessagekivy/tests/test_setting_screen.py b/src/bitmessagekivy/tests/test_setting_screen.py index 4abd9366..4b6e383a 100644 --- a/src/bitmessagekivy/tests/test_setting_screen.py +++ b/src/bitmessagekivy/tests/test_setting_screen.py @@ -5,9 +5,9 @@ from bitmessagekivy.tests.telenium_process import TeleniumTestProcess class SettingScreen(TeleniumTestProcess): """Setting Screen Functionality Testing""" - @classmethod - def setUpClass(cls): - super(SettingScreen, cls).setUpClass() + # @classmethod + # def setUpClass(cls): + # super(SettingScreen, cls).setUpClass() def test_setting_screen(self): """Show Setting Screen""" @@ -20,10 +20,9 @@ class SettingScreen(TeleniumTestProcess): self.cli.click_on('//NavigationItem[7]') time.sleep(2) - -if __name__ == '__main__': - """Start Application""" - obj = SettingScreen() - obj.setUpClass() - obj.test_setting_screen() +# if __name__ == '__main__': +# """Start Application""" +# obj = SettingScreen() +# obj.setUpClass() +# obj.test_setting_screen() # obj.tearDownClass() diff --git a/src/bitmessagekivy/tests/test_tmp_db_setup.py b/src/bitmessagekivy/tests/test_tmp_db_setup.py deleted file mode 100644 index 409465e4..00000000 --- a/src/bitmessagekivy/tests/test_tmp_db_setup.py +++ /dev/null @@ -1,240 +0,0 @@ -""" -Common reusable code for tests and tests for pybitmessage process. -""" - -import os -import signal -import subprocess # nosec -import sys -import state -import tempfile -import time -import unittest - -import psutil - -from .common import cleanup, put_signal_file, skip_python3 - - -skip_python3() - - -class TestProcessProto(unittest.TestCase): - """Test case implementing common logic for external testing: - it starts pybitmessage in setUpClass() and stops it in tearDownClass() - """ - _process_cmd = ['pybitmessage', '-d'] - _threads_count_min = 15 - _threads_count_max = 16 - _threads_names = [ - 'PyBitmessage', - 'addressGenerato', - 'singleWorker', - 'SQL', - 'objectProcessor', - 'singleCleaner', - 'singleAPI', - 'Asyncore', - 'ReceiveQueue_0', - 'ReceiveQueue_1', - 'ReceiveQueue_2', - 'Announcer', - 'InvBroadcaster', - 'AddrBroadcaster', - 'Downloader', - 'Uploader' - ] - _files = ( - 'keys.dat', 'debug.log', 'messages.dat', 'knownnodes.dat', - '.api_started', 'unittest.lock' - ) - home = None - - @classmethod - def setUpClass(cls): - """Setup environment and start pybitmessage""" - print('setUpClass.........................................(pass)', state.appdata) - # print('os.environ["BITMESSAGE_HOME"](test_process file)57...........................', os.environ['BITMESSAGE_HOME']) - # import pdb;pdb.set_trace() - print(__file__, 'cls.home..................................', cls.home) - cls.flag = False - if not cls.home: - cls.home = tempfile.gettempdir() - cls._cleanup_files() - os.environ['BITMESSAGE_HOME'] = cls.home - # print("blabla {}".format(__file__)) - print('os.environ["BITMESSAGE_HOME"](test_process file)65...........................', os.environ['BITMESSAGE_HOME']) - put_signal_file(cls.home, 'unittest.lock') - starttime = int(time.time()) - 0.5 - cls.process = psutil.Popen( - cls._process_cmd, stderr=subprocess.STDOUT) # nosec - - pidfile = os.path.join(cls.home, 'singleton.lock') - for _ in range(10): - time.sleep(1) - try: - pstat = os.stat(pidfile) - if starttime <= pstat.st_mtime and pstat.st_size > 0: - break # the pidfile is suitable - except OSError: - continue - - try: - pid = int(cls._get_readline('singleton.lock')) - cls.process = psutil.Process(pid) - time.sleep(5) - except (psutil.NoSuchProcess, TypeError): - cls.flag = True - - def setUp(self): - print('setUp.........................................(pass)') - if self.flag: - self.fail("%s is not started ):" % self._process_cmd) - - @classmethod - def _get_readline(cls, pfile): - print('_get_readline.........................................(pass)') - pfile = os.path.join(cls.home, pfile) - try: - return open(pfile, 'rb').readline().strip() - except (OSError, IOError): - pass - - @classmethod - def _stop_process(cls, timeout=5): - print('_stop_process.........................................(pass)') - cls.process.send_signal(signal.SIGTERM) - try: - cls.process.wait(timeout) - except psutil.TimeoutExpired: - return False - return True - - @classmethod - def _kill_process(cls, timeout=5): - print('_kill_process.........................................') - try: - cls.process.send_signal(signal.SIGKILL) - cls.process.wait(timeout) - # Windows or already dead - except (AttributeError, psutil.NoSuchProcess): - return True - # except psutil.TimeoutExpired propagates, it means something is very - # wrong - return True - - @classmethod - def _cleanup_files(cls): - print('_cleanup_files.........................................(pass)') - cleanup(cls.home, cls._files) - - @classmethod - def tearDownClass(cls): - """Ensures that pybitmessage stopped and removes files""" - print('tearDownClass.........................................(pass)') - try: - if not cls._stop_process(10): - processes = cls.process.children(recursive=True) - processes.append(cls.process) - for p in processes: - try: - p.kill() - except psutil.NoSuchProcess: - pass - except psutil.NoSuchProcess: - pass - finally: - cls._cleanup_files() - - def _test_threads(self): - """Test number and names of threads""" - - # pylint: disable=invalid-name - print('_test_threads.........................................(pass)') - self.longMessage = True - - try: - # using ps for posix platforms - # because of https://github.com/giampaolo/psutil/issues/613 - thread_names = subprocess.check_output([ - "ps", "-L", "-o", "comm=", "--pid", - str(self.process.pid) - ]).split() - except: # pylint: disable=bare-except - thread_names = [] - - running_threads = len(thread_names) - if 0 < running_threads < 30: # adequacy check - extra_threads = [] - missing_threads = [] - for thread_name in thread_names: - if thread_name not in self._threads_names: - extra_threads.append(thread_name) - for thread_name in self._threads_names: - if thread_name not in thread_names: - missing_threads.append(thread_name) - - msg = "Missing threads: {}, Extra threads: {}".format( - ",".join(missing_threads), ",".join(extra_threads)) - else: - running_threads = self.process.num_threads() - if sys.platform.startswith('win'): - running_threads -= 1 # one extra thread on Windows! - msg = "Unexpected running thread count" - - self.assertGreaterEqual( - running_threads, - self._threads_count_min, - msg) - - self.assertLessEqual( - running_threads, - self._threads_count_max, - msg) - - -class TestProcessShutdown(TestProcessProto): - """Separate test case for SIGTERM""" - def test_shutdown(self): - """Send to pybitmessage SIGTERM and ensure it stopped""" - # longer wait time because it's not a benchmark - print('test_shutdown.........................................(pass)') - self.assertTrue( - self._stop_process(20), - '%s has not stopped in 20 sec' % ' '.join(self._process_cmd)) - - -# class TestProcess(TestProcessProto): -# """A test case for pybitmessage process""" -# def test_process_name(self): -# """Check PyBitmessage process name""" -# self.assertEqual(self.process.name(), 'PyBitmessage') - -# @unittest.skipIf(psutil.version_info < (4, 0), 'psutil is too old') -# def test_home(self): -# """Ensure BITMESSAGE_HOME is used by process""" -# print('test1......................', self.process.environ().get('BITMESSAGE_HOME')) -# print('test2......................', self.home) -# self.assertEqual( -# self.process.environ().get('BITMESSAGE_HOME'), self.home) - -# def test_listening(self): -# """Check that pybitmessage listens on port 8444""" -# for c in self.process.connections(): -# if c.status == 'LISTEN': -# self.assertEqual(c.laddr[1], 8444) -# break - -# def test_files(self): -# """Check existence of PyBitmessage files""" -# for pfile in self._files: -# if pfile.startswith('.'): -# continue -# self.assertIsNot( -# self._get_readline(pfile), None, -# 'Failed to read file %s' % pfile -# ) - -# def test_threads(self): -# """Testing PyBitmessage threads""" -# self._test_threads() diff --git a/src/bitmessagekivy/tests/test_trash_message.py b/src/bitmessagekivy/tests/test_trash_message.py index 0dacbd93..cbfd22c7 100644 --- a/src/bitmessagekivy/tests/test_trash_message.py +++ b/src/bitmessagekivy/tests/test_trash_message.py @@ -22,8 +22,8 @@ class TrashMessage(TeleniumTestProcess): time.sleep(4) -if __name__ == '__main__': - """Start Application""" - obj = TrashMessage() - obj.setUpClass() - obj.test_delete_trash_message() +# if __name__ == '__main__': +# """Start Application""" +# obj = TrashMessage() +# obj.setUpClass() +# obj.test_delete_trash_message() diff --git a/src/bitmessagemain_mock_test.py b/src/bitmessagemain_mock_test.py new file mode 100644 index 00000000..d7030116 --- /dev/null +++ b/src/bitmessagemain_mock_test.py @@ -0,0 +1,22 @@ +import state +from bitmessagekivy.mpybit import NavigateApp +from threads import addressGenerator, sqlThread + +def main(): + if state.enableObjProc: + print('....................................................line(8)(sqlThread)') + + # Start the address generation thread + addressGeneratorThread = addressGenerator() + # close the main program even if there are threads left + addressGeneratorThread.daemon = True + addressGeneratorThread.start() + + sqlLookup = sqlThread() + # DON'T close the main program even if there are threads left. + # The closeEvent should command this thread to exit gracefully. + sqlLookup.daemon = False + sqlLookup.start() + + state.kivyapp = NavigateApp() + state.kivyapp.run() diff --git a/src/main_mock_test.py b/src/main_mock_test.py new file mode 100644 index 00000000..edd9ef3f --- /dev/null +++ b/src/main_mock_test.py @@ -0,0 +1,9 @@ +"""This module is for thread start.""" +import state + +if __name__ == '__main__': + state.kivy = True + print("Kivy Loading......") + # from bitmessagemain import main + from bitmessagemain_mock_test import main + main()