예제 #1
0
 def test_properties_override(self):
     BiomajConfig.load_config(self.utils.global_properties,
                              allow_user_config=False)
     config = BiomajConfig('local')
     ldap_host = config.get('ldap.host')
     self.assertTrue(ldap_host == 'localhost')
     os.environ['BIOMAJ_LDAP_HOST'] = 'someserver'
     ldap_host = config.get('ldap.host')
     self.assertTrue(ldap_host == 'someserver')
예제 #2
0
 def tearDown(self):
     # Delete lock files
     for bank_name in self.BANKS:
         config = BiomajConfig(bank_name)
         data_dir = config.get('data.dir')
         lock_file = os.path.join(data_dir, 'local.lock')
         if os.path.exists(lock_file):
             os.remove(lock_file)
     self.utils.clean()
예제 #3
0
    def setUp(self):
        self.utils = UtilsForTest()
        BiomajConfig.load_config(self.utils.global_properties,
                                 allow_user_config=False)

        # Clean banks used in tests
        for bank_name in self.BANKS:
            # Delete all releases
            b = Bank(bank_name)
            b.banks.remove({})
            # Delete lock files
            config = BiomajConfig(bank_name)
            data_dir = config.get('data.dir')
            lock_file = os.path.join(data_dir, 'local.lock')
            if os.path.exists(lock_file):
                os.remove(lock_file)
예제 #4
0
class TestBiomajSetup(unittest.TestCase):
    def setUp(self):
        self.utils = UtilsForTest()
        curdir = os.path.dirname(os.path.realpath(__file__))
        BiomajConfig.load_config(self.utils.global_properties,
                                 allow_user_config=False)

        # Delete all banks
        b = Bank('alu')
        b.banks.remove({})

        self.config = BiomajConfig('alu')
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'alu.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)

    def tearDown(self):
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'alu.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)
        self.utils.clean()

    def test_new_bank(self):
        """
    Checks bank init
    """
        b = Bank('alu')

    def test_new_session(self):
        """
    Checks an empty session is created
    """
        b = Bank('alu')
        b.load_session(UpdateWorkflow.FLOW)
        for key in b.session._session['status'].keys():
            self.assertFalse(b.session.get_status(key))

    def test_session_reload_notover(self):
        """
    Checks a session is used if present
    """
        b = Bank('alu')
        for i in range(1, 5):
            s = Session('alu', self.config, UpdateWorkflow.FLOW)
            s._session['status'][Workflow.FLOW_INIT] = True
            b.session = s
            b.save_session()

        b = Bank('alu')
        b.load_session(UpdateWorkflow.FLOW)
        self.assertTrue(b.session.get_status(Workflow.FLOW_INIT))

    def test_clean_old_sessions(self):
        """
    Checks a session is used if present
    """
        b = Bank('local')
        for i in range(1, 5):
            s = Session('alu', self.config, UpdateWorkflow.FLOW)
            s._session['status'][Workflow.FLOW_INIT] = True
            b.session = s
            b.save_session()
        b2 = Bank('local')
        b2.update()
        b2.clean_old_sessions()
        self.assertTrue(len(b2.bank['sessions']) == 1)

    def test_session_reload_over(self):
        """
    Checks a session if is not over
    """
        b = Bank('alu')
        for i in range(1, 5):
            s = Session('alu', self.config, UpdateWorkflow.FLOW)
            s._session['status'][Workflow.FLOW_INIT] = True
            s._session['status'][Workflow.FLOW_OVER] = True
            b.session = s
            b.save_session()

        b = Bank('alu')
        b.load_session(UpdateWorkflow.FLOW)
        self.assertFalse(b.session.get_status(Workflow.FLOW_INIT))

    def test_bank_list(self):
        b1 = Bank('alu')
        b2 = Bank('local')
        banks = Bank.list()
        self.assertTrue(len(banks) == 2)

    @attr('test')
    @attr('network')
    def test_get_release(self):
        """
    Get release
    """
        b = Bank('alu')
        b.load_session(UpdateWorkflow.FLOW)
        res = b.update()
        self.assertTrue(b.session.get('update'))
        self.assertTrue(res)
        self.assertTrue(b.session._session['release'] is not None)

    @attr('network')
    def test_remove_session(self):
        b = Bank('alu')
        for i in range(1, 5):
            s = Session('alu', self.config, UpdateWorkflow.FLOW)
            s._session['status'][Workflow.FLOW_INIT] = True
            b.session = s
            b.save_session()
        self.assertTrue(len(b.bank['sessions']) == 4)
        b.remove_session(b.session.get('id'))
        self.assertTrue(len(b.bank['sessions']) == 3)

    @attr('process')
    def test_postprocesses_setup(self):
        b = Bank('localprocess')
        pfactory = PostProcessFactory(b)
        pfactory.run(True)
        self.assertTrue(len(pfactory.threads_tasks[0]) == 2)
        self.assertTrue(len(pfactory.threads_tasks[1]) == 1)

    @attr('process')
    def test_postprocesses_exec_again(self):
        """
    Execute once, set a status to false, check that False processes are executed
    """
        b = Bank('localprocess')
        pfactory = PostProcessFactory(b)
        pfactory.run()
        self.assertTrue(pfactory.blocks['BLOCK1']['META0']['PROC0'])
        self.assertTrue(pfactory.blocks['BLOCK2']['META1']['PROC1'])
        self.assertTrue(pfactory.blocks['BLOCK2']['META1']['PROC2'])
        blocks = copy.deepcopy(pfactory.blocks)
        blocks['BLOCK2']['META1']['PROC2'] = False
        pfactory2 = PostProcessFactory(b, blocks)
        pfactory2.run()
        self.assertTrue(pfactory2.blocks['BLOCK2']['META1']['PROC2'])

    @attr('process')
    def test_preprocesses(self):
        b = Bank('localprocess')
        pfactory = PreProcessFactory(b)
        pfactory.run()
        self.assertTrue(pfactory.meta_status['META0']['PROC0'])

    @attr('process')
    def test_removeprocesses(self):
        b = Bank('localprocess')
        pfactory = RemoveProcessFactory(b)
        pfactory.run()
        self.assertTrue(pfactory.meta_status['META0']['PROC0'])

    def test_dependencies_list(self):
        b = Bank('computed')
        deps = b.get_dependencies()
        self.assertTrue(len(deps) == 2)
예제 #5
0
class TestBiomajHTTPDownload(unittest.TestCase):
    """
  Test HTTP downloader
  """
    def setUp(self):
        self.utils = UtilsForTest()
        BiomajConfig.load_config(self.utils.global_properties,
                                 allow_user_config=False)
        self.config = BiomajConfig('testhttp')
        self.http_parse = HTTPParse(
            self.config.get('http.parse.dir.line'),
            self.config.get('http.parse.file.line'),
            int(self.config.get('http.group.dir.name')),
            int(self.config.get('http.group.dir.date')),
            int(self.config.get('http.group.file.name')),
            int(self.config.get('http.group.file.date')),
            self.config.get('http.group.file.date_format', None),
            int(self.config.get('http.group.file.size')))

    def tearDown(self):
        self.utils.clean()

    def test_http_list(self):
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/dists/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        httpd.close()
        self.assertTrue(len(file_list) == 1)

    def test_http_list_dateregexp(self):
        #self.http_parse.file_date_format = "%%d-%%b-%%Y %%H:%%M"
        self.http_parse.file_date_format = "%%Y-%%m-%%d %%H:%%M"
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/dists/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        httpd.close()
        self.assertTrue(len(file_list) == 1)

    def test_http_download_no_size(self):
        self.http_parse = HTTPParse(
            self.config.get('http.parse.dir.line'),
            self.config.get('http.parse.file.line'),
            int(self.config.get('http.group.dir.name')),
            int(self.config.get('http.group.dir.date')),
            int(self.config.get('http.group.file.name')),
            int(self.config.get('http.group.file.date')),
            self.config.get('http.group.file.date_format', None), -1)
        self.http_parse.file_date_format = "%%Y-%%m-%%d %%H:%%M"
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/dists/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        httpd.match([r'^README$'], file_list, dir_list)
        httpd.download(self.utils.data_dir)
        httpd.close()
        self.assertTrue(len(httpd.files_to_download) == 1)

    def test_http_download_no_date(self):
        self.http_parse = HTTPParse(
            self.config.get('http.parse.dir.line'),
            self.config.get('http.parse.file.line'),
            int(self.config.get('http.group.dir.name')),
            int(self.config.get('http.group.dir.date')),
            int(self.config.get('http.group.file.name')), -1,
            self.config.get('http.group.file.date_format', None),
            int(self.config.get('http.group.file.size')))
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/dists/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        httpd.match([r'^README$'], file_list, dir_list)
        httpd.download(self.utils.data_dir)
        httpd.close()
        self.assertTrue(len(httpd.files_to_download) == 1)

    def test_http_download(self):
        self.http_parse.file_date_format = "%%Y-%%m-%%d %%H:%%M"
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/dists/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        print(str(file_list))
        httpd.match([r'^README$'], file_list, dir_list)
        httpd.download(self.utils.data_dir)
        httpd.close()
        self.assertTrue(len(httpd.files_to_download) == 1)

    def test_http_download_in_subdir(self):
        self.http_parse.file_date_format = "%%Y-%%m-%%d %%H:%%M"
        httpd = CurlDownload('http', 'ftp2.fr.debian.org', '/debian/',
                             self.http_parse)
        (file_list, dir_list) = httpd.list()
        httpd.match([r'^dists/README$'], file_list, dir_list)
        httpd.download(self.utils.data_dir)
        httpd.close()
        self.assertTrue(len(httpd.files_to_download) == 1)
예제 #6
0
class TestElastic(unittest.TestCase):
    """
    test indexing and search
    """
    def setUp(self):
        BmajIndex.es = None
        self.utils = UtilsForTest()
        curdir = os.path.dirname(os.path.realpath(__file__))
        BiomajConfig.load_config(self.utils.global_properties,
                                 allow_user_config=False)
        if BmajIndex.do_index == False:
            self.skipTest(
                "Skipping indexing tests due to elasticsearch not available")
        # Delete all banks
        b = Bank('local')
        b.banks.remove({})
        BmajIndex.delete_all_bank('local')

        self.config = BiomajConfig('local')
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'local.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)

    def tearDown(self):
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'local.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)
        self.utils.clean()
        BmajIndex.delete_all_bank('test')

    def test_index(self):
        BmajIndex.do_index = True
        prod = {
            "data_dir": "/tmp/test/data",
            "formats": {
                "fasta": [{
                    "files": ["fasta/chr1.fa", "fasta/chr2.fa"],
                    "types": ["nucleic"],
                    "tags": {
                        "organism": "hg19"
                    }
                }],
                "blast": [{
                    "files": ["blast/chr1/chr1db"],
                    "types": ["nucleic"],
                    "tags": {
                        "chr": "chr1",
                        "organism": "hg19"
                    }
                }]
            },
            "freeze": False,
            "session": 1416229253.930908,
            "prod_dir": "alu-2003-11-26",
            "release": "2003-11-26",
            "types": ["nucleic"]
        }

        BmajIndex.add('test', prod, True)

        query = {'query': {'match': {'bank': 'test'}}}
        res = BmajIndex.search(query)
        self.assertTrue(len(res) == 2)

    def test_remove_all(self):
        self.test_index()
        query = {'query': {'match': {'bank': 'test'}}}
        BmajIndex.delete_all_bank('test')
        res = BmajIndex.search(query)
        self.assertTrue(len(res) == 0)
예제 #7
0
class TestBiomajFunctional(unittest.TestCase):

  def setUp(self):
    self.utils = UtilsForTest()
    curdir = os.path.dirname(os.path.realpath(__file__))
    BiomajConfig.load_config(self.utils.global_properties, allow_user_config=False)

    #Delete all banks
    b = Bank('local')
    b.banks.remove({})

    self.config = BiomajConfig('local')
    data_dir = self.config.get('data.dir')
    lock_file = os.path.join(data_dir,'local.lock')
    if os.path.exists(lock_file):
      os.remove(lock_file)

  def tearDown(self):
    data_dir = self.config.get('data.dir')
    lock_file = os.path.join(data_dir,'local.lock')
    if os.path.exists(lock_file):
      os.remove(lock_file)
    self.utils.clean()

  def test_extract_release_from_file_name(self):
    b = Bank('local')
    b.load_session(UpdateWorkflow.FLOW)
    b.session.config.set('release.file', 'test_(\d+)\.txt')
    b.session.config.set('release.regexp', '')
    w = UpdateWorkflow(b)
    w.wf_release()
    self.assertTrue(b.session.get('release') == '100')

  def test_remoterelease_check(self):
      b = Bank('local')
      b.load_session(ReleaseCheckWorkflow.FLOW)
      b.session.config.set('release.file', 'test_(\d+)\.txt')
      b.session.config.set('release.regexp', '')
      workflow = ReleaseCheckWorkflow(b)
      res = workflow.start()
      remoterelease = b.session.get('remoterelease')
      self.assertTrue(remoterelease == '100')

  def test_extract_release_from_file_content(self):
    b = Bank('local')
    b.load_session(UpdateWorkflow.FLOW)
    b.session.config.set('release.file', 'test_100\.txt')
    b.session.config.set('release.regexp', 'Release\s*(\d+)')
    w = UpdateWorkflow(b)
    w.wf_release()
    self.assertTrue(b.session.get('release') == '103')

  def test_publish(self):
    """
    Update a bank, then publish it
    """
    b = Bank('local')
    b.update()
    current_link = os.path.join(b.config.get('data.dir'),
                                b.config.get('dir.version'),
                                'current')
    self.assertFalse(os.path.exists(current_link))
    self.assertTrue(b.bank['current'] is None)
    b.publish()
    self.assertTrue(os.path.exists(current_link))
    self.assertTrue(b.bank['current'] == b.session._session['id'])

  # Should test this on local downloader, changing 1 file to force update,
  # else we would get same bank and there would be no update
  def test_no_update(self):
      """
      Try updating twice, at second time, bank should not be updated
      """
      b = Bank('local')
      b.update()
      self.assertTrue(b.session.get('update'))
      b.update()
      self.assertFalse(b.session.get('update'))
      self.assertFalse(b.session.get_status(Workflow.FLOW_POSTPROCESS))

  @attr('remotelist')
  def test_download_from_list(self):
      """
      Use remote.list to define a list of files to download
      """
      b = Bank('local')
      fd, file_path = tempfile.mkstemp()
      try:
          b.config.set('remote.list', file_path)
          with os.fdopen(fd, 'w') as tmp:
              tmp.write('[{"name": "test_100.txt", "root": "' + b.config.get('remote.dir') + '"}]')
          b.update()
          self.assertTrue(b.session.get('update'))
      finally:
          #os.remove(file_path)
          print(file_path)

  @attr('release')
  def test_release_control(self):
    """
    Try updating twice, at second time, modify one file (same date),
     bank should update
    """
    b = Bank('local')
    b.update()
    b.session.config.set('keep.old.version', '3')
    self.assertTrue(b.session.get('update'))
    remote_file = b.session.config.get('remote.dir') + 'test2.fasta'
    os.utime(remote_file, None)
    # Update test2.fasta and set release.control
    b.session.config.set('release.control', 'true')
    b.update()
    self.assertTrue(b.session.get('update'))
    b.update()
    self.assertFalse(b.session.get('update'))
    b.session.config.set('copy.skip', '1')
    b.session.config.set('remote.files', '^test2.fasta')
    b.update()
    self.assertTrue(b.session.get('update'))

  def test_update_hardlinks(self):
    """
    Update a bank twice with hard links^. Files copied from previous release
    must be links.
    """
    b = Bank('local')
    b.config.set('keep.old.version', '3')
    b.config.set('use_hardlinks', '1')
    # First update
    b.update()
    self.assertTrue(b.session.get('update'))
    old_release = b.session.get_full_release_directory()
    # Update test.fasta to force update (not that this file is modified in the
    # source tree)
    remote_file = b.session.config.get('remote.dir') + 'test.fasta.gz'
    stat = os.stat(remote_file)
    one_day = 3600 * 24
    os.utime(remote_file, (stat.st_atime + one_day, stat.st_atime + one_day))
    # Second update
    b.update()
    self.assertTrue(b.session.get('update'))
    new_release = b.session.get_full_release_directory()
    # Test that test2.fasta in both release are the same file (we can't use
    # test.fasta because it is uncompressed and then not the same file)
    file_old_release = os.path.join(old_release, 'flat', 'test2.fasta')
    file_new_release = os.path.join(new_release, 'flat', 'test2.fasta')
    try:
        self.assertTrue(os.path.samefile(file_old_release, file_new_release))
    except AssertionError:
        msg = "In %s: copy worked but hardlinks were not used." % self.id()
        logging.info(msg)
    # Restore date (otherwise repeated tests fail)
    os.utime(remote_file, (stat.st_atime, stat.st_atime))
    
  def test_fromscratch_update(self):
      """
      Try updating twice, at second time, bank should  be updated (force with fromscratc)
      """
      b = Bank('local')
      b.update()
      self.assertTrue(b.session.get('update'))
      sess = b.session.get('release')
      b.options.fromscratch = True
      b.update()
      self.assertTrue(b.session.get('update'))
      self.assertEqual(b.session.get('release'), sess+'__1')


  def test_fromscratch_update_with_release(self):
      """
      Try updating twice, at second time, bank should  be updated (force with fromscratch)

      Use case with release defined in release file
      """
      b = Bank('local')
      b.load_session(UpdateWorkflow.FLOW)
      b.session.config.set('release.file', 'test_(\d+)\.txt')
      b.session.config.set('release.regexp', '')
      w = UpdateWorkflow(b)
      w.wf_release()
      self.assertTrue(b.session.get('release') == '100')
      os.makedirs(b.session.get_full_release_directory())
      w = UpdateWorkflow(b)
      # Reset release
      b.session.set('release', None)
      w.options.fromscratch = True
      w.wf_release()
      self.assertTrue(b.session.get('release') == '100__1')


  def test_mix_stop_from_task(self):
      """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
      b = Bank('local')
      b.update()
      rel = b.session.get('release')
      b2 = Bank('local')
      b2.options.stop_after = 'download'
      b2.options.fromscratch = True
      res = b2.update()
      self.assertTrue(b2.session.get('release') == rel+'__1')
      b3 = Bank('local')
      res = b3.update()
      self.assertTrue(b3.session.get('release') == rel+'__1')
      self.assertTrue(res)

  def test_mix_stop_from_task2(self):
      """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
      b = Bank('local')
      b.update()
      rel = b.session.get('release')
      b2 = Bank('local')
      b2.options.stop_after = 'download'
      b2.options.fromscratch = True
      res = b2.update()
      self.assertTrue(b2.session.get('release') == rel+'__1')
      b3 = Bank('local')
      res = b3.update()
      b2.options.from_task = 'download'
      self.assertTrue(b3.session.get('release') == rel+'__1')
      self.assertTrue(res)

  def test_mix_stop_from_task3(self):
      """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
      b = Bank('local')
      b.update()
      rel = b.session.get('release')
      b2 = Bank('local')
      b2.options.stop_after = 'download'
      b2.options.fromscratch = True
      res = b2.update()
      self.assertTrue(b2.session.get('release') == rel+'__1')
      b3 = Bank('local')
      res = b3.update()
      b2.options.from_task = 'postprocess'
      self.assertTrue(b3.session.get('release') == rel+'__1')
      self.assertTrue(res)

  def test_mix_stop_from_task4(self):
      """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
      b = Bank('local')
      b.update()
      rel = b.session.get('release')
      b2 = Bank('local')
      b2.options.stop_before = 'download'
      b2.options.fromscratch = True
      res = b2.update()
      b3 = Bank('local')
      b3.options.from_task = 'postprocess'
      res = b3.update()
      self.assertFalse(res)

  def test_delete_old_dirs(self):
      """
      Try updating 3 times, oldest dir should be removed
      """
      b = Bank('local')
      b.removeAll(True)
      b = Bank('local')
      b.update()
      self.assertTrue(b.session.get('update'))
      b.options.fromscratch = True
      b.update()
      self.assertTrue(b.session.get('update'))
      self.assertTrue(len(b.bank['production']) == 2)
      b.update()
      self.assertTrue(b.session.get('update'))
      # one new dir, but olders must be deleted
      self.assertTrue(len(b.bank['production']) == 2)

  def test_delete_old_dirs_with_freeze(self):
      """
      Try updating 3 times, oldest dir should be removed but not freezed releases
      """
      b = Bank('local')
      b.removeAll(True)
      b = Bank('local')
      b.update()
      b.freeze(b.session.get('release'))
      self.assertTrue(b.session.get('update'))
      b.options.fromscratch = True
      b.update()
      b.freeze(b.session.get('release'))
      self.assertTrue(b.session.get('update'))
      self.assertTrue(len(b.bank['production']) == 2)
      b.update()
      self.assertTrue(b.session.get('update'))
      # one new dir, but olders must be deleted
      self.assertTrue(len(b.bank['production']) == 3)

  def test_removeAll(self):
    b = Bank('local')
    b.update()
    b.removeAll()
    self.assertFalse(os.path.exists(b.get_data_dir()))
    bdb = b.banks.find_one({'name': b.name})
    self.assertTrue(bdb is None)

  def test_remove(self):
    """
    test removal of a production dir
    """
    b = Bank('local')
    b.update()
    self.assertTrue(os.path.exists(b.session.get_full_release_directory()))
    self.assertTrue(len(b.bank['production'])==1)
    b.remove(b.session.get('release'))
    self.assertFalse(os.path.exists(b.session.get_full_release_directory()))
    b = Bank('local')
    self.assertTrue(len(b.bank['production'])==0)

  def test_update_stop_after(self):
    b = Bank('local')
    b.options.stop_after = 'download'
    b.update()
    self.assertTrue(b.session.get_status('download'))
    self.assertFalse(b.session.get_status('postprocess'))

  def test_update_stop_before(self):
    b = Bank('local')
    b.options.stop_before = 'postprocess'
    b.update()
    self.assertTrue(b.session.get_status('download'))
    self.assertFalse(b.session.get_status('postprocess'))

  def test_reupdate_from_task(self):
    b = Bank('local')
    b.options.stop_after = 'download'
    b.update()
    self.assertFalse(b.session.get_status('postprocess'))
    b2 = Bank('local')
    b2.options.from_task = 'postprocess'
    b2.options.release = b.session.get('release')
    b2.update()
    self.assertTrue(b2.session.get_status('postprocess'))
    self.assertEqual(b.session.get_full_release_directory(), b2.session.get_full_release_directory())

  def test_reupdate_from_task_error(self):
    b = Bank('local')
    b.options.stop_after = 'check'
    b.update()
    self.assertFalse(b.session.get_status('postprocess'))
    b2 = Bank('local')
    b2.options.from_task = 'postprocess'
    b2.options.release = b.session.get('release')
    res = b2.update()
    self.assertFalse(res)

  def test_reupdate_from_task_wrong_release(self):
    b = Bank('local')
    b.options.stop_after = 'download'
    b.update()
    self.assertFalse(b.session.get_status('postprocess'))
    b2 = Bank('local')
    b2.options.from_task = 'postprocess'
    b2.options.release = 'wrongrelease'
    res = b2.update()
    self.assertFalse(res)

  @attr('process')
  def test_postprocesses_restart_from_proc(self):
    b = Bank('localprocess')
    b.update()
    proc1file = os.path.join(b.session.get_full_release_directory(),'proc1.txt')
    proc2file = os.path.join(b.session.get_full_release_directory(),'proc2.txt')
    self.assertTrue(os.path.exists(proc1file))
    self.assertTrue(os.path.exists(proc2file))
    os.remove(proc1file)
    os.remove(proc2file)
    # Restart from postprocess, reexecute all processes
    b2 = Bank('localprocess')
    b2.options.from_task = 'postprocess'
    b2.options.release = b.session.get('release')
    b2.update()
    self.assertTrue(os.path.exists(proc1file))
    self.assertTrue(os.path.exists(proc2file))
    os.remove(proc1file)
    os.remove(proc2file)
    # Restart from postprocess, but at process PROC2 and following
    b3 = Bank('localprocess')
    b3.options.from_task = 'postprocess'
    b3.options.process = 'PROC2'
    b3.options.release = b.session.get('release')
    b3.update()
    #self.assertFalse(os.path.exists(proc1file))
    self.assertTrue(os.path.exists(proc2file))

  @attr('process')
  def test_postprocess_wrong_process_name(self):
    """If a wrong process name is given, update returns False and prints an error message"""
    b = Bank('local')
    b.options.stop_after = 'download'
    b.update()
    self.assertFalse(b.session.get_status('postprocess'))
    b2 = Bank('local')
    b2.options.from_task = 'postprocess'
    b2.options.release = b.session.get('release')
    b2.options.process = 'fake'
    self.assertFalse(b2.update())
    self.assertFalse(b2.session.get_status('postprocess'))
    self.assertEqual(b.session.get_full_release_directory(), b2.session.get_full_release_directory())

  def test_computed(self):
    b = Bank('computed')
    res = b.update(True)
    self.assertTrue(res)
    self.assertTrue(os.path.exists(b.session.get_full_release_directory()+'/sub1/flat/test_100.txt'))
    self.assertTrue(b.session.get('update'))
    # Check that, with depends non updated, bank is not updated itself
    nextb = Bank('computed')
    res = nextb.update(True)
    self.assertFalse(nextb.session.get('update'))

  @attr('nofile')
  def test_computed_nofile(self):
    b = Bank('computed2')
    b.load_session(UpdateWorkflow.FLOW)
    b.session.config.set('protocol', 'none')
    b.session.config.set('sub1.files.move', 'flat/test_.*')
    res = b.update(True)
    self.assertTrue(res)
    self.assertTrue(os.path.exists(b.session.get_full_release_directory()+'/sub1/flat/test_100.txt'))

  def test_computed_ref_release(self):
    b = Bank('computed2')
    res = b.update(True)
    b2 = Bank('sub1')
    b2release = b2.bank['production'][len(b2.bank['production'])-1]['release']
    brelease = b.bank['production'][len(b.bank['production'])-1]['release']
    self.assertTrue(res)
    self.assertTrue(brelease == b2release)

  @attr('computed')
  def test_computed_ref_release(self):
    b = Bank('computed2')
    res = b.update(True)
    self.assertTrue(b.session.get('update'))
    b2 = Bank('computed2')
    res = b2.update(True)
    self.assertFalse(b2.session.get('update'))

  def test_computederror(self):
    b = Bank('computederror')
    res = b.update(True)
    self.assertFalse(res)
    self.assertTrue(b.session._session['depends']['sub2'])
    self.assertFalse(b.session._session['depends']['error'])


  @attr('directrelease')
  def test_directhttp_release(self):
      b = Bank('directhttp')
      res = b.update()
      self.assertTrue(b.session.get('update'))
      self.assertTrue(os.path.exists(b.session.get_full_release_directory()+'/flat/debian/README.html'))
      # print str(b.session.get('release'))
      # print str(b.session.get('remoterelease'))

  @attr('network')
  def test_multi(self):
    b = Bank('multi')
    res = b.update()
    with open(os.path.join(b.session.get_full_release_directory(),'flat/test1.json'), 'r') as content_file:
      content = content_file.read()
      my_json = json.loads(content)
      self.assertTrue(my_json['args']['key1'] == 'value1')
    with open(os.path.join(b.session.get_full_release_directory(),'flat/test2.json'), 'r') as content_file:
      content = content_file.read()
      my_json = json.loads(content)
      self.assertTrue(my_json['form']['key1'] == 'value1')

  def test_freeze(self):
    b = Bank('local')
    b.update()
    rel = b.session.get('release')
    b.freeze(rel)
    prod = b.get_production(rel)
    self.assertTrue(prod['freeze'] == True)
    res = b.remove(rel)
    self.assertTrue(res == False)
    b.unfreeze(rel)
    prod = b.get_production(rel)
    self.assertTrue(prod['freeze'] == False)
    res = b.remove(rel)
    self.assertTrue(res == True)

  def test_stats(self):
    b = Bank('local')
    b.update()
    rel = b.session.get('release')
    stats = Bank.get_banks_disk_usage()
    self.assertTrue(stats[0]['size']>0)
    for release in stats[0]['releases']:
      if release['name'] == rel:
        self.assertTrue(release['size']>0)

  @attr('process')
  def test_processes_meta_data(self):
    b = Bank('localprocess')
    b.update()
    formats = b.session.get('formats')
    self.assertTrue(len(formats['blast'])==2)
    self.assertTrue(len(formats['test'][0]['files'])==3)

  @attr('process')
  def test_search(self):
    b = Bank('localprocess')
    b.update()
    search_res = Bank.search(['blast'],[])
    self.assertTrue(len(search_res)==1)
    search_res = Bank.search([],['nucleic'])
    self.assertTrue(len(search_res)==1)
    search_res = Bank.search(['blast'],['nucleic'])
    self.assertTrue(len(search_res)==1)
    search_res = Bank.search(['blast'],['proteic'])
    self.assertTrue(len(search_res)==0)

  def test_owner(self):
    """
    test ACL with owner
    """
    b = Bank('local')
    res = b.update()
    self.assertTrue(res)
    b.set_owner('sample')
    b2 = Bank('local')
    try:
      res = b2.update()
      self.fail('not owner, should not be allowed')
    except Exception as e:
      pass
예제 #8
0
class TestBiomajSetup(unittest.TestCase):

  def setUp(self):
    self.utils = UtilsForTest()
    curdir = os.path.dirname(os.path.realpath(__file__))
    BiomajConfig.load_config(self.utils.global_properties, allow_user_config=False)

    # Delete all banks
    b = Bank('alu')
    b.banks.remove({})

    self.config = BiomajConfig('alu')
    data_dir = self.config.get('data.dir')
    lock_file = os.path.join(data_dir,'alu.lock')
    if os.path.exists(lock_file):
      os.remove(lock_file)

  def tearDown(self):
    data_dir = self.config.get('data.dir')
    lock_file = os.path.join(data_dir,'alu.lock')
    if os.path.exists(lock_file):
      os.remove(lock_file)
    self.utils.clean()

  def test_new_bank(self):
    """
    Checks bank init
    """
    b = Bank('alu')

  def test_new_session(self):
    """
    Checks an empty session is created
    """
    b = Bank('alu')
    b.load_session(UpdateWorkflow.FLOW)
    for key in b.session._session['status'].keys():
      self.assertFalse(b.session.get_status(key))

  def test_session_reload_notover(self):
    """
    Checks a session is used if present
    """
    b = Bank('alu')
    for i in range(1, 5):
      s = Session('alu', self.config, UpdateWorkflow.FLOW)
      s._session['status'][Workflow.FLOW_INIT] = True
      b.session = s
      b.save_session()

    b = Bank('alu')
    b.load_session(UpdateWorkflow.FLOW)
    self.assertTrue(b.session.get_status(Workflow.FLOW_INIT))

  def test_clean_old_sessions(self):
    """
    Checks a session is used if present
    """
    b = Bank('local')
    for i in range(1,5):
      s = Session('alu', self.config, UpdateWorkflow.FLOW)
      s._session['status'][Workflow.FLOW_INIT] = True
      b.session = s
      b.save_session()
    b2 = Bank('local')
    b2.update()
    b2.clean_old_sessions()
    self.assertTrue(len(b2.bank['sessions']) == 1)

  def test_session_reload_over(self):
    """
    Checks a session if is not over
    """
    b = Bank('alu')
    for i in range(1,5):
      s = Session('alu', self.config, UpdateWorkflow.FLOW)
      s._session['status'][Workflow.FLOW_INIT] = True
      s._session['status'][Workflow.FLOW_OVER] = True
      b.session = s
      b.save_session()

    b = Bank('alu')
    b.load_session(UpdateWorkflow.FLOW)
    self.assertFalse(b.session.get_status(Workflow.FLOW_INIT))

  def test_bank_list(self):
    b1 = Bank('alu')
    b2 = Bank('local')
    banks = Bank.list()
    self.assertTrue(len(banks) == 2)

  @attr('test')
  @attr('network')
  def test_get_release(self):
    """
    Get release
    """
    b = Bank('alu')
    b.load_session(UpdateWorkflow.FLOW)
    res = b.update()
    self.assertTrue(b.session.get('update'))
    self.assertTrue(res)
    self.assertTrue(b.session._session['release'] is not None)

  def test_remove_session(self):
    b = Bank('alu')
    for i in range(1,5):
      s = Session('alu', self.config, UpdateWorkflow.FLOW)
      s._session['status'][Workflow.FLOW_INIT] = True
      b.session = s
      b.save_session()
    self.assertTrue(len(b.bank['sessions'])==4)
    b.remove_session(b.session.get('id'))
    self.assertTrue(len(b.bank['sessions'])==3)

  @attr('process')
  def test_postprocesses_setup(self):
    b = Bank('localprocess')
    pfactory = PostProcessFactory(b)
    pfactory.run(True)
    self.assertTrue(len(pfactory.threads_tasks[0])==2)
    self.assertTrue(len(pfactory.threads_tasks[1])==1)

  @attr('process')
  def test_postprocesses_exec_again(self):
    """
    Execute once, set a status to false, check that False processes are executed
    """
    b = Bank('localprocess')
    pfactory = PostProcessFactory(b)
    pfactory.run()
    self.assertTrue(pfactory.blocks['BLOCK1']['META0']['PROC0'])
    self.assertTrue(pfactory.blocks['BLOCK2']['META1']['PROC1'])
    self.assertTrue(pfactory.blocks['BLOCK2']['META1']['PROC2'])
    blocks = copy.deepcopy(pfactory.blocks)
    blocks['BLOCK2']['META1']['PROC2'] = False
    pfactory2 = PostProcessFactory(b, blocks)
    pfactory2.run()
    self.assertTrue(pfactory2.blocks['BLOCK2']['META1']['PROC2'])

  @attr('process')
  def test_preprocesses(self):
    b = Bank('localprocess')
    pfactory = PreProcessFactory(b)
    pfactory.run()
    self.assertTrue(pfactory.meta_status['META0']['PROC0'])

  @attr('process')
  def test_removeprocesses(self):
    b = Bank('localprocess')
    pfactory = RemoveProcessFactory(b)
    pfactory.run()
    self.assertTrue(pfactory.meta_status['META0']['PROC0'])

  def test_dependencies_list(self):
    b = Bank('computed')
    deps = b.get_dependencies()
    self.assertTrue(len(deps)==2)
예제 #9
0
class TestBiomajFunctional(unittest.TestCase):
    def setUp(self):
        self.utils = UtilsForTest()
        curdir = os.path.dirname(os.path.realpath(__file__))
        BiomajConfig.load_config(self.utils.global_properties,
                                 allow_user_config=False)

        #Delete all banks
        b = Bank('local')
        b.banks.remove({})

        self.config = BiomajConfig('local')
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'local.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)

    def tearDown(self):
        data_dir = self.config.get('data.dir')
        lock_file = os.path.join(data_dir, 'local.lock')
        if os.path.exists(lock_file):
            os.remove(lock_file)
        self.utils.clean()

    def test_extract_release_from_file_name(self):
        b = Bank('local')
        b.load_session(UpdateWorkflow.FLOW)
        b.session.config.set('release.file', 'test_(\d+)\.txt')
        b.session.config.set('release.regexp', '')
        w = UpdateWorkflow(b)
        w.wf_release()
        self.assertTrue(b.session.get('release') == '100')

    def test_remoterelease_check(self):
        b = Bank('local')
        b.load_session(ReleaseCheckWorkflow.FLOW)
        b.session.config.set('release.file', 'test_(\d+)\.txt')
        b.session.config.set('release.regexp', '')
        workflow = ReleaseCheckWorkflow(b)
        res = workflow.start()
        remoterelease = b.session.get('remoterelease')
        self.assertTrue(remoterelease == '100')

    def test_extract_release_from_file_content(self):
        b = Bank('local')
        b.load_session(UpdateWorkflow.FLOW)
        b.session.config.set('release.file', 'test_100\.txt')
        b.session.config.set('release.regexp', 'Release\s*(\d+)')
        w = UpdateWorkflow(b)
        w.wf_release()
        self.assertTrue(b.session.get('release') == '103')

    def test_publish(self):
        """
    Update a bank, then publish it
    """
        b = Bank('local')
        b.update()
        current_link = os.path.join(b.config.get('data.dir'),
                                    b.config.get('dir.version'), 'current')
        self.assertFalse(os.path.exists(current_link))
        self.assertTrue(b.bank['current'] is None)
        b.publish()
        self.assertTrue(os.path.exists(current_link))
        self.assertTrue(b.bank['current'] == b.session._session['id'])

    # Should test this on local downloader, changing 1 file to force update,
    # else we would get same bank and there would be no update
    def test_no_update(self):
        """
      Try updating twice, at second time, bank should not be updated
      """
        b = Bank('local')
        b.update()
        self.assertTrue(b.session.get('update'))
        b.update()
        self.assertFalse(b.session.get('update'))
        self.assertFalse(b.session.get_status(Workflow.FLOW_POSTPROCESS))

    @attr('remotelist')
    def test_download_from_list(self):
        """
      Use remote.list to define a list of files to download
      """
        b = Bank('local')
        fd, file_path = tempfile.mkstemp()
        try:
            b.config.set('remote.list', file_path)
            with os.fdopen(fd, 'w') as tmp:
                tmp.write('[{"name": "test_100.txt", "root": "' +
                          b.config.get('remote.dir') + '"}]')
            b.update()
            self.assertTrue(b.session.get('update'))
        finally:
            #os.remove(file_path)
            print(file_path)

    @attr('release')
    def test_release_control(self):
        """
    Try updating twice, at second time, modify one file (same date),
     bank should update
    """
        b = Bank('local')
        b.update()
        b.session.config.set('keep.old.version', '3')
        self.assertTrue(b.session.get('update'))
        remote_file = b.session.config.get('remote.dir') + 'test2.fasta'
        os.utime(remote_file, None)
        # Update test2.fasta and set release.control
        b.session.config.set('release.control', 'true')
        b.update()
        self.assertTrue(b.session.get('update'))
        b.update()
        self.assertFalse(b.session.get('update'))
        b.session.config.set('copy.skip', '1')
        b.session.config.set('remote.files', '^test2.fasta')
        b.update()
        self.assertTrue(b.session.get('update'))

    def test_fromscratch_update(self):
        """
      Try updating twice, at second time, bank should  be updated (force with fromscratc)
      """
        b = Bank('local')
        b.update()
        self.assertTrue(b.session.get('update'))
        sess = b.session.get('release')
        b.options.fromscratch = True
        b.update()
        self.assertTrue(b.session.get('update'))
        self.assertEqual(b.session.get('release'), sess + '__1')

    def test_fromscratch_update_with_release(self):
        """
      Try updating twice, at second time, bank should  be updated (force with fromscratch)

      Use case with release defined in release file
      """
        b = Bank('local')
        b.load_session(UpdateWorkflow.FLOW)
        b.session.config.set('release.file', 'test_(\d+)\.txt')
        b.session.config.set('release.regexp', '')
        w = UpdateWorkflow(b)
        w.wf_release()
        self.assertTrue(b.session.get('release') == '100')
        os.makedirs(b.session.get_full_release_directory())
        w = UpdateWorkflow(b)
        # Reset release
        b.session.set('release', None)
        w.options.fromscratch = True
        w.wf_release()
        self.assertTrue(b.session.get('release') == '100__1')

    def test_mix_stop_from_task(self):
        """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        b2 = Bank('local')
        b2.options.stop_after = 'download'
        b2.options.fromscratch = True
        res = b2.update()
        self.assertTrue(b2.session.get('release') == rel + '__1')
        b3 = Bank('local')
        res = b3.update()
        self.assertTrue(b3.session.get('release') == rel + '__1')
        self.assertTrue(res)

    def test_mix_stop_from_task2(self):
        """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        b2 = Bank('local')
        b2.options.stop_after = 'download'
        b2.options.fromscratch = True
        res = b2.update()
        self.assertTrue(b2.session.get('release') == rel + '__1')
        b3 = Bank('local')
        res = b3.update()
        b2.options.from_task = 'download'
        self.assertTrue(b3.session.get('release') == rel + '__1')
        self.assertTrue(res)

    def test_mix_stop_from_task3(self):
        """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        b2 = Bank('local')
        b2.options.stop_after = 'download'
        b2.options.fromscratch = True
        res = b2.update()
        self.assertTrue(b2.session.get('release') == rel + '__1')
        b3 = Bank('local')
        res = b3.update()
        b2.options.from_task = 'postprocess'
        self.assertTrue(b3.session.get('release') == rel + '__1')
        self.assertTrue(res)

    def test_mix_stop_from_task4(self):
        """
      Get a first release, then fromscratch --stop-after, then restart from-task
      """
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        b2 = Bank('local')
        b2.options.stop_before = 'download'
        b2.options.fromscratch = True
        res = b2.update()
        b3 = Bank('local')
        b3.options.from_task = 'postprocess'
        res = b3.update()
        self.assertFalse(res)

    def test_delete_old_dirs(self):
        """
      Try updating 3 times, oldest dir should be removed
      """
        b = Bank('local')
        b.removeAll(True)
        b = Bank('local')
        b.update()
        self.assertTrue(b.session.get('update'))
        b.options.fromscratch = True
        b.update()
        self.assertTrue(b.session.get('update'))
        self.assertTrue(len(b.bank['production']) == 2)
        b.update()
        self.assertTrue(b.session.get('update'))
        # one new dir, but olders must be deleted
        self.assertTrue(len(b.bank['production']) == 2)

    def test_delete_old_dirs_with_freeze(self):
        """
      Try updating 3 times, oldest dir should be removed but not freezed releases
      """
        b = Bank('local')
        b.removeAll(True)
        b = Bank('local')
        b.update()
        b.freeze(b.session.get('release'))
        self.assertTrue(b.session.get('update'))
        b.options.fromscratch = True
        b.update()
        b.freeze(b.session.get('release'))
        self.assertTrue(b.session.get('update'))
        self.assertTrue(len(b.bank['production']) == 2)
        b.update()
        self.assertTrue(b.session.get('update'))
        # one new dir, but olders must be deleted
        self.assertTrue(len(b.bank['production']) == 3)

    def test_removeAll(self):
        b = Bank('local')
        b.update()
        b.removeAll()
        self.assertFalse(os.path.exists(b.get_data_dir()))
        bdb = b.banks.find_one({'name': b.name})
        self.assertTrue(bdb is None)

    def test_remove(self):
        """
    test removal of a production dir
    """
        b = Bank('local')
        b.update()
        self.assertTrue(os.path.exists(b.session.get_full_release_directory()))
        self.assertTrue(len(b.bank['production']) == 1)
        b.remove(b.session.get('release'))
        self.assertFalse(os.path.exists(
            b.session.get_full_release_directory()))
        b = Bank('local')
        self.assertTrue(len(b.bank['production']) == 0)

    def test_update_stop_after(self):
        b = Bank('local')
        b.options.stop_after = 'download'
        b.update()
        self.assertTrue(b.session.get_status('download'))
        self.assertFalse(b.session.get_status('postprocess'))

    def test_update_stop_before(self):
        b = Bank('local')
        b.options.stop_before = 'postprocess'
        b.update()
        self.assertTrue(b.session.get_status('download'))
        self.assertFalse(b.session.get_status('postprocess'))

    def test_reupdate_from_task(self):
        b = Bank('local')
        b.options.stop_after = 'download'
        b.update()
        self.assertFalse(b.session.get_status('postprocess'))
        b2 = Bank('local')
        b2.options.from_task = 'postprocess'
        b2.options.release = b.session.get('release')
        b2.update()
        self.assertTrue(b2.session.get_status('postprocess'))
        self.assertEqual(b.session.get_full_release_directory(),
                         b2.session.get_full_release_directory())

    def test_reupdate_from_task_error(self):
        b = Bank('local')
        b.options.stop_after = 'check'
        b.update()
        self.assertFalse(b.session.get_status('postprocess'))
        b2 = Bank('local')
        b2.options.from_task = 'postprocess'
        b2.options.release = b.session.get('release')
        res = b2.update()
        self.assertFalse(res)

    def test_reupdate_from_task_wrong_release(self):
        b = Bank('local')
        b.options.stop_after = 'download'
        b.update()
        self.assertFalse(b.session.get_status('postprocess'))
        b2 = Bank('local')
        b2.options.from_task = 'postprocess'
        b2.options.release = 'wrongrelease'
        res = b2.update()
        self.assertFalse(res)

    @attr('process')
    def test_postprocesses_restart_from_proc(self):
        b = Bank('localprocess')
        b.update()
        proc1file = os.path.join(b.session.get_full_release_directory(),
                                 'proc1.txt')
        proc2file = os.path.join(b.session.get_full_release_directory(),
                                 'proc2.txt')
        self.assertTrue(os.path.exists(proc1file))
        self.assertTrue(os.path.exists(proc2file))
        os.remove(proc1file)
        os.remove(proc2file)
        # Restart from postprocess, reexecute all processes
        b2 = Bank('localprocess')
        b2.options.from_task = 'postprocess'
        b2.options.release = b.session.get('release')
        b2.update()
        self.assertTrue(os.path.exists(proc1file))
        self.assertTrue(os.path.exists(proc2file))
        os.remove(proc1file)
        os.remove(proc2file)
        # Restart from postprocess, but at process PROC2 and following
        b3 = Bank('localprocess')
        b3.options.from_task = 'postprocess'
        b3.options.process = 'PROC2'
        b3.options.release = b.session.get('release')
        b3.update()
        #self.assertFalse(os.path.exists(proc1file))
        self.assertTrue(os.path.exists(proc2file))

    @attr('process')
    def test_postprocess_wrong_process_name(self):
        """If a wrong process name is given, update returns False and prints an error message"""
        b = Bank('local')
        b.options.stop_after = 'download'
        b.update()
        self.assertFalse(b.session.get_status('postprocess'))
        b2 = Bank('local')
        b2.options.from_task = 'postprocess'
        b2.options.release = b.session.get('release')
        b2.options.process = 'fake'
        self.assertFalse(b2.update())
        self.assertFalse(b2.session.get_status('postprocess'))
        self.assertEqual(b.session.get_full_release_directory(),
                         b2.session.get_full_release_directory())

    def test_computed(self):
        b = Bank('computed')
        res = b.update(True)
        self.assertTrue(res)
        self.assertTrue(
            os.path.exists(b.session.get_full_release_directory() +
                           '/sub1/flat/test_100.txt'))
        self.assertTrue(b.session.get('update'))
        # Check that, with depends non updated, bank is not updated itself
        nextb = Bank('computed')
        res = nextb.update(True)
        self.assertFalse(nextb.session.get('update'))

    @attr('nofile')
    def test_computed_nofile(self):
        b = Bank('computed2')
        b.load_session(UpdateWorkflow.FLOW)
        b.session.config.set('protocol', 'none')
        b.session.config.set('sub1.files.move', 'flat/test_.*')
        res = b.update(True)
        self.assertTrue(res)
        self.assertTrue(
            os.path.exists(b.session.get_full_release_directory() +
                           '/sub1/flat/test_100.txt'))

    def test_computed_ref_release(self):
        b = Bank('computed2')
        res = b.update(True)
        b2 = Bank('sub1')
        b2release = b2.bank['production'][len(b2.bank['production']) -
                                          1]['release']
        brelease = b.bank['production'][len(b.bank['production']) -
                                        1]['release']
        self.assertTrue(res)
        self.assertTrue(brelease == b2release)

    @attr('computed')
    def test_computed_ref_release(self):
        b = Bank('computed2')
        res = b.update(True)
        self.assertTrue(b.session.get('update'))
        b2 = Bank('computed2')
        res = b2.update(True)
        self.assertFalse(b2.session.get('update'))

    def test_computederror(self):
        b = Bank('computederror')
        res = b.update(True)
        self.assertFalse(res)
        self.assertTrue(b.session._session['depends']['sub2'])
        self.assertFalse(b.session._session['depends']['error'])

    @attr('directrelease')
    def test_directhttp_release(self):
        b = Bank('directhttp')
        res = b.update()
        self.assertTrue(b.session.get('update'))
        self.assertTrue(
            os.path.exists(b.session.get_full_release_directory() +
                           '/flat/debian/README.html'))
        # print str(b.session.get('release'))
        # print str(b.session.get('remoterelease'))

    @attr('network')
    def test_multi(self):
        b = Bank('multi')
        res = b.update()
        with open(
                os.path.join(b.session.get_full_release_directory(),
                             'flat/test1.json'), 'r') as content_file:
            content = content_file.read()
            my_json = json.loads(content)
            self.assertTrue(my_json['args']['key1'] == 'value1')
        with open(
                os.path.join(b.session.get_full_release_directory(),
                             'flat/test2.json'), 'r') as content_file:
            content = content_file.read()
            my_json = json.loads(content)
            self.assertTrue(my_json['form']['key1'] == 'value1')

    def test_freeze(self):
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        b.freeze(rel)
        prod = b.get_production(rel)
        self.assertTrue(prod['freeze'] == True)
        res = b.remove(rel)
        self.assertTrue(res == False)
        b.unfreeze(rel)
        prod = b.get_production(rel)
        self.assertTrue(prod['freeze'] == False)
        res = b.remove(rel)
        self.assertTrue(res == True)

    def test_stats(self):
        b = Bank('local')
        b.update()
        rel = b.session.get('release')
        stats = Bank.get_banks_disk_usage()
        self.assertTrue(stats[0]['size'] > 0)
        for release in stats[0]['releases']:
            if release['name'] == rel:
                self.assertTrue(release['size'] > 0)

    @attr('process')
    def test_processes_meta_data(self):
        b = Bank('localprocess')
        b.update()
        formats = b.session.get('formats')
        self.assertTrue(len(formats['blast']) == 2)
        self.assertTrue(len(formats['test'][0]['files']) == 3)

    @attr('process')
    def test_search(self):
        b = Bank('localprocess')
        b.update()
        search_res = Bank.search(['blast'], [])
        self.assertTrue(len(search_res) == 1)
        search_res = Bank.search([], ['nucleic'])
        self.assertTrue(len(search_res) == 1)
        search_res = Bank.search(['blast'], ['nucleic'])
        self.assertTrue(len(search_res) == 1)
        search_res = Bank.search(['blast'], ['proteic'])
        self.assertTrue(len(search_res) == 0)

    def test_owner(self):
        """
    test ACL with owner
    """
        b = Bank('local')
        res = b.update()
        self.assertTrue(res)
        b.set_owner('sample')
        b2 = Bank('local')
        try:
            res = b2.update()
            self.fail('not owner, should not be allowed')
        except Exception as e:
            pass