Example #1
0
    def testBody(self, logger):
        try:
            self.srv = Server(os.path.join(self.test_root_path(), 'srv', 'config'), os.path.join(self.test_root_path(), 'srv', 'data'))
            self.cl0 = Server(os.path.join(self.test_root_path(), 'cl0', 'config'), os.path.join(self.test_root_path(), 'cl0', 'data'))
            self.cl1 = Server(os.path.join(self.test_root_path(), 'cl1', 'config'), os.path.join(self.test_root_path(), 'cl1', 'data'))
            self.cl2 = Server(os.path.join(self.test_root_path(), 'cl2', 'config'), os.path.join(self.test_root_path(), 'cl2', 'data'))

            srvid = self.srv.syncthingHandler.myId()
            cl0id = self.cl0.syncthingHandler.myId()
            cl1id = self.cl1.syncthingHandler.myId()
            cl2id = self.cl2.syncthingHandler.myId()

            fpath0s = os.path.join(self.test_root_path(), 'folder0_s')
            fpath1s = os.path.join(self.test_root_path(), 'folder1_s')
            fpath2s = os.path.join(self.test_root_path(), 'folder2_s')
            for fpath in (fpath0s, fpath1s, fpath2s):
                try:
                    os.makedirs(fpath)
                except OSError as e:
                    if e.errno != errno.EEXIST:
                        raise

            self.cl0.syncthingHandler.set_server_secret('wowsecret2').result()
            self.cl1.syncthingHandler.set_server_secret('wowsecret2').result()
            self.cl2.syncthingHandler.set_server_secret('wowsecret2').result()
            self.srv.syncthingHandler.set_server_secret('wowsecret2').result()

            self.srv.syncthingHandler.add_server(srvid).result()
            self.srv.syncthingHandler.add_device(cl0id).result()
            self.srv.syncthingHandler.add_device(cl1id).result()
            self.srv.syncthingHandler.add_device(cl2id).result()
            ###
            self.cl0.syncthingHandler.add_server(srvid).result()
            self.cl1.syncthingHandler.add_server(srvid).result()
            self.cl2.syncthingHandler.add_server(srvid).result()
            logger.print('srv cl0 cl1 cl2 initialized')

            fidA = self.srv.syncthingHandler.add_folder(fpath0s, 'folder_A', [cl0id]).result()
            fidB = self.srv.syncthingHandler.add_folder(fpath1s, 'folder_B', [cl1id]).result()
            fidC = self.srv.syncthingHandler.add_folder(fpath2s, 'folder_C', [cl2id]).result()
            logger.print('adding folders: folder_A<-cl0, folder_B<-cl1, folder_C<-cl2')

            for i in range(5):
                logger.print('starting iteration %d' % i)
                self.srv.start()
                self.cl0.start()
                self.cl1.start()
                self.cl2.start()
                logger.print('all servers/clients started')

                logger.print('waiting 10s')
                time.sleep(10)

                logger.print('filling folders with random data')
                s0 = 'f0 random information %s' % ''.join([random.choice(string.printable) for _ in range(16)])
                s1 = 'f1 randomer informationes %s' % ''.join([random.choice(string.printable) for _ in range(16)])
                s2 = 'f2 even randomer informationes %s' % ''.join([random.choice(string.printable) for _ in range(16)])
                with open(os.path.join(fpath0s, 'f0_test.txt'), 'w') as f:
                    f.write(s0)
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'w') as f:
                    f.write(s1)
                with open(os.path.join(fpath2s, 'f2_test.txt'), 'w') as f:
                    f.write(s2)

                logger.print('waiting for 25s')
                time.sleep(25)

                logger.print('checking data on clients')
                with open(os.path.join(fpath0s, 'f0_test.txt'), 'r') as f:
                    ss0 = f.read()
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'r') as f:
                    ss1 = f.read()
                with open(os.path.join(fpath2s, 'f2_test.txt'), 'r') as f:
                    ss2 = f.read()

                with open(os.path.join(self.test_root_path(), 'cl0', 'data', 'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(os.path.join(self.test_root_path(), 'cl1', 'data', 'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(), 'c1 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(os.path.join(self.test_root_path(), 'cl2', 'data', 'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(), 'c2 folder 2 contents mismatch. test failed. \n%s' % s2

                logger.print('removing cl0 from fA, cl1 from fB, cl2 from fC')
                self.srv.syncthingHandler.remove_device_from_folder(fidA, cl0id).result()
                self.srv.syncthingHandler.remove_device_from_folder(fidB, cl1id).result()
                self.srv.syncthingHandler.remove_device_from_folder(fidC, cl2id).result()

                logger.print('adding cl1 to fA, cl2 to fB, cl0 to fC')
                self.srv.syncthingHandler.add_device_to_folder(fidA, cl1id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidB, cl2id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidC, cl0id).result()

                logger.print('waiting 25s')
                time.sleep(25)

                logger.print('checking data on clients')
                assert not os.path.exists(os.path.join(self.test_root_path(), 'cl0', 'data', 'folder_A')), 'FolderA not deleted from cl0'
                assert not os.path.exists(os.path.join(self.test_root_path(), 'cl1', 'data', 'folder_B')), 'FolderB not deleted from cl1'
                assert not os.path.exists(os.path.join(self.test_root_path(), 'cl2', 'data', 'folder_C')), 'FolderC not deleted from cl2'

                with open(os.path.join(self.test_root_path(), 'cl1', 'data', 'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(), 'c1 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(os.path.join(self.test_root_path(), 'cl2', 'data', 'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(), 'c2 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(os.path.join(self.test_root_path(), 'cl0', 'data', 'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(), 'c3 folder 2 contents mismatch. test failed. \n%s' % s2

                logger.print('stopping servers/clients')
                self.cl0.stop()
                self.cl1.stop()
                self.cl2.stop()
                self.srv.stop()

                logger.print("EVERYTHING STOPPED! ITERATION %d DONE" % i)

                self.srv = Server(os.path.join(self.test_root_path(), 'srv', 'config'), os.path.join(self.test_root_path(), 'srv', 'data'))
                self.cl0 = Server(os.path.join(self.test_root_path(), 'cl0', 'config'), os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl1 = Server(os.path.join(self.test_root_path(), 'cl1', 'config'), os.path.join(self.test_root_path(), 'cl1', 'data'))
                self.cl2 = Server(os.path.join(self.test_root_path(), 'cl2', 'config'), os.path.join(self.test_root_path(), 'cl2', 'data'))

                self.srv.syncthingHandler.remove_device_from_folder(fidA, cl1id).result()
                self.srv.syncthingHandler.remove_device_from_folder(fidB, cl2id).result()
                self.srv.syncthingHandler.remove_device_from_folder(fidC, cl0id).result()

                self.srv.syncthingHandler.add_device_to_folder(fidA, cl0id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidB, cl1id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidC, cl2id).result()
        finally:
            try:
                self.cl0.stop()
            except:
                pass
            try:
                self.cl1.stop()
            except:
                pass
            try:
                self.cl2.stop()
            except:
                pass
            try:
                self.srv.stop()
            except:
                pass
Example #2
0
    def testBody(self, logger):
        try:
            self.srv0 = Server(
                os.path.join(self.test_root_path(), 'srv0', 'config'),
                os.path.join(self.test_root_path(), 'srv0', 'data'))
            self.srv1 = Server(
                os.path.join(self.test_root_path(), 'srv1', 'config'),
                os.path.join(self.test_root_path(), 'srv1', 'data'))
            self.cl0 = Server(
                os.path.join(self.test_root_path(), 'cl0', 'config'),
                os.path.join(self.test_root_path(), 'cl0', 'data'))
            self.cl1 = Server(
                os.path.join(self.test_root_path(), 'cl1', 'config'),
                os.path.join(self.test_root_path(), 'cl1', 'data'))

            fpath0s0 = os.path.join(self.test_root_path(), 'folder0_s0')
            fpath1s0 = os.path.join(self.test_root_path(), 'folder1_s0')
            fpath0s1 = os.path.join(self.test_root_path(), 'folder0_s1')
            fpath1s1 = os.path.join(self.test_root_path(), 'folder1_s1')
            for fpath in (fpath0s0, fpath1s0, fpath0s1, fpath1s1):
                try:
                    os.makedirs(fpath)
                except OSError as e:
                    if e.errno != errno.EEXIST:
                        raise

            self.cl0.syncthingHandler.set_server_secret('wowsecret').result()
            self.cl1.syncthingHandler.set_server_secret('wowsecret').result()
            self.srv0.syncthingHandler.set_server_secret('wowsecret').result()
            self.srv1.syncthingHandler.set_server_secret('wowsecret').result()

            self.srv0.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.srv0.syncthingHandler.add_server(
                self.srv1.syncthingHandler.myId()).result()
            self.srv1.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.srv1.syncthingHandler.add_server(
                self.srv1.syncthingHandler.myId()).result()

            self.srv0.syncthingHandler.add_device(
                self.cl0.syncthingHandler.myId()).result()
            self.srv0.syncthingHandler.add_device(
                self.cl1.syncthingHandler.myId()).result()
            self.cl0.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.cl1.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()

            self.srv0.add_project('testproject1')

            for i in range(3):
                logger.print('starting iteration %d' % i)
                self.srv0.start()
                self.srv1.start()
                self.cl0.start()
                self.cl1.start()
                logger.print('all servers started')

                logger.print('checking project manager for project')

                def _check0_():
                    assert len(
                        self.srv0.projectManagers
                    ) == 1, 'srv0 has %d projects instead of 1' % len(
                        self.srv0.projectManagers)
                    assert len(
                        self.srv1.projectManagers
                    ) == 1, 'srv1 has %d projects instead of 1' % len(
                        self.srv1.projectManagers)

                logger.check(_check0_, timeout=35, time_to_hold=10)

                srv0_pm = tuple(self.srv0.projectManagers.values())[0]
                srv1_pm = tuple(self.srv1.projectManagers.values())[0]
                assert srv0_pm.project_name(
                ) == 'testproject1', 'srv0 project name mismatch. got %s' % srv0_pm.project_name(
                )
                assert srv1_pm.project_name(
                ) == 'testproject1', 'srv1 project name mismatch. got %s' % srv1_pm.project_name(
                )
                srv0_shts = srv0_pm.get_shots().result()
                srv1_shts = srv1_pm.get_shots().result()
                assert len(
                    srv0_shts
                ) == 0, 'srv0 shotcount == %d, expected 0' % len(srv0_shts)
                assert len(
                    srv1_shts
                ) == 0, 'srv1 shotcount == %d, expected 0' % len(srv1_shts)

                logger.print('adding a test shot')
                srv0_pm.add_shot('first shot', 'firstshot_id',
                                 fpath0s0).result()
                logger.print('adding a user')
                srv1_pm.add_user('al.bob', 'Alice Bobovich', [
                    self.cl0.syncthingHandler.myId(),
                    self.cl1.syncthingHandler.myId()
                ], [('firstshot_id', 'main')]).result()

                s0 = 'f0 random information %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                with open(os.path.join(fpath0s0, 'f0_test.txt'), 'w') as f:
                    f.write(s0)
                with open(os.path.join(fpath0s0, 'f0_test.txt'), 'r') as f:
                    s0 = f.read()

                logger.print(
                    'checking if user exists and checking shot folder')

                def _check1_():
                    assert 'al.bob' in srv0_pm.get_users().result(
                    ), 'al.bob not in srv0'
                    assert 'al.bob' in srv1_pm.get_users().result(
                    ), 'al.bob not in srv1'

                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shot :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0
                    with open(
                            os.path.join(self.test_root_path(), 'cl0', 'data',
                                         'first shot :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c0 shot folder contents mismatch. test failed. \n%s' % s0
                    with open(
                            os.path.join(self.test_root_path(), 'cl1', 'data',
                                         'first shot :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c1 shot folder contents mismatch. test failed. \n%s' % s0

                logger.check(_check1_, timeout=35, time_to_hold=10)

                logger.print('removing shot')
                srv1_pm.remove_shot('firstshot_id').result()
                logger.print('checking the shot is removed')

                def _check2_():
                    assert os.path.exists(
                        fpath0s0
                    ), 'srv0 shotpath does not exists'  # servers do not delete folders from disc
                    assert os.path.exists(
                        os.path.join(self.test_root_path(), 'srv1', 'data',
                                     'first shot :main')
                    ), 'srv1 shotpath does not exists'  # servers do not delete folders from disc
                    assert not os.path.exists(
                        os.path.join(
                            self.test_root_path(), 'cl0', 'data',
                            'first shot :main')), 'cl0 shotpath still exists'
                    assert not os.path.exists(
                        os.path.join(
                            self.test_root_path(), 'cl1', 'data',
                            'first shot :main')), 'cl1 shotpath still exists'

                logger.check(_check2_, timeout=35, time_to_hold=10)

                logger.print('removing user')
                srv1_pm.remove_user('al.bob')

                logger.print('checking if user is gone')

                def _check3_():
                    assert len(srv0_pm.get_users().result()
                               ) == 0, 'srv0 has nonzero users'
                    assert len(srv1_pm.get_users().result()
                               ) == 0, 'srv1 has nonzero users'

                logger.check(_check3_, timeout=35, time_to_hold=10)

                logger.print('stopping all servers')
                self.cl0.stop()
                self.cl1.stop()
                self.srv0.stop()
                self.srv1.stop()

                logger.print("EVERYTHING STOPPED! ITERATION %d DONE" % i)

                self.srv0 = Server(
                    os.path.join(self.test_root_path(), 'srv0', 'config'),
                    os.path.join(self.test_root_path(), 'srv0', 'data'))
                self.srv1 = Server(
                    os.path.join(self.test_root_path(), 'srv1', 'config'),
                    os.path.join(self.test_root_path(), 'srv1', 'data'))
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl1 = Server(
                    os.path.join(self.test_root_path(), 'cl1', 'config'),
                    os.path.join(self.test_root_path(), 'cl1', 'data'))
        finally:
            try:
                self.cl0.stop()
            except:
                pass
            try:
                self.cl1.stop()
            except:
                pass
            try:
                self.srv0.stop()
            except:
                pass
            try:
                self.srv1.stop()
            except:
                pass
Example #3
0
    def testBody(self, logger):
        try:
            self.srv = Server(
                os.path.join(self.test_root_path(), 'srv', 'config'),
                os.path.join(self.test_root_path(), 'srv', 'data'))
            self.cl0 = Server(
                os.path.join(self.test_root_path(), 'cl0', 'config'),
                os.path.join(self.test_root_path(), 'cl0', 'data'))

            fpath0s = os.path.join(self.test_root_path(), 'folder0_s')
            fpath1s = os.path.join(self.test_root_path(), 'folder1_s')
            for fpath in (fpath0s, fpath1s):
                try:
                    os.makedirs(fpath)
                except OSError as e:
                    if e.errno != errno.EEXIST:
                        raise

            self.cl0.syncthingHandler.set_server_secret('wowsecret').result()
            self.srv.syncthingHandler.set_server_secret('wowsecret').result()

            self.srv.syncthingHandler.add_server(
                self.srv.syncthingHandler.myId()).result()
            self.srv.syncthingHandler.add_device(
                self.cl0.syncthingHandler.myId()).result()
            self.cl0.syncthingHandler.add_server(
                self.srv.syncthingHandler.myId()).result()

            fid0 = self.srv.syncthingHandler.add_folder(
                fpath0s, 'le folder 0',
                [self.cl0.syncthingHandler.myId()]).result()
            fid1 = self.srv.syncthingHandler.add_folder(
                fpath1s, 'la foldero 1',
                [self.cl0.syncthingHandler.myId()]).result()

            for i in range(3):
                logger.print('starting iteration %d' % i)
                logger.print('starting servers...')
                self.srv.start()
                self.cl0.start()

                logger.sleep(10)
                logger.print('filling folders f0 f1 with junk')
                s0 = 'f0 random information %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                s1 = 'f1 randomer informationes %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                with open(os.path.join(fpath0s, 'f0_test.txt'), 'w') as f:
                    f.write(s0)
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'w') as f:
                    f.write(s1)

                logger.sleep(15)

                logger.print('checking folders at cl0 side')
                with open(os.path.join(fpath0s, 'f0_test.txt'), 'r') as f:
                    ss0 = f.read()
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'r') as f:
                    ss1 = f.read()

                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'le folder 0', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'la foldero 1', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c0 folder 1 contents mismatch. test failed. \n%s' % s1

                logger.print(
                    'test 0, iter %d.\n    %s\n    %s\n----\n    %s\n    %s\n'
                    % (i, s0, ss0, s1, ss1))
                logger.print(
                    'stopping cl0 and removing then it from folder access')
                self.cl0.stop()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fid0, self.cl0.syncthingHandler.myId())

                logger.sleep(10)

                logger.print('starting cl0...')
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl0.start()

                logger.sleep(15)

                logger.print('checking folder access')
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'le folder 0')
                ), 'removed f 0 while client was down, but it is still here'
                assert os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'la foldero 1')
                ), 'removed f 0 while client was down, but f 1 is not in place'
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'la foldero 1', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c0 folder 1 contents mismatch. test failed. \n%s' % s1

                logger.print(
                    'stopping cl0 and removing then it from folder access')
                self.cl0.stop()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fid1, self.cl0.syncthingHandler.myId())

                logger.sleep(10)

                logger.print('starting cl0...')
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl0.start()

                logger.sleep(15)

                logger.print('checking folder access')
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'le folder 0')
                ), 'removed f 1 while client was down, but f 0 it is still here'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'la foldero 1')
                ), 'removed f 1 while client was down, but it is still here'

                with open(os.path.join(fpath0s, 'f0_test.txt'), 'r') as f:
                    ss00 = f.read()
                    assert ss00 == ss0, 'after folder deletion servers f0 content changed!\n%s\nvs\n%s\n' % (
                        ss00, ss0)
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'r') as f:
                    ss11 = f.read()
                    assert ss11 == ss1, 'after folder deletion servers f1 content changed!\n%s\nvs\n%s\n' % (
                        ss11, ss1)

                logger.print(
                    'stopping cl0 and then adding it to folder access')
                self.cl0.stop()
                self.srv.syncthingHandler.add_device_to_folder(
                    fid0, self.cl0.syncthingHandler.myId())

                logger.sleep(10)

                logger.print('starting cl0...')
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl0.start()

                logger.sleep(15)

                logger.print('checking folder access')
                assert os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'le folder 0')
                ), 'added f 0 while client was down, but it is not here'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'la foldero 1')
                ), 'added f 0 while client was down, but f 1 is here'
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'le folder 0', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0

                logger.print(
                    'stopping cl0 and then adding it to folder access')
                self.cl0.stop()
                self.srv.syncthingHandler.add_device_to_folder(
                    fid1, self.cl0.syncthingHandler.myId())

                logger.sleep(10)

                logger.print('starting cl0...')
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl0.start()

                logger.sleep(15)

                logger.print('checking folder access')
                assert os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'le folder 0')
                ), 'added f 1 while client was down, but f 0 it is not here'
                assert os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'la foldero 1')
                ), 'added f 1 while client was down, but it is not here'
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'le folder 0', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'la foldero 1', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c0 folder 1 contents mismatch. test failed. \n%s' % s1

                with open(os.path.join(fpath0s, 'f0_test.txt'), 'r') as f:
                    ss00 = f.read()
                    assert ss00 == ss0, 'after folder deletion servers f0 content changed!\n%s\nvs\n%s\n' % (
                        ss00, ss0)
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'r') as f:
                    ss11 = f.read()
                    assert ss11 == ss1, 'after folder deletion servers f1 content changed!\n%s\nvs\n%s\n' % (
                        ss11, ss1)

                logger.print('stopping all')
                self.cl0.stop()
                self.srv.stop()

                logger.print("EVERYTHING STOPPED! ITERATION %d DONE" % i)

                self.srv = Server(
                    os.path.join(self.test_root_path(), 'srv', 'config'),
                    os.path.join(self.test_root_path(), 'srv', 'data'))
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
        finally:
            try:
                self.cl0.stop()
            except:
                pass
            try:
                self.srv.stop()
            except:
                pass
Example #4
0
import sys
from PySide2.QtWidgets import QApplication

from lance.server import Server
from lance_gui.detailviewer import DetailViewer

if __name__ == '__main__':
    qapp = QApplication(sys.argv)
    wgt = DetailViewer()
    srv = Server('/tmp/lancetemp/cfg', '/tmp/lancetemp/data')
    wgt.set_server(srv)
    srv.start()
    wgt.show()
    res = qapp.exec_()
    srv.stop()
    sys.exit(res)
Example #5
0
    def runthread(self):
        try:

            self.srv = Server(
                os.path.join(self.test_root_path(), 'srv', 'config'),
                os.path.join(self.test_root_path(), 'srv', 'data'))
            self.cl0 = Server(
                os.path.join(self.test_root_path(), 'cl0', 'config'),
                os.path.join(self.test_root_path(), 'cl0', 'data'))
            self.cl1 = Server(
                os.path.join(self.test_root_path(), 'cl1', 'config'),
                os.path.join(self.test_root_path(), 'cl1', 'data'))
            self.cl2 = Server(
                os.path.join(self.test_root_path(), 'cl2', 'config'),
                os.path.join(self.test_root_path(), 'cl2', 'data'))

            srvid = self.srv.syncthingHandler.myId()
            cl0id = self.cl0.syncthingHandler.myId()
            cl1id = self.cl1.syncthingHandler.myId()
            cl2id = self.cl2.syncthingHandler.myId()

            fpath0s = os.path.join(self.test_root_path(), 'folder0_s')
            fpath1s = os.path.join(self.test_root_path(), 'folder1_s')
            fpath2s = os.path.join(self.test_root_path(), 'folder2_s')
            for fpath in (fpath0s, fpath1s, fpath2s):
                try:
                    os.makedirs(fpath)
                except OSError as e:
                    if e.errno != errno.EEXIST:
                        raise

            self.cl0.syncthingHandler.set_server_secret('wowsecret2').result()
            self.cl1.syncthingHandler.set_server_secret('wowsecret2').result()
            self.cl2.syncthingHandler.set_server_secret('wowsecret2').result()
            self.srv.syncthingHandler.set_server_secret('wowsecret2').result()

            self.srv.syncthingHandler.add_server(srvid).result()
            self.srv.syncthingHandler.add_device(cl0id).result()
            self.srv.syncthingHandler.add_device(cl1id).result()
            self.srv.syncthingHandler.add_device(cl2id).result()
            ###
            self.cl0.syncthingHandler.add_server(srvid).result()
            self.cl1.syncthingHandler.add_server(srvid).result()
            self.cl2.syncthingHandler.add_server(srvid).result()

            fidA = self.srv.syncthingHandler.add_folder(
                fpath0s, 'folder_A', [cl0id, cl1id]).result()
            fidB = self.srv.syncthingHandler.add_folder(
                fpath1s, 'folder_B', [cl1id, cl2id]).result()
            fidC = self.srv.syncthingHandler.add_folder(
                fpath2s, 'folder_C', [cl2id, cl0id]).result()

            for i in range(3):
                self.wgt0.set_server(
                    self.cl0
                )  # This particular part might be not quite threadsafe,
                self.srv.start()
                self.cl0.start()
                self.cl1.start()
                self.cl2.start()

                time.sleep(10)
                s0 = 'f0 random information %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                s1 = 'f1 randomer informationes %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                s2 = 'f2 even randomer informationes %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                with open(os.path.join(fpath0s, 'f0_test.txt'), 'w') as f:
                    f.write(s0)
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'w') as f:
                    f.write(s1)
                with open(os.path.join(fpath2s, 'f2_test.txt'), 'w') as f:
                    f.write(s2)

                time.sleep(15)

                with open(os.path.join(fpath0s, 'f0_test.txt'), 'r') as f:
                    ss0 = f.read()
                with open(os.path.join(fpath1s, 'f1_test.txt'), 'r') as f:
                    ss1 = f.read()
                with open(os.path.join(fpath2s, 'f2_test.txt'), 'r') as f:
                    ss2 = f.read()

                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c1 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c1 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c2 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c2 folder 2 contents mismatch. test failed. \n%s' % s2
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c0 folder 2 contents mismatch. test failed. \n%s' % s2

                self.srv.syncthingHandler.remove_device_from_folder(
                    fidA, cl1id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidB, cl2id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidC, cl0id).result()

                self.srv.syncthingHandler.add_device_to_folder(fidA,
                                                               cl2id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidB,
                                                               cl0id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidC,
                                                               cl1id).result()

                time.sleep(15)

                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl1', 'data',
                                 'folder_A')), 'FolderA not deleted from cl1'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl2', 'data',
                                 'folder_B')), 'FolderB not deleted from cl2'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'folder_C')), 'FolderC not deleted from cl0'

                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c0 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c2 folder 0 contents mismatch. test failed. \n%s' % s0

                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c1 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c0 folder 1 contents mismatch. test failed. \n%s' % s1

                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c2 folder 2 contents mismatch. test failed. \n%s' % s2
                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c1 folder 2 contents mismatch. test failed. \n%s' % s2

                self.srv.syncthingHandler.remove_device_from_folder(
                    fidA, cl0id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidB, cl1id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidC, cl2id).result()

                self.srv.syncthingHandler.add_device_to_folder(fidA,
                                                               cl1id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidB,
                                                               cl2id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidC,
                                                               cl0id).result()

                time.sleep(15)

                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl0', 'data',
                                 'folder_A')), 'FolderA not deleted from cl0'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl1', 'data',
                                 'folder_B')), 'FolderB not deleted from cl1'
                assert not os.path.exists(
                    os.path.join(self.test_root_path(), 'cl2', 'data',
                                 'folder_C')), 'FolderC not deleted from cl2'

                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c1 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_A', 'f0_test.txt'), 'r') as f:
                    assert ss0 == f.read(
                    ), 'c2 folder 0 contents mismatch. test failed. \n%s' % s0
                with open(
                        os.path.join(self.test_root_path(), 'cl2', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c2 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_B', 'f1_test.txt'), 'r') as f:
                    assert ss1 == f.read(
                    ), 'c0 folder 1 contents mismatch. test failed. \n%s' % s1
                with open(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c0 folder 2 contents mismatch. test failed. \n%s' % s2
                with open(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'folder_C', 'f2_test.txt'), 'r') as f:
                    assert ss2 == f.read(
                    ), 'c1 folder 2 contents mismatch. test failed. \n%s' % s2

                self.cl0.stop()
                self.cl1.stop()
                self.cl2.stop()
                self.srv.stop()

                print("EVERYTHING STOPPED! ITERATION %d DONE" % i)

                self.srv = Server(
                    os.path.join(self.test_root_path(), 'srv', 'config'),
                    os.path.join(self.test_root_path(), 'srv', 'data'))
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl1 = Server(
                    os.path.join(self.test_root_path(), 'cl1', 'config'),
                    os.path.join(self.test_root_path(), 'cl1', 'data'))
                self.cl2 = Server(
                    os.path.join(self.test_root_path(), 'cl2', 'config'),
                    os.path.join(self.test_root_path(), 'cl2', 'data'))

                self.srv.syncthingHandler.remove_device_from_folder(
                    fidA, cl2id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidB, cl0id).result()
                self.srv.syncthingHandler.remove_device_from_folder(
                    fidC, cl1id).result()

                self.srv.syncthingHandler.add_device_to_folder(fidA,
                                                               cl0id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidB,
                                                               cl1id).result()
                self.srv.syncthingHandler.add_device_to_folder(fidC,
                                                               cl2id).result()
        except Exception as e:
            self.error = e
            self.qapp.quit()
        finally:
            if isinstance(self.wgt0, DetailViewer):
                self.wgt0.close()
            try:
                self.cl0.stop()
            except:
                pass
            try:
                self.cl1.stop()
            except:
                pass
            try:
                self.cl2.stop()
            except:
                pass
            try:
                self.srv.stop()
            except:
                pass
Example #6
0
    def testBody(self, logger):
        try:
            self.srv0 = Server(
                os.path.join(self.test_root_path(), 'srv0', 'config'),
                os.path.join(self.test_root_path(), 'srv0', 'data'))
            self.srv1 = Server(
                os.path.join(self.test_root_path(), 'srv1', 'config'),
                os.path.join(self.test_root_path(), 'srv1', 'data'))
            self.cl0 = Server(
                os.path.join(self.test_root_path(), 'cl0', 'config'),
                os.path.join(self.test_root_path(), 'cl0', 'data'))
            self.cl1 = Server(
                os.path.join(self.test_root_path(), 'cl1', 'config'),
                os.path.join(self.test_root_path(), 'cl1', 'data'))

            fpath0s0 = os.path.join(self.test_root_path(), 'folder0_s0')
            fpath1s0 = os.path.join(self.test_root_path(), 'folder1_s0')
            fpath0s1 = os.path.join(self.test_root_path(), 'folder0_s1')
            fpath1s1 = os.path.join(self.test_root_path(), 'folder1_s1')
            for fpath in (fpath0s0, fpath1s0, fpath0s1, fpath1s1):
                try:
                    os.makedirs(fpath)
                except OSError as e:
                    if e.errno != errno.EEXIST:
                        raise

            self.cl0.syncthingHandler.set_server_secret('wowsecret').result()
            self.cl1.syncthingHandler.set_server_secret('wowsecret').result()
            self.srv0.syncthingHandler.set_server_secret('wowsecret').result()
            self.srv1.syncthingHandler.set_server_secret('wowsecret').result()

            self.srv0.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.srv0.syncthingHandler.add_server(
                self.srv1.syncthingHandler.myId()).result()
            self.srv1.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.srv1.syncthingHandler.add_server(
                self.srv1.syncthingHandler.myId()).result()

            #self.srv0.syncthingHandler.add_device(self.cl0.syncthingHandler.myId()).result()
            #self.srv0.syncthingHandler.add_device(self.cl1.syncthingHandler.myId()).result()
            self.cl0.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()
            self.cl1.syncthingHandler.add_server(
                self.srv0.syncthingHandler.myId()).result()

            self.srv0.add_project('testproject1')

            for i in range(5):
                logger.print('starting iteration %d' % i)
                self.srv0.start()
                self.srv1.start()
                self.cl0.start()
                self.cl1.start()
                logger.print('all servers started')

                logger.print('checking project manager for project')

                def _check0_():
                    assert len(
                        self.srv0.projectManagers
                    ) == 1, 'srv0 has %d projects instead of 1' % len(
                        self.srv0.projectManagers)
                    assert len(
                        self.srv1.projectManagers
                    ) == 1, 'srv1 has %d projects instead of 1' % len(
                        self.srv1.projectManagers)
                    assert os.path.exists(
                        os.path.join(self.test_root_path(), 'srv0', 'data',
                                     'project_testproject1_configuration',
                                     'config.cfg')
                    ), 'srv0 init project configuration is missing'
                    assert os.path.exists(
                        os.path.join(self.test_root_path(), 'srv1', 'data',
                                     'project testproject1 configuration',
                                     'config.cfg')
                    ), 'srv1 init project configuration is missing'

                logger.check(_check0_, timeout=300, time_to_hold=30)

                srv0_pm = tuple(self.srv0.projectManagers.values())[0]
                srv1_pm = tuple(self.srv1.projectManagers.values())[0]
                assert srv0_pm.project_name(
                ) == 'testproject1', 'srv0 project name mismatch. got %s' % srv0_pm.project_name(
                )
                assert srv1_pm.project_name(
                ) == 'testproject1', 'srv1 project name mismatch. got %s' % srv1_pm.project_name(
                )
                srv0_shts = srv0_pm.get_shots().result()
                srv1_shts = srv1_pm.get_shots().result()
                assert len(
                    srv0_shts
                ) == 0, 'srv0 shotcount == %d, expected 0' % len(srv0_shts)
                assert len(
                    srv1_shts
                ) == 0, 'srv1 shotcount == %d, expected 0' % len(srv1_shts)

                logger.print('adding a test shotid')
                srv0_pm.add_shot('first shotid', 'firstshot_id',
                                 fpath0s0).result()
                logger.print('adding a user')
                srv1_pm.add_user('al.bob', 'Alice Bobovich', [],
                                 [('firstshot_id', 'main')]).result()

                s0 = 'f0 random information %s' % ''.join(
                    [random.choice(string.printable) for _ in range(16)])
                with open(os.path.join(fpath0s0, 'f0_test.txt'), 'w') as f:
                    f.write(s0)
                with open(os.path.join(fpath0s0, 'f0_test.txt'), 'r') as f:
                    s0 = f.read()

                logger.print(
                    'checking if user exists and checking shotid folder')

                def _check1_():
                    """
                    checking for user and shotid exist
                    """
                    assert 'al.bob' in srv0_pm.get_users().result(
                    ), 'al.bob not in srv0'
                    assert 'al.bob' in srv1_pm.get_users().result(
                    ), 'al.bob not in srv1'
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'first shotid :main')), 'cl0 has shotid!'
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'first shotid :main')), 'cl1 has shotid!'
                    assert 'firstshot_id' in srv0_pm.get_shots().result()
                    assert 'firstshot_id' in srv1_pm.get_shots().result()

                def _check1a_():
                    """
                    checking for shotid data sync
                    """
                    _check1_()
                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0

                logger.check(_check1_, timeout=300)
                logger.check(_check1a_, timeout=300, time_to_hold=30)

                logger.print('adding cl0 to user devices')
                srv0_pm.add_devices_to_user('al.bob',
                                            self.cl0.syncthingHandler.myId())

                def _check2_():
                    """
                    checking cl0 has the shotid
                    """
                    assert 'al.bob' in srv0_pm.get_users().result(
                    ), 'al.bob not in srv0'
                    assert 'al.bob' in srv1_pm.get_users().result(
                    ), 'al.bob not in srv1'
                    assert 'firstshot_id' in srv0_pm.get_shots().result()
                    assert 'firstshot_id' in srv1_pm.get_shots().result()
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'first shotid :main')), 'cl1 has shotid!'
                    assert os.path.exists(
                        os.path.join(
                            self.test_root_path(), 'cl0', 'data',
                            'first shotid :main')), 'cl0 does not have shotid!'

                def _check2a_():
                    """
                    checking for data sync
                    """
                    _check2_()
                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0
                    with open(
                            os.path.join(self.test_root_path(), 'cl0', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c0 shotid folder contents mismatch. test failed. \n%s' % s0

                logger.check(_check2_, timeout=300)
                logger.check(_check2a_, timeout=300, time_to_hold=30)

                logger.print('adding cl1 to user devices')
                srv1_pm.add_devices_to_user('al.bob',
                                            self.cl1.syncthingHandler.myId())

                def _check3_():
                    assert 'al.bob' in srv0_pm.get_users().result(
                    ), 'al.bob not in srv0'
                    assert 'al.bob' in srv1_pm.get_users().result(
                    ), 'al.bob not in srv1'

                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0
                    with open(
                            os.path.join(self.test_root_path(), 'cl0', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c0 shotid folder contents mismatch. test failed. \n%s' % s0
                    with open(
                            os.path.join(self.test_root_path(), 'cl1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c1 shotid folder contents mismatch. test failed. \n%s' % s0
                    assert 'firstshot_id' in srv0_pm.get_shots().result()
                    assert 'firstshot_id' in srv1_pm.get_shots().result()

                logger.check(_check3_, timeout=300, time_to_hold=30)

                logger.print('removing cl0 from user devices')
                srv1_pm.remove_devices_from_user(
                    'al.bob', self.cl0.syncthingHandler.myId())

                def _check4_():
                    srv0users = srv0_pm.get_users().result()
                    srv1users = srv1_pm.get_users().result()
                    cl0id = self.cl0.syncthingHandler.myId()
                    assert 'al.bob' in srv0users, 'al.bob not in srv0'
                    assert 'al.bob' in srv1users, 'al.bob not in srv1'
                    assert cl0id not in srv0users['al.bob'].device_ids()
                    assert cl0id not in srv1users['al.bob'].device_ids()

                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'first shotid :main')), 'cl0 has shotid!'
                    with open(
                            os.path.join(self.test_root_path(), 'cl1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'c1 shotid folder contents mismatch. test failed. \n%s' % s0
                    assert 'firstshot_id' in srv0_pm.get_shots().result()
                    assert 'firstshot_id' in srv1_pm.get_shots().result()

                logger.check(_check4_, timeout=300, time_to_hold=40)

                logger.print('removing cl1 from user devices')
                srv0_pm.remove_devices_from_user(
                    'al.bob', self.cl1.syncthingHandler.myId())

                def _check5_():
                    srv0users = srv0_pm.get_users().result()
                    srv1users = srv1_pm.get_users().result()
                    cl1id = self.cl1.syncthingHandler.myId()
                    assert 'al.bob' in srv0users, 'al.bob not in srv0'
                    assert 'al.bob' in srv1users, 'al.bob not in srv1'
                    assert cl1id not in srv0users['al.bob'].device_ids()
                    assert cl1id not in srv1users['al.bob'].device_ids()

                    with open(
                            os.path.join(self.test_root_path(), 'srv1', 'data',
                                         'first shotid :main', 'f0_test.txt'),
                            'r') as f:
                        assert s0 == f.read(
                        ), 'srv1 folder 0 contents mismatch. test failed. \n%s' % s0
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl0', 'data',
                                     'first shotid :main')), 'cl0 has shotid!'
                    assert not os.path.exists(
                        os.path.join(self.test_root_path(), 'cl1', 'data',
                                     'first shotid :main')), 'cl1 has shotid!'
                    assert 'firstshot_id' in srv0_pm.get_shots().result()
                    assert 'firstshot_id' in srv1_pm.get_shots().result()

                logger.check(_check5_, timeout=300, time_to_hold=40)

                logger.print('removing shotid')
                srv1_pm.remove_shot('firstshot_id').result()
                logger.print('checking the shotid is removed')

                def _check6_():
                    assert os.path.exists(
                        fpath0s0
                    ), 'srv0 shotpath does not exists'  # servers do not delete folders from disc
                    assert os.path.exists(
                        os.path.join(self.test_root_path(), 'srv1', 'data',
                                     'first shotid :main')
                    ), 'srv1 shotpath does not exists'  # servers do not delete folders from disc
                    #assert len([x for x in os.listdir(os.path.join(self.test_root_path(), 'srv0', 'data', 'server', 'configuration', 'folders')) if 'firstshot' in x]) == 0, 'firstshot is still in srv0 config'
                    #assert len([x for x in os.listdir(os.path.join(self.test_root_path(), 'srv1', 'data', 'server', 'configuration', 'folders')) if 'firstshot' in x]) == 0, 'firstshot is still in srv1 config'
                    assert not os.path.exists(
                        os.path.join(
                            self.test_root_path(), 'cl0', 'data',
                            'first shotid :main')), 'cl0 shotpath still exists'
                    assert not os.path.exists(
                        os.path.join(
                            self.test_root_path(), 'cl1', 'data',
                            'first shotid :main')), 'cl1 shotpath still exists'
                    assert 'firstshot_id' not in srv0_pm.get_shots().result()
                    assert 'firstshot_id' not in srv1_pm.get_shots().result()

                logger.check(_check6_, timeout=300, time_to_hold=20)

                logger.print('removing user')
                srv1_pm.remove_user('al.bob')

                logger.print('checking if user is gone')

                def _check7_():
                    assert len(srv0_pm.get_users().result()
                               ) == 0, 'srv0 has nonzero users'
                    assert len(srv1_pm.get_users().result()
                               ) == 0, 'srv1 has nonzero users'

                logger.check(_check7_, timeout=300, time_to_hold=30)

                logger.print('stopping all servers')
                self.cl0.stop()
                self.cl1.stop()
                self.srv0.stop()
                self.srv1.stop()

                logger.print("EVERYTHING STOPPED! ITERATION %d DONE" % i)

                self.srv0 = Server(
                    os.path.join(self.test_root_path(), 'srv0', 'config'),
                    os.path.join(self.test_root_path(), 'srv0', 'data'))
                self.srv1 = Server(
                    os.path.join(self.test_root_path(), 'srv1', 'config'),
                    os.path.join(self.test_root_path(), 'srv1', 'data'))
                self.cl0 = Server(
                    os.path.join(self.test_root_path(), 'cl0', 'config'),
                    os.path.join(self.test_root_path(), 'cl0', 'data'))
                self.cl1 = Server(
                    os.path.join(self.test_root_path(), 'cl1', 'config'),
                    os.path.join(self.test_root_path(), 'cl1', 'data'))
        finally:
            try:
                self.cl0.stop()
            except:
                pass
            try:
                self.cl1.stop()
            except:
                pass
            try:
                self.srv0.stop()
            except:
                pass
            try:
                self.srv1.stop()
            except:
                pass