Beispiel #1
0
 def test_profile_with_no_profiles_in_files(self):
     conf_file = get_resource('conf/conf.ini')
     conf_dist_file = get_resource('conf/conf_dist.ini')
     profiles_dir = get_resource('conf/profiles')
     conf = Conf(conf_file, conf_dist_file, profiles_dir)
     conf.reload()
     self.assertEqual(len(conf.get_profiles()), 1)
Beispiel #2
0
    def test_profile_with_no_profiles_in_files(self):
        conf_file = get_resource('conf/conf.ini')
        conf_dist_file = get_resource('conf/conf_dist.ini')
        profiles_dir = get_resource('conf/profiles')
        conf = Conf(conf_file, conf_dist_file, profiles_dir)

        self.assertEqual(len(conf.get_profiles()), 1)
    def setUp(self):
        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file =get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file,self.backup_conf_file)
        self.conf = Conf(self.conf_file,dist_file)
        self.conf.reload()
Beispiel #4
0
    def setUp(self):
        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file = get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file, self.backup_conf_file)
        self.conf = Conf(self.conf_file, dist_file)
        self.conf.reload()
Beispiel #5
0
    def test_active_tag_default_profile(self):
        conf_file = get_resource('conf/conf_active.ini')
        dist_file = get_resource('conf/conf-dist.ini')
        conf = Conf(conf_file, dist_file)

        profile = conf.get_current_profile()

        self.assertEqual(1, len(profile.tracks))
Beispiel #6
0
 def test_element_set_uri(self):
     self.assertEqual(
         self.track1.uri,
         path.join(get_resource('mediapackage'), 'SCREEN.mpeg'))
     self.track1.setURI(self.path_track2)
     self.assertEqual(
         self.track1.uri,
         path.join(get_resource('mediapackage'), 'CAMERA.mpeg'))
Beispiel #7
0
    def setUp(self):
        self.conf_file = get_resource('profile/conf_good.ini')
        self.backup_conf_file = get_resource('profile/conf_good_backup.ini')
        conf_dist_file = get_resource('profile/conf-dist.ini')
        folder_path = get_resource('profile/folder')

        shutil.copyfile(self.conf_file,self.backup_conf_file)
        self.conf = Conf(self.conf_file,conf_dist_file, folder_path)
        self.conf.reload()
    def test_active_tag_default_profile(self):
        conf_file = get_resource('conf/conf_active.ini')
        backup_conf_active = get_resource('conf/conf_active.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(conf_file, backup_conf_active)
        conf = Conf(conf_file, dist_file)
        conf.reload()
        profile = conf.get_current_profile()
        self.assertEqual(1, len(profile.tracks))
        shutil.copyfile(backup_conf_active, conf_file)
        os.remove(backup_conf_active)
Beispiel #9
0
    def test_active_tag_default_profile(self):
        conf_file = get_resource('conf/conf_active.ini')
        backup_conf_active = get_resource('conf/conf_active.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(conf_file, backup_conf_active)
        conf = Conf(conf_file, dist_file)
        conf.reload()
        profile = conf.get_current_profile()
        self.assertEqual(1, len(profile.tracks))
        shutil.copyfile(backup_conf_active, conf_file)
        os.remove(backup_conf_active)
Beispiel #10
0
    def test_recover_recording(self):
        repo_folder = get_resource('repository')
        rectemp_aux = get_resource('utils/temporary_recording')
        rectemp = get_resource('repository/rectemp')

        # Read info.json
        info = {}
        info_filename = os.path.join(rectemp_aux, 'info.json')
        with open(info_filename, 'r') as handle:
            info = json.load(handle)

        # Modify path of tracks
        for indx, track in enumerate(info['tracks']):
            info['tracks'][indx]['path'] = rectemp

        # Copy temporary files
        for temp_file in os.listdir(rectemp_aux):
            full_path = os.path.join(rectemp_aux, temp_file)
            copy(full_path, os.path.join(rectemp, temp_file))

        # Overwrite info.json with new paths
        f = open(os.path.join(rectemp, 'info.json'), 'w')
        f.write(json.dumps(info, indent=4, sort_keys=True))
        f.close()

        # Get old length
        old_length = len(self.get_folders_in_repository(repo_folder))

        # Create the repository
        from galicaster.core import context
        logger = context.get_logger()
        repo = repository.Repository(
            repo_folder, '',
            'gc_{hostname}_{year}-{month}-{day}T{hour}h{minute}m{second}',
            logger)

        # Check 1
        self.assertEqual(old_length + 1,
                         len(self.get_folders_in_repository(repo_folder)))

        # Check 2
        mp = repo.get('4ea1049f-c946-4d36-95d4-b8d01223bd73')
        self.assertNotEqual(mp, None)
        mp_info = mp.getAsDict()
        self.assertEqual(mp_info['status'], 4)
        self.assertTrue('Recovered' in mp_info['title'])
        self.assertEqual(len(mp_info['tracks']), 2)

        # Clean
        for temp_file in os.listdir(rectemp):
            os.remove(os.path.join(rectemp, temp_file))
        repo.delete(mp)
    def test_invalid_ini(self):
        conf_file = get_resource('conf/conf.ini')
        conf_dist_file = get_resource('conf/conf_dist.ini')
        profiles_dir = get_resource('conf/profiles')
        conf = Conf(conf_file, conf_dist_file, profiles_dir)
        conf.reload()
        old_conf = self.conf.get_all()

        content = ''
        with open(get_resource('conf/conf.ini'), 'r') as content_file:
                content = content_file.read()

        # Override conf file
        f = open(get_resource('conf/conf.ini'),'w')
        f.write('testing wrong config file')
        f.close()

        conf_dist_file = get_resource('conf/conf_dist.ini')
        profiles_dir = get_resource('conf/profiles')
        conf = Conf(conf_file, conf_dist_file, profiles_dir)
        conf.reload()
        new_conf = self.conf.get_all()

        self.assertEqual(old_conf, new_conf)

        # Override conf file
        f = open(get_resource('conf/conf.ini'),'w')
        f.write(content)
        f.close()
    def setUp(self):
        for service_name in ['conf', 'dispatcher', 'mainwindow', 'heartbeat',
                             'repository', 'occlient', 'scheduler']:
            if context.has(service_name):
                context.delete(service_name)

        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file =get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file,self.backup_conf_file)
        self.conf = Conf(self.conf_file,dist_file)
        context.set('conf',self.conf)
        self.conf.reload()
Beispiel #13
0
    def test_invalid_ini(self):
        conf_file = get_resource('conf/conf.ini')
        conf_dist_file = get_resource('conf/conf_dist.ini')
        profiles_dir = get_resource('conf/profiles')
        conf = Conf(conf_file, conf_dist_file, profiles_dir)
        conf.reload()
        old_conf = self.conf.get_all()

        content = ''
        with open(get_resource('conf/conf.ini'), 'r') as content_file:
            content = content_file.read()

        # Override conf file
        f = open(get_resource('conf/conf.ini'), 'w')
        f.write('testing wrong config file')
        f.close()

        conf_dist_file = get_resource('conf/conf_dist.ini')
        profiles_dir = get_resource('conf/profiles')
        conf = Conf(conf_file, conf_dist_file, profiles_dir)
        conf.reload()
        new_conf = self.conf.get_all()

        self.assertEqual(old_conf, new_conf)

        # Override conf file
        f = open(get_resource('conf/conf.ini'), 'w')
        f.write(content)
        f.close()
    def test_recover_recording(self):
        repo_folder = get_resource('repository')
        rectemp_aux = get_resource('utils/temporary_recording')
        rectemp = get_resource('repository/rectemp')

        # Read info.json
        info = {}
        info_filename = os.path.join(rectemp_aux, 'info.json')
        with open(info_filename, 'r') as handle:
            info = json.load(handle)

        # Modify path of tracks
        for indx, track in enumerate(info['tracks']):
            info['tracks'][indx]['path'] = rectemp

        # Copy temporary files
        for temp_file in os.listdir(rectemp_aux):
            full_path = os.path.join(rectemp_aux, temp_file)
            copy(full_path, os.path.join(rectemp, temp_file))

        # Overwrite info.json with new paths
        f = open(os.path.join(rectemp, 'info.json'), 'w')
        f.write(json.dumps(info, indent=4, sort_keys=True))
        f.close()    

        # Get old length
        old_length = len(self.get_folders_in_repository(repo_folder))

        # Create the repository
        from galicaster.core import context
        logger = context.get_logger()
        repo = repository.Repository(repo_folder, '', 'gc_{hostname}_{year}-{month}-{day}T{hour}h{minute}m{second}', logger)

        # Check 1
        self.assertEqual(old_length +1 , len(self.get_folders_in_repository(repo_folder)))

        # Check 2
        mp = repo.get('4ea1049f-c946-4d36-95d4-b8d01223bd73')
        self.assertNotEqual(mp, None)
        mp_info = mp.getAsDict()
        self.assertEqual(mp_info['status'], 4)
        self.assertTrue('Recovered' in mp_info['title'])
        self.assertEqual(len(mp_info['tracks']), 2)
        
        # Clean
        for temp_file in os.listdir(rectemp):
            os.remove(os.path.join(rectemp, temp_file))
        repo.delete(mp)
Beispiel #15
0
    def setUp(self):
        self.tmppath = mkdtemp()

        repo = repository.Repository(self.tmppath)
        context.set('repository', repo)

        # conf = Conf()
        # context.set('conf', conf)

        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file = get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file, self.backup_conf_file)
        self.conf = Conf(self.conf_file, dist_file)
        self.conf.reload()
    def test_side_by_side(self):
        w = worker.Worker(self.dispatcher, self.repo1, self.logger, self.client)

        baseDir = get_resource('sbs')
        path_track1 = path.join(baseDir, 'SCREEN.mp4')
        path_track2 = path.join(baseDir, 'CAMERA.mp4')
        path_catalog = path.join(baseDir, 'episode.xml')
        path_attach = path.join(baseDir, 'attachment.txt')
        path_capture_agent_properties = path.join(baseDir, 'org.opencastproject.capture.agent.properties')
        path_other = path.join(baseDir, 'manifest.xml')

        track1 = mediapackage.Track(uri = path_track1, duration = 532, flavor = "presentation/source")
        track2 = mediapackage.Track(uri = path_track2, duration = 532, flavor = "presenter/source")
        catalog = mediapackage.Catalog(uri = path_catalog, flavor = "catalog/source")
        attach = mediapackage.Attachment(uri = path_attach, flavor = "attachment/source")
        other = mediapackage.Other(uri = path_other, flavor = "other/source")

        self.mp.add(path_track1, mediapackage.TYPE_TRACK, "presentation/source", "video/mpeg", 532)
        self.mp.add(path_track2, mediapackage.TYPE_TRACK, "presenter/source", "video/mpeg", 532)
        self.mp.add(path_catalog, mediapackage.TYPE_CATALOG, "catalog/source", "text/xml")
        self.mp.add(path_attach, mediapackage.TYPE_ATTACHMENT, "attachment/source", "text/xml")
        self.mp.add(path_other, mediapackage.TYPE_OTHER, "other/source", "text/xml")


        filename = '/tmp/sidebyside.mpeg'
        w.enqueue_job_by_name('sidebyside', self.mp, {'location': filename})
        time.sleep(2)
        self.assertTrue(os.path.exists(filename))
Beispiel #17
0
def test_round_trip(tmp_py, tmp_yaml, pipeline_yaml):
    if isinstance(pipeline_yaml, str):
        pipeline_yaml = get_resource("testflight-fixtures/" + pipeline_yaml)

    # YAML -> PY
    cli.import_yaml(pipeline_yaml, tmp_py)

    # PY -> YAML
    cli.synth(tmp_py, tmp_yaml)

    # load expected, remove anchors, write back and read as str
    with pipeline_yaml.open() as f:
        raw = yaml.safe_load(f)

    base_obj = Pipeline()
    for key in list(raw.keys()):
        if not hasattr(base_obj, key):
            del raw[key]

    cli._write_yaml_file(raw, pipeline_yaml)
    expected = pipeline_yaml.read_text()

    # get actual and compare
    actual = tmp_yaml.read_text()
    print("Len of expected", len(expected))
    assert actual == expected, "\n".join(
        difflib.unified_diff(expected.splitlines(), actual.splitlines())
    )
Beispiel #18
0
    def setUp(self):
        for service_name in [
                'conf', 'dispatcher', 'mainwindow', 'heartbeat', 'repository',
                'occlient', 'scheduler'
        ]:
            if context.has(service_name):
                context.delete(service_name)

        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file = get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file, self.backup_conf_file)
        self.conf = Conf(self.conf_file, dist_file)
        context.set('conf', self.conf)
        self.conf.reload()
    def setUp(self):
        self.tmppath = mkdtemp()

        repo = repository.Repository(self.tmppath)
        context.set('repository', repo)

        # conf = Conf()
        # context.set('conf', conf)

        self.conf_file = get_resource('conf/conf.ini')
        self.backup_conf_file =get_resource('conf/conf.backup.ini')
        dist_file = get_resource('conf/conf-dist.ini')

        shutil.copyfile(self.conf_file,self.backup_conf_file)
        self.conf = Conf(self.conf_file,dist_file)
        self.conf.reload()
Beispiel #20
0
def test_entry_proj_slug():
    """Ensure that the slug-replacement logic takes effect."""

    if not is_windows():
        assert (
            mk_main([PKG_NAME, "-C", get_resource("test-scenario"), "test"])
            == 0
        )
Beispiel #21
0
 def test_init_no_dist_file(self):
     conf_file = get_resource('conf/conf.ini')
     primary_dist = path.join('/usr/share/galicaster/',  'conf-dist.ini')
     secondary_dist = path.abspath(path.join(path.dirname(__file__), '..', '..', 'conf-dist.ini'))
     #conf load custom conf and default dist
     conf = Conf(conf_file)
     self.assertEqual(conf_file, conf.conf_file)
     self.assertEqual( primary_dist if path.isfile(primary_dist) else secondary_dist,
                       conf.conf_dist_file) 
Beispiel #22
0
def test_interrupt():
    """Test interrupting the process."""

    with get_args() as base_args:
        good_base_args = base_args + ["-f", get_resource("Makefile"), "sleep"]
        proc = Process(target=mk_main, args=[good_base_args])
        proc.start()
        time.sleep(0.5)
        os.kill(proc.pid, signal.SIGINT)
        proc.join()
Beispiel #23
0
class TestFunctions(TestCase):

    base_dir = get_resource('ical')

    def setUp(self):
        self.tmppath = mkdtemp()

    def tearDown(self):
        rmtree(self.tmppath)

    def test_ical_create_mp(self):
        repo = repository.Repository(self.tmppath)

        events = ical.get_events_from_file_ical(path.join(self.base_dir, 'test.ical'))

        for event in events:
            ical.create_mp(repo, event)

        next = repo.get_next_mediapackage()
        self.assertEqual(next.getDate(), datetime.strptime('2019-04-05 11:00:00', '%Y-%m-%d %H:%M:%S'))
        self.assertEqual(len(next.getElements()), 2)
        self.assertEqual(len(next.getAttachments()), 1)
        self.assertTrue(next.getAttachment('org.opencastproject.capture.agent.properties'))
        self.assertEqual(len(next.getCatalogs()), 1)

        nexts = repo.get_next_mediapackages()
        self.assertEqual(nexts[0].getDate(), datetime.strptime('2019-04-05 11:00:00', '%Y-%m-%d %H:%M:%S'))


    def test_ical_get_deleted_events(self):
        old_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'test.ical'))
        new_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'none.ical'))

        delete_events = ical.get_deleted_events(old_events, new_events)

        self.assertEqual(len(delete_events), 1)


    def test_ical_get_updated_events(self):
        old_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'test.ical'))
        new_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'test_update.ical'))

        update_events = ical.get_updated_events(old_events, new_events)

        self.assertEqual(len(update_events), 0)

    def test_ical_get_updated_events_updates(self):
        old_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'testv2.ical'))
        new_events = ical.get_events_from_file_ical(path.join(self.base_dir, 'testv2_update.ical'))

        update_events = ical.get_updated_events(old_events, new_events)

        self.assertEqual(len(update_events), 6)
Beispiel #24
0
class TestFunctions(TestCase):

    base_dir = get_resource('sbs')

    def test_get_duration(self):
        screen = path.join(self.base_dir, 'SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        audio = path.join(self.base_dir, 'AUDIO.mp3')

        self.assertEqual(mediainfo.get_duration(screen), 1)
        self.assertEqual(mediainfo.get_duration(camera), 1)
        self.assertEqual(mediainfo.get_duration(audio), 1)
Beispiel #25
0
class TestFunctions(TestCase):

    base_dir = get_resource('sbs')

    def test_play_with_audio(self):
        screen = path.join(self.base_dir, 'SCREEN.mp4')

        files = {"SCREEN": screen}
        players = {}
        player = Player(files, players)
        player.play()
        player.stop()

    def test_play_without_audio(self):
        screen = path.join(self.base_dir, 'SCREEN_NO_AUDIO.mp4')

        files = {"SCREEN": screen}
        players = {}
        player = Player(files, players)
        player.play()
        player.stop()

    def test_play_two_videos_without_audio(self):
        screen = path.join(self.base_dir, 'SCREEN_NO_AUDIO.mp4')
        camera = path.join(self.base_dir, 'CAMERA_NO_AUDIO.mp4')

        files = {"SCREEN": screen, "CAMERA": camera}
        players = {}
        player = Player(files, players)
        player.play()
        player.stop()

    def test_play_two_videos_and_audio(self):
        screen = path.join(self.base_dir, 'SCREEN_NO_AUDIO.mp4')
        camera = path.join(self.base_dir, 'CAMERA_NO_AUDIO.mp4')
        audio = path.join(self.base_dir, 'AUDIO.mp3')

        files = {"SCREEN": screen, "CAMERA": camera, "AUDIO": audio}
        players = {}
        player = Player(files, players)
        player.play()
        player.stop()

    def test_play_two_videos_audio_embedded(self):
        screen = path.join(self.base_dir, 'SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')

        files = {"SCREEN": screen, "CAMERA": camera}
        players = {}
        player = Player(files, players)
        player.play()
        player.stop()
Beispiel #26
0
def test_entry():
    """Test some basic command-line argument scenarios."""

    if not is_windows():
        with get_args() as base_args:
            good_base_args = base_args + ["-f", get_resource("Makefile")]
            assert mk_main(good_base_args + ["test"]) == 0
            assert mk_main(good_base_args + ["--proj", "test", "test"]) == 0
            assert mk_main(good_base_args + ["-p", "prefix", "test"]) == 0
            assert mk_main(good_base_args + ["test_bad"]) != 0
            assert mk_main(good_base_args + ["--weird-option", "yo"]) != 0
            assert mk_main(base_args + ["-f", "nah"]) != 0
            assert mk_main(base_args) == 0
Beispiel #27
0
class TestFunctions(TestCase):

    base_dir = get_resource('sbs')

    def test_sbs_with_embeded_audio(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'SCREEN_NO_AUDIO.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        out = sidebyside.create_sbs(out.name, camera, screen)
        self.assertTrue(out)

    def test_sbs_with_audio(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        audio = path.join(self.base_dir, 'AUDIO.mp3')
        out = sidebyside.create_sbs(out.name, camera, screen, audio)
        self.assertTrue(out)

    def test_sbs_with_two_embeded_audio(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        out = sidebyside.create_sbs(out.name, camera, screen)
        self.assertTrue(out)

    def test_sbs_without_audio(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'SCREEN_NO_AUDIO.mp4')
        camera = path.join(self.base_dir, 'CAMERA_NO_AUDIO.mp4')
        out = sidebyside.create_sbs(out.name, camera, screen)
        self.assertTrue(out)

    def test_sbs_no_input_file(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'NO_SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        self.assertRaises(IOError, sidebyside.create_sbs, out.name, camera,
                          screen)

    def test_sbs_less_than_two_files(self):
        out = tempfile.NamedTemporaryFile()
        screen = path.join(self.base_dir, 'SCREEN.mp4')
        camera = path.join(self.base_dir, 'CAMERA.mp4')
        self.assertRaises(IOError, sidebyside.create_sbs, out.name, None,
                          camera)
Beispiel #28
0
    def test_side_by_side(self):
        w = worker.Worker(self.dispatcher, self.repo1, self.logger,
                          self.client)

        baseDir = get_resource('sbs')
        path_track1 = path.join(baseDir, 'SCREEN.mp4')
        path_track2 = path.join(baseDir, 'CAMERA.mp4')
        path_catalog = path.join(baseDir, 'episode.xml')
        path_attach = path.join(baseDir, 'attachment.txt')
        path_capture_agent_properties = path.join(
            baseDir, 'org.opencastproject.capture.agent.properties')
        path_other = path.join(baseDir, 'manifest.xml')

        track1 = mediapackage.Track(uri=path_track1,
                                    duration=532,
                                    flavor="presentation/source")
        track2 = mediapackage.Track(uri=path_track2,
                                    duration=532,
                                    flavor="presenter/source")
        catalog = mediapackage.Catalog(uri=path_catalog,
                                       flavor="catalog/source")
        attach = mediapackage.Attachment(uri=path_attach,
                                         flavor="attachment/source")
        other = mediapackage.Other(uri=path_other, flavor="other/source")

        self.mp.add(path_track1, mediapackage.TYPE_TRACK,
                    "presentation/source", "video/mpeg", 532)
        self.mp.add(path_track2, mediapackage.TYPE_TRACK, "presenter/source",
                    "video/mpeg", 532)
        self.mp.add(path_catalog, mediapackage.TYPE_CATALOG, "catalog/source",
                    "text/xml")
        self.mp.add(path_attach, mediapackage.TYPE_ATTACHMENT,
                    "attachment/source", "text/xml")
        self.mp.add(path_other, mediapackage.TYPE_OTHER, "other/source",
                    "text/xml")

        filename = '/tmp/sidebyside.mpeg'
        w.enqueue_job_by_name('sidebyside', self.mp, {'location': filename})
        time.sleep(2)
        self.assertTrue(os.path.exists(filename))
Beispiel #29
0
    def setUp(self):
        """ Set up clear conf with a custom logger and repository folder.
        """
        self.conf_path = '/etc/galicaster/conf.ini'
        identifier = self.id().split('.')
        identifier.reverse()
        test_number = re.sub('\D','',identifier[0])
        self.test_path = '/tmp/test{}'.format(test_number)

        if os.path.exists(self.conf_path) and not os.path.exists('{}.old'.format(self.conf_path)):
            os.rename(self.conf_path,'{}.old'.format(self.conf_path))
        shutil.copyfile(get_resource('conf/functional_test.ini'),'/etc/galicaster/conf.ini')
        if not os.path.exists(self.test_path):
            os.makedirs('{}/logs/'.format(self.test_path))
        self.conf = Conf()

        self.conf.set('basic','repository','{}/Repository'.format(self.test_path))
        self.conf.set('logger','path','{}/logs/galicaster.log'.format(self.test_path))
        self.conf.update()

        config.load({'logDir':'{}/logs/'.format(self.test_path)})
        from . import recording
 def stop(self, force=False):
     self.time = datetime.now()
     if not force and os.path.isdir(self.bins[0]['path']):
         for bin in self.bins:
             filename = os.path.join(bin['path'], bin['file'])
             os.symlink(get_resource('sbs/CAMERA.mp4'), filename)
Beispiel #31
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_track1 = path.join(baseDir, 'SCREEN.mpeg')
    path_track2 = path.join(baseDir, 'CAMERA.mpeg')
    path_catalog = path.join(baseDir, 'episode.xml')
    path_attach = path.join(baseDir, 'attachment.txt')
    path_other = path.join(baseDir, 'manifest.xml')
    path_gc = path.join(baseDir, 'galicaster.xml')

    def setUp(self):
        self.track1 = mediapackage.Track(uri=self.path_track1,
                                         duration=532,
                                         flavor="presentation/source",
                                         mimetype="video/mpeg")
        self.track2 = mediapackage.Track(uri=self.path_track2,
                                         duration=532,
                                         flavor="presenter/source",
                                         mimetype="video/mpeg")
        self.catalog = mediapackage.Catalog(uri=self.path_catalog,
                                            flavor="dublincore/episode",
                                            mimetype="text/xml")
        self.gc_catalog = mediapackage.Catalog(uri=self.path_gc,
                                               flavor="galicaster",
                                               mimetype="text/xml")

    def tearDown(self):
        del self.track1
        del self.track2
        del self.catalog

    def test_serializer(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.status = mediapackage.SCHEDULED
        mp.notes = u"Nota de Prueba <?php Caracteres ñ I'm raros >"

        try:
            parseString(serializer.set_manifest(mp))
        except ExpatError:
            raise AssertionError("Error in serializer.set_manifest")

        try:
            parseString(serializer.set_episode(mp))
        except ExpatError:
            raise AssertionError("Error in serializer.set_episode")

        try:
            json.loads(serializer.set_properties(mp))
        except ExpatError:
            raise AssertionError("Error in serializer.set_properties")

    def test_save_in_zip(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.marshalDublincore()

        da = minidom.parseString(serializer.set_episode(mp))
        db = minidom.parse(self.path_catalog)

        for name in ["dcterms:title", "dcterms:identifier", "dcterms:created"]:
            try:
                self.assertEqual(
                    da.getElementsByTagName(
                        name)[0].firstChild.wholeText.strip().strip("\n"),
                    db.getElementsByTagName(name)
                    [0].firstChild.wholeText.strip().strip("\n"))
            except IndexError:
                continue

    def test_save_system_zip(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1, mediapackage.TYPE_TRACK, "presentation/source",
               "video/mpeg", 532)
        mp.add(self.track2, mediapackage.TYPE_TRACK, "presenter/source",
               "video/mpeg", 532)
        mp.add(self.catalog, mediapackage.TYPE_CATALOG, "catalog/source",
               "xml")
        tmppath = mkdtemp()
        repo = repository.Repository(tmppath)
        repo.add(mp)
        path_zip = "system.zip"

        serializer.save_system_zip(mp, path_zip)
        zfile = zipfile.ZipFile(path_zip, 'r')
        files = zfile.namelist()

        for element in mp.getElements():
            self.assertTrue(path.split(element.getURI())[1] in files)
        rmtree(tmppath)
        remove(path_zip)

    @skip("skip")
    def test_operation_status(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.operations["ingest"] = 4
        mp.marshalDublincore()
        da = minidom.parseString(serializer.set_properties(mp))
        name = "key:ingest"
        try:
            self.assertEqual(
                da.getElementsByTagName(
                    name)[0].firstChild.wholeText.strip().strip("\n"),
                da.getElementsByTagName(name)
                [0].firstChild.wholeText.strip().strip("\n"))
        except IndexError:
            pass
Beispiel #32
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_track1 = path.join(baseDir, 'SCREEN.mpeg')
    path_track2 = path.join(baseDir, 'CAMERA.mpeg')
    path_catalog = path.join(baseDir, 'episode.xml')
    path_attach = path.join(baseDir, 'attachment.txt')
    path_capture_agent_properties = path.join(
        baseDir, 'org.opencastproject.capture.agent.properties')
    path_other = path.join(baseDir, 'manifest.xml')

    def setUp(self):
        self.track1 = mediapackage.Track(uri=self.path_track1,
                                         duration=532,
                                         flavor="presentation/source")
        self.track2 = mediapackage.Track(uri=self.path_track2,
                                         duration=532,
                                         flavor="presenter/source")
        self.catalog = mediapackage.Catalog(uri=self.path_catalog,
                                            flavor="catalog/source")
        self.attach = mediapackage.Attachment(uri=self.path_attach,
                                              flavor="attachment/source")
        self.other = mediapackage.Other(uri=self.path_other,
                                        flavor="other/source")

    def tearDown(self):
        del self.track1
        del self.track2
        del self.catalog
        del self.attach
        del self.other

    def test_element_instantiation(self):
        # Check Element can't be instantiated
        self.assertRaises(RuntimeError, mediapackage.Element, self.path_track1)

        # Check Track
        self.assertEqual(self.track1.getElementType(), mediapackage.TYPE_TRACK)
        # Check Catalog
        self.assertEqual(self.catalog.getElementType(),
                         mediapackage.TYPE_CATALOG)
        # Check Attachment
        self.assertEqual(self.attach.getElementType(),
                         mediapackage.TYPE_ATTACHMENT)
        # Check Other
        self.assertEqual(self.other.getElementType(), mediapackage.TYPE_OTHER)

    def test_element_equality(self):
        track = mediapackage.Track(self.path_track1, 532,
                                   "presentation/source")
        attach = mediapackage.Attachment(self.path_attach, "attachment/source")
        catalog = mediapackage.Catalog(self.path_catalog, "catalog/source")
        other = mediapackage.Other(self.path_other, "other/source")
        self.assertFalse(track == self.track2)
        self.assertFalse(track == attach)
        self.assertFalse(attach == catalog)
        self.assertFalse(catalog == other)
        self.assertFalse(other == track)
        self.assertTrue(track == self.track1)
        self.assertTrue(attach == self.attach)
        self.assertTrue(catalog == self.catalog)
        self.assertTrue(other == self.other)

    def test_no_elements(self):
        mp = mediapackage.Mediapackage()
        self.assertEqual(len(mp.getElements()), 0)

    def test_add_uris(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_track1, mediapackage.TYPE_TRACK,
               "presentation/source", None, 532)
        self.assertTrue(mp.contains(self.track1))
        mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source",
               None, 532)
        self.assertTrue(mp.contains(self.track2))
        mp.add(self.path_catalog, mediapackage.TYPE_CATALOG, "catalog/source")
        self.assertTrue(mp.contains(self.catalog))
        mp.add(self.path_attach, mediapackage.TYPE_ATTACHMENT,
               "attachment/source")
        self.assertTrue(mp.contains(self.attach))
        mp.add(self.path_other, mediapackage.TYPE_OTHER, "other/source")
        self.assertTrue(mp.contains(self.other))
        self.assertEqual(len(mp.getElements()), 5)
        self.assertEqual(len(mp.getTracks()), 2)
        self.assertEqual(len(mp.getAttachments()), 1)
        self.assertEqual(len(mp.getCatalogs()), 1)
        self.assertEqual(len(mp.getUnclassifiedElements()), 1)

    def test_duration_add_track(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_track1, mediapackage.TYPE_TRACK,
               "presentation/source", None, 532)
        mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source",
               None, 1532)
        self.assertEqual(mp.getDuration(), 1532)

    def test_add_elements(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        self.assertTrue(mp.contains(self.track1))
        self.assertEqual(self.track1.getMediapackage(), mp)
        mp.add(self.track2)
        self.assertTrue(mp.contains(self.track2))
        self.assertEqual(self.track2.getMediapackage(), mp)
        mp.add(self.catalog)
        self.assertTrue(mp.contains(self.catalog))
        self.assertEqual(self.catalog.getMediapackage(), mp)
        mp.add(self.attach)
        self.assertTrue(mp.contains(self.attach))
        self.assertEqual(self.attach.getMediapackage(), mp)
        mp.add(self.other)
        self.assertTrue(mp.contains(self.other))
        self.assertEqual(self.other.getMediapackage(), mp)
        self.assertEqual(len(mp.getElements()), 5)
        self.assertEqual(len(mp.getTracks()), 2)
        self.assertEqual(len(mp.getAttachments()), 1)
        self.assertEqual(len(mp.getCatalogs()), 1)
        self.assertEqual(len(mp.getUnclassifiedElements()), 1)

    def test_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getTracks()), 1)

    def test_no_tracks_by_flavour(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getTracks('presentation/source')), 0)

    def test_no_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getCatalogs()), 0)

    def test_add_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        file_path = path.join(self.baseDir, 'CAMERA.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presentation/source')
        file_path = path.join(self.baseDir, 'episode.xml')
        mp.add(file_path, mediapackage.TYPE_CATALOG, 'dublincore/episode')
        self.assertEqual(len(mp.getElements()), 3)

    def test_fromXML(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(mp.title, "Opening a folder...")
        self.assertEqual(mp.getIdentifier(),
                         "dae91194-2114-481b-8908-8a8962baf8dc")
        self.assertEqual(mp.status, 0)
        self.assertEqual(mp.properties['notes'],
                         u"Nota de Prueba <?php Caracteres ñ I'm raros >")

    def test_mediapackage_size(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(mp.getSize(), 598)

    def test_mediapackage_get_oc_capture_agent_property(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_capture_agent_properties,
               mediapackage.TYPE_ATTACHMENT,
               identifier='org.opencastproject.capture.agent.properties')

        self.assertEqual(mp.getOCCaptureAgentProperty('capture.device.names'),
                         'camera,screen,audio')
        self.assertNotEqual(
            mp.getOCCaptureAgentProperty('capture.device.names.error'),
            'camera,screen,audio')

        mp2 = mediapackage.Mediapackage()
        self.assertNotEqual(
            mp2.getOCCaptureAgentProperty('capture.device.names'),
            'camera,screen,audio')

        self.assertEqual(
            mp.getOCCaptureAgentProperties(), {
                u'org.opencastproject.workflow.config.trimHold': 'false',
                u'capture.device.names': 'camera,screen,audio',
                u'org.opencastproject.workflow.definition': 'full',
                u'event.series': 'f16b43df-d1d4-4a85-8989-c060b85cea8d',
                u'event.title': 'Clase 2',
                u'event.location': 'GC-Etna',
                u'org.opencastproject.workflow.config.captionHold': 'false'
            })

    def test_mp_and_operations(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(0, len(mp.operation))

    def test_properties(self):
        mp = mediapackage.Mediapackage()
        mp.title = 'title'
        self.assertEqual(mp.title, 'title')
        self.assertEqual(mp.metadata_episode['title'], 'title')
Beispiel #33
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_track1 = os.path.join(baseDir, 'SCREEN.mpeg')
    path_track2 = os.path.join(baseDir, 'CAMERA.mpeg')
    path_catalog = os.path.join(baseDir, 'episode.xml')
    path_attach = os.path.join(baseDir, 'attachment.txt')
    path_other = os.path.join(baseDir, 'manifest.xml')

    def setUp(self):
        self.track1 = mediapackage.Track(uri=self.path_track1,
                                         duration=532,
                                         flavor="presentation/source",
                                         mimetype="video/mpeg")
        self.track2 = mediapackage.Track(uri=self.path_track2,
                                         duration=532,
                                         flavor="presenter/source",
                                         mimetype="video/mpeg")
        self.catalog = mediapackage.Catalog(uri=self.path_catalog,
                                            flavor="catalog/source",
                                            mimetype="text/xml")
        self.tmppath = mkdtemp()

    def tearDown(self):
        rmtree(self.tmppath)

    def test_create_repository(self):
        repo = repository.Repository()
        self.assertTrue(repo.root, os.path.expanduser('~/Repository'))
        self.assertTrue(repo.get_attach_path(),
                        os.path.expanduser('~/Repository/attach'))
        root = '/tmp'
        repo = repository.Repository(root)
        self.assertTrue(os.path.isdir('/tmp/attach/'))
        root = '/tmp/AAA'
        repo = repository.Repository(root)
        self.assertTrue(os.path.isdir('/tmp/AAA/attach/'))

    def test_repository(self):
        root = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
                            'resources')
        repo = repository.Repository(root)
        self.assertEqual(repo.size(), 1)

    def test_big_repository(self):
        root = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
                            'resources', 'repository')
        repo = repository.Repository(root)
        self.assertEqual(len(repo), 5)
        self.assertEqual(len(repo.list_by_status(mediapackage.FAILED)), 1)

        for (key, mp) in repo.items():
            self.assertTrue(mp.getDuration() >= 0)

        self.assertEqual(
            repo["dae91194-2114-481b-8908-8a8962baf8da"].getIdentifier(),
            "dae91194-2114-481b-8908-8a8962baf8da")

        self.assertFalse(
            repo.get("dae91194-2114-481b-8908-8a8962baf8da").manual)
        self.assertTrue(
            repo.get("dae91194-2114-481b-8908-8a8962baf8db").manual)
        self.assertFalse(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dd").manual)
        self.assertTrue(
            repo.get("dae91194-2114-481b-8908-8a8962baf8de").manual)

        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8da").status,
            mediapackage.SCHEDULED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8db").status,
            mediapackage.RECORDING)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dc").status,
            mediapackage.RECORDED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dd").status,
            mediapackage.FAILED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8de").status,
            mediapackage.RECORDED)

        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8da").operation), 0)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8db").operation), 0)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8dc").operation), 1)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8dd").operation), 2)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8de").operation), 3)

        mp_duration = repo.get(
            "dae91194-2114-481b-8908-8a8962baf8da").getDuration()
        self.assertEqual(mp_duration, 2106)
        track_duration = repo.get("dae91194-2114-481b-8908-8a8962baf8da"
                                  ).getTrack("track-1").getDuration()
        self.assertEqual(track_duration, 2160)

    def test_add(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)

        repo.add(mp)
        self.assertRaises(KeyError, repo.add, mp)
        self.assertEqual(repo.size(), 1)

    def test_update(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        self.assertRaises(KeyError, repo.update, mp)

        repo.add(mp)
        self.assertEqual(repo.size(), 1)

        mp.metadata_episode["title"] = "new Title"

        repo.update(mp)
        self.assertEqual(repo.size(), 1)

    def test_delete(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        repo.add(mp)
        self.assertEqual(repo.size(), 1)

        repo.delete(mp)
        self.assertEqual(repo.size(), 0)
        self.assertEqual(len(os.listdir(self.tmppath)), 2)  #attach and rectemp

    def test_bad_delete(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        self.assertRaises(KeyError, repo.delete, mp)

    def test_bad_add_and_update(self):
        pass

    def __get_tmp_bin(self, name, values):
        tmp_file = mkstemp(name)[1]
        bin = {
            'file': os.path.basename(tmp_file),
            'path': os.path.dirname(tmp_file)
        }
        bin.update(values)
        return bin

    def test_add_after_rec_manual(self):
        duration = 134
        repo = repository.Repository(self.tmppath)
        mp = mediapackage.Mediapackage()
        #TODO file extension to mimetype???
        bins = [
            self.__get_tmp_bin(
                't.avi', {
                    'device': 'test',
                    'name': 'name1',
                    'dev': 'dev1',
                    'flavor': 'presenter'
                }),
            self.__get_tmp_bin(
                't.mp4', {
                    'device': 'test',
                    'name': 'name2',
                    'dev': 'dev2',
                    'flavor': 'presentation'
                })
        ]

        self.assertTrue(mp.manual)
        repo.add_after_rec(mp, bins, duration)

        self.assertEqual(mp.getDuration(), duration)
        self.assertEqual(len(repo), 1)
        self.assertEqual(len(mp.getTracks()), len(bins))

    def test_add_after_rec_no_manual(self):
        duration = 134
        repo = repository.Repository(self.tmppath)
        mp = mediapackage.Mediapackage()
        repo.add(mp)
        mp.addAttachmentAsString(
            'capture.device.names=name1,name3',
            name='org.opencastproject.capture.agent.properties',
            identifier='org.opencastproject.capture.agent.properties')

        mp.manual = False
        #TODO file extension to mimetype???
        bins = [
            self.__get_tmp_bin(
                't.avi', {
                    'device': 'test',
                    'name': 'name1',
                    'dev': 'dev1',
                    'flavor': 'presenter'
                }),
            self.__get_tmp_bin(
                't.mp4', {
                    'device': 'test',
                    'name': 'name2',
                    'dev': 'dev2',
                    'flavor': 'presentation'
                })
        ]

        self.assertFalse(mp.manual)
        repo.add_after_rec(mp, bins, duration)

        self.assertEqual(mp.getDuration(), duration)
        self.assertEqual(len(repo), 1)
        self.assertEqual(len(mp.getTracks()), 1)

    def test_get_next_and_past_mediapackages(self):
        repo = repository.Repository(self.tmppath)
        now = datetime.datetime.utcnow()

        mp = mediapackage.Mediapackage(identifier="1",
                                       title='MP#1',
                                       date=(now - datetime.timedelta(days=1)))
        repo.add(mp)
        mp = mediapackage.Mediapackage(identifier="2",
                                       title='MP#2',
                                       date=(now -
                                             datetime.timedelta(days=30)))
        repo.add(mp)
        mp = mediapackage.Mediapackage(identifier="3",
                                       title='MP#3',
                                       date=(now -
                                             datetime.timedelta(days=60)))
        repo.add(mp)
        mp_next = mediapackage.Mediapackage(identifier="4",
                                            title='MP#4',
                                            date=(now +
                                                  datetime.timedelta(days=1)))
        repo.add(mp_next)
        mp = mediapackage.Mediapackage(identifier="5",
                                       title='MP#5',
                                       date=(now +
                                             datetime.timedelta(days=30)))
        repo.add(mp)

        self.assertEqual(repo.get_next_mediapackage(), mp_next)
        self.assertEqual(len(repo.get_next_mediapackages()), 2)
        self.assertEqual(len(repo.get_past_mediapackages()), 3)
        self.assertEqual(len(repo.get_past_mediapackages(40)), 1)

    def test_repair_inconsistencies(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.status = mediapackage.INGESTED
        mp.setOpStatus("pr0", mediapackage.OP_IDLE)
        mp.setOpStatus("pr1", mediapackage.OP_PENDING)
        mp.setOpStatus("pr2", mediapackage.OP_PROCESSING)
        mp.setOpStatus("pr3", mediapackage.OP_DONE)
        mp.setOpStatus("pr4", mediapackage.OP_FAILED)

        repo.add(mp)
        repo.repair_inconsistencies(mp)

        self.assertEqual(mp.status, mediapackage.RECORDED)
        self.assertEqual(mp.getOpStatus("pr0"), mediapackage.OP_IDLE)
        self.assertEqual(mp.getOpStatus("pr1"), mediapackage.OP_FAILED)
        self.assertEqual(mp.getOpStatus("pr2"), mediapackage.OP_FAILED)
        self.assertEqual(mp.getOpStatus("pr3"), mediapackage.OP_DONE)
        self.assertEqual(mp.getOpStatus("pr4"), mediapackage.OP_FAILED)

    def test_repo_lifecycle(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.title = 'lifecycle test MP'
        self.assertEqual(len(repo), 0)

        repo.add_after_rec(mp, [], 30)
        self.assertEqual(len(repo), 1)

        for catalog in mp.getCatalogs():
            self.assertEqual(mp.getURI(), os.path.dirname(catalog.getURI()))
            self.assertTrue(
                os.path.isfile(catalog.getURI()),
                'The catalog path {0} not exists'.format(catalog.getURI()))

    def test_folder_name_template(self):
        repo = repository.Repository(self.tmppath, 'test',
                                     'gc_{hostname}_m{second}')

        mp = mediapackage.Mediapackage()
        repo.add(mp)
        self.assertEqual(
            mp.getURI(),
            os.path.join(
                repo.root, 'gc_{hostname}_m{second}'.format(
                    hostname="test", second=mp.getDate().strftime('%S'))))

    def test_folder_name_template_no_alphanumeric(self):
        repo = repository.Repository(self.tmppath, 'test',
                                     'Foo-Bar[!!??]-{hostname}_m{second}')

        mp = mediapackage.Mediapackage()
        repo.add(mp)
        self.assertEqual(
            mp.getURI(),
            os.path.join(
                repo.root, 'FooBar{hostname}_m{second}'.format(
                    hostname="test", second=mp.getDate().strftime('%S'))))

    def test_folder_name_template_unique(self):
        repo = repository.Repository(self.tmppath, 'test', 'test')

        mp1 = mediapackage.Mediapackage()
        mp2 = mediapackage.Mediapackage()
        mp3 = mediapackage.Mediapackage()

        repo.add(mp1)
        self.assertEqual(mp1.getURI(), os.path.join(repo.root, 'test'))
        repo.add(mp2)
        self.assertEqual(mp2.getURI(), os.path.join(repo.root, 'test_2'))
        repo.add(mp3)
        self.assertEqual(mp3.getURI(), os.path.join(repo.root, 'test_3'))

    def test_save_temprec_on_crash(self):
        repo = repository.Repository(self.tmppath, 'test', 'test')

        for file_name in ('CAMERA.avi', 'SCREEN.avi'):
            f = open(repo.get_rectemp_path(file_name), 'w')
            f.write("DATA" * 1000)
            f.close()

        open(repo.get_rectemp_path("None.avi"), 'w').close()

        # After crash. Create a new repo
        repo = repository.Repository(self.tmppath, 'test', 'test')
        num_files = num_backup_files = 0
        for name in os.listdir(repo.get_rectemp_path()):
            full_path = os.path.join(repo.get_rectemp_path(), name)
            if os.path.isfile(full_path) and os.path.getsize(full_path):
                num_files += 1
            if os.path.isdir(full_path):
                num_backup_files = len(os.listdir(full_path))

        self.assertEqual(num_files, 0)
        self.assertEqual(num_backup_files, 2)
Beispiel #34
0
 def test_init_all_files(self):
     conf_file = get_resource('conf/conf.ini')
     conf_dist_file = get_resource('conf/conf-dist.ini')
     conf = Conf(conf_file, conf_dist_file)
     self.assertEqual(conf_file, conf.conf_file)
     self.assertEqual(conf_dist_file, conf.conf_dist_file)
Beispiel #35
0
 def stop(self, force=False):
     self.time = datetime.now()
     if not force and os.path.isdir(self.bins[0]['path']):
         for bin in self.bins:
             filename = os.path.join(bin['path'], bin['file'])
             os.symlink(get_resource('sbs/CAMERA.mp4'), filename)
 def test_element_set_uri(self):
     self.assertEqual(self.track1.uri, path.join(get_resource('mediapackage'), 'SCREEN.mpeg'))
     self.track1.setURI(self.path_track2)
     self.assertEqual(self.track1.uri, path.join(get_resource('mediapackage'), 'CAMERA.mpeg'))
Beispiel #37
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_capture_agent_properties = os.path.join(
        baseDir, 'org.opencastproject.capture.agent.properties')

    class RepoMock(object):
        def update(self, mp):
            pass

    class MHHTTPClientMock(object):
        def __init__(self):
            self.calls = []

        def ingest(self,
                   mp_file,
                   workflow=None,
                   workflow_instance=None,
                   workflow_parameters=None):
            self.calls.append({
                'file': mp_file,
                'workflow': workflow,
                'workflow_instance': workflow_instance,
                'workflow_parameters': workflow_parameters
            })

    class DispatcherMock(object):
        def connect(self, *args):
            pass

        def emit(self, *args):
            pass

    def test_init_parameters(self):
        repo = self.RepoMock()
        client = self.MHHTTPClientMock()
        dispatcher = self.DispatcherMock()
        logger = Logger(None)
        w = worker.Worker(dispatcher, repo, logger, client)
        self.assertEqual(w.export_path, os.path.expanduser('~'))
        self.assertEqual(w.tmp_path, tempfile.gettempdir())

        #self.assertRaises(OSError, worker.Worker, repo, client, '/a/b/c', None)
        #self.assertRaises(OSError, worker.Worker, repo, client, None, '/a/b/c')

        w = worker.Worker(dispatcher, repo, logger, client,
                          '/tmp/galicaster_tdd/a/b/c',
                          '/tmp/galicaster_tdd/1/2/3')
        self.assertEqual(w.export_path, '/tmp/galicaster_tdd/a/b/c')
        self.assertEqual(w.tmp_path, '/tmp/galicaster_tdd/1/2/3')

        for dir_path in ('/tmp/galicaster_tdd/a/b/c',
                         '/tmp/galicaster_tdd/1/2/3'):
            self.assertTrue(os.path.isdir(dir_path))

        rmtree('/tmp/galicaster_tdd')

    def test_manual(self):
        repo = self.RepoMock()
        client = self.MHHTTPClientMock()
        dispatcher = self.DispatcherMock()
        logger = Logger(None)
        w = worker.Worker(dispatcher, repo, logger, client)

        mp = mediapackage.Mediapackage(uri='/tmp')
        mp.manual = True

        w._ingest(mp)
        self.assertEqual(client.calls[0]['workflow'], None)
        self.assertEqual(client.calls[0]['workflow_instance'], None)
        self.assertEqual(client.calls[0]['workflow_parameters'], None)

    def test_no_manual(self):
        repo = self.RepoMock()
        client = self.MHHTTPClientMock()
        dispatcher = self.DispatcherMock()
        logger = Logger(None)
        w = worker.Worker(dispatcher, repo, logger, client)

        mp = mediapackage.Mediapackage(identifier='1', uri='/tmp')
        mp.add(self.path_capture_agent_properties,
               mediapackage.TYPE_ATTACHMENT,
               identifier='org.opencastproject.capture.agent.properties')
        mp.manual = False

        w._ingest(mp)
        self.assertEqual(client.calls[0]['workflow'], 'full')
        self.assertEqual(client.calls[0]['workflow_instance'], '1')
        self.assertEqual(client.calls[0]['workflow_parameters'], {
            'trimHold': 'false',
            'captionHold': 'false'
        })

    def test_no_manual_only_workflow(self):
        repo = self.RepoMock()
        client = self.MHHTTPClientMock()
        dispatcher = self.DispatcherMock()
        logger = Logger(None)
        w = worker.Worker(dispatcher, repo, logger, client)

        mp = mediapackage.Mediapackage(identifier='1', uri='/tmp')
        mp.addAttachmentAsString(
            'org.opencastproject.workflow.definition=mini-full',
            name='org.opencastproject.capture.agent.properties',
            identifier='org.opencastproject.capture.agent.properties')
        mp.manual = False

        w._ingest(mp)
        self.assertEqual(client.calls[0]['workflow'], 'mini-full')
        self.assertEqual(client.calls[0]['workflow_instance'], '1')
        self.assertEqual(client.calls[0]['workflow_parameters'], {})

    def test_exec_nightly(self):
        repo = Repository('/tmp/repo_night')
        client = self.MHHTTPClientMock()
        dispatcher = Dispatcher()
        logger = Logger(None)
        w = worker.Worker(dispatcher, repo, logger, client)

        mp = mediapackage.Mediapackage()
        mp.setOpStatus(worker.INGEST_CODE, mediapackage.OP_NIGHTLY)
        repo.add(mp)

        dispatcher.emit('galicaster-notify-nightly')
        time.sleep(1)  # Need time to create zip

        self.assertEqual(len(client.calls), 1)
        self.assertEqual(mp.getOpStatus(worker.INGEST_CODE),
                         mediapackage.OP_DONE)

        rmtree('/tmp/repo_night')
Beispiel #38
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_track1 = path.join(baseDir, 'SCREEN.mpeg')
    path_track2 = path.join(baseDir, 'CAMERA.mpeg')
    path_catalog = path.join(baseDir, 'episode.xml')
    path_attach = path.join(baseDir, 'attachment.txt')
    path_capture_agent_properties = path.join(
        baseDir, 'org.opencastproject.capture.agent.properties')
    path_other = path.join(baseDir, 'manifest.xml')

    def setUp(self):
        self.track1 = mediapackage.Track(uri=self.path_track1,
                                         duration=532,
                                         flavor="presentation/source")
        self.track2 = mediapackage.Track(uri=self.path_track2,
                                         duration=532,
                                         flavor="presenter/source")
        self.catalog = mediapackage.Catalog(uri=self.path_catalog,
                                            flavor="catalog/source")
        self.attach = mediapackage.Attachment(uri=self.path_attach,
                                              flavor="attachment/source")
        self.other = mediapackage.Other(uri=self.path_other,
                                        flavor="other/source")

    def tearDown(self):
        del self.track1
        del self.track2
        del self.catalog
        del self.attach
        del self.other

    def test_element_instantiation(self):
        # Check Element can't be instantiated
        self.assertRaises(RuntimeError, mediapackage.Element, self.path_track1)

        # Check Track
        self.assertEqual(self.track1.getElementType(), mediapackage.TYPE_TRACK)
        # Check Catalog
        self.assertEqual(self.catalog.getElementType(),
                         mediapackage.TYPE_CATALOG)
        # Check Attachment
        self.assertEqual(self.attach.getElementType(),
                         mediapackage.TYPE_ATTACHMENT)
        # Check Other
        self.assertEqual(self.other.getElementType(), mediapackage.TYPE_OTHER)

    def test_element_equality(self):
        track = mediapackage.Track(self.path_track1, 532,
                                   "presentation/source")
        attach = mediapackage.Attachment(self.path_attach, "attachment/source")
        catalog = mediapackage.Catalog(self.path_catalog, "catalog/source")
        other = mediapackage.Other(self.path_other, "other/source")
        self.assertFalse(track == self.track2)
        self.assertFalse(track == attach)
        self.assertFalse(attach == catalog)
        self.assertFalse(catalog == other)
        self.assertFalse(other == track)
        self.assertTrue(track == self.track1)
        self.assertTrue(attach == self.attach)
        self.assertTrue(catalog == self.catalog)
        self.assertTrue(other == self.other)

    def test_no_elements(self):
        mp = mediapackage.Mediapackage()
        self.assertEqual(len(mp.getElements()), 0)

    def test_add_uris(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_track1, mediapackage.TYPE_TRACK,
               "presentation/source", None, 532)
        self.assertTrue(mp.contains(self.track1))
        mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source",
               None, 532)
        self.assertTrue(mp.contains(self.track2))
        mp.add(self.path_catalog, mediapackage.TYPE_CATALOG, "catalog/source")
        self.assertTrue(mp.contains(self.catalog))
        mp.add(self.path_attach, mediapackage.TYPE_ATTACHMENT,
               "attachment/source")
        self.assertTrue(mp.contains(self.attach))
        mp.add(self.path_other, mediapackage.TYPE_OTHER, "other/source")
        self.assertTrue(mp.contains(self.other))
        self.assertEqual(len(mp.getElements()), 5)
        self.assertEqual(len(mp.getTracks()), 2)
        self.assertEqual(len(mp.getAttachments()), 1)
        self.assertEqual(len(mp.getCatalogs()), 1)
        self.assertEqual(len(mp.getUnclassifiedElements()), 1)

    def test_duration_add_track(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_track1, mediapackage.TYPE_TRACK,
               "presentation/source", None, 532)
        mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source",
               None, 1532)
        self.assertEqual(mp.getDuration(), 1532)

    def test_add_elements(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        self.assertTrue(mp.contains(self.track1))
        self.assertEqual(self.track1.getMediapackage(), mp)
        mp.add(self.track2)
        self.assertTrue(mp.contains(self.track2))
        self.assertEqual(self.track2.getMediapackage(), mp)
        mp.add(self.catalog)
        self.assertTrue(mp.contains(self.catalog))
        self.assertEqual(self.catalog.getMediapackage(), mp)
        mp.add(self.attach)
        self.assertTrue(mp.contains(self.attach))
        self.assertEqual(self.attach.getMediapackage(), mp)
        mp.add(self.other)
        self.assertTrue(mp.contains(self.other))
        self.assertEqual(self.other.getMediapackage(), mp)
        self.assertEqual(len(mp.getElements()), 5)
        self.assertEqual(len(mp.getTracks()), 2)
        self.assertEqual(len(mp.getAttachments()), 1)
        self.assertEqual(len(mp.getCatalogs()), 1)
        self.assertEqual(len(mp.getUnclassifiedElements()), 1)

    def test_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getTracks()), 1)

    def test_no_tracks_by_flavour(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getTracks('presentation/source')), 0)

    def test_no_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        self.assertEqual(len(mp.getCatalogs()), 0)

    def test_add_tracks(self):
        mp = mediapackage.Mediapackage()
        file_path = path.join(self.baseDir, 'SCREEN.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presenter/source')
        file_path = path.join(self.baseDir, 'CAMERA.mpeg')
        mp.add(file_path, mediapackage.TYPE_TRACK, 'presentation/source')
        file_path = path.join(self.baseDir, 'episode.xml')
        mp.add(file_path, mediapackage.TYPE_CATALOG, 'dublincore/episode')
        self.assertEqual(len(mp.getElements()), 3)

    def test_fromXML(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(mp.title, "Opening a folder...")
        self.assertEqual(mp.getIdentifier(),
                         "dae91194-2114-481b-8908-8a8962baf8dc")
        self.assertEqual(mp.status, 0)
        self.assertEqual(mp.properties['notes'],
                         u"Nota de Prueba <?php Caracteres ñ I'm raros >")

    def test_fromXML_without_galicaster_xml(self):
        logger = context.get_logger()
        xml = path.join(self.baseDir, 'wrongmp', 'manifest.xml')
        mp = fromXML(xml, logger)
        self.assertEqual(mp.title, "Opening a folder...")
        self.assertEqual(mp.getIdentifier(),
                         "dae91194-2114-481b-8908-8a8962baf8dc")
        self.assertEqual(mp.status, 4)

    def test_mediapackage_size(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(mp.getSize(), 598)

    def test_mediapackage_get_oc_capture_agent_property(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_capture_agent_properties,
               mediapackage.TYPE_ATTACHMENT,
               identifier='org.opencastproject.capture.agent.properties')

        self.assertEqual(mp.getOCCaptureAgentProperty('capture.device.names'),
                         'camera,screen,audio')
        self.assertNotEqual(
            mp.getOCCaptureAgentProperty('capture.device.names.error'),
            'camera,screen,audio')

        mp2 = mediapackage.Mediapackage()
        self.assertNotEqual(
            mp2.getOCCaptureAgentProperty('capture.device.names'),
            'camera,screen,audio')

        self.assertEqual(
            mp.getOCCaptureAgentProperties(), {
                u'org.opencastproject.workflow.config.trimHold': 'false',
                u'capture.device.names': 'camera,screen,audio',
                u'org.opencastproject.workflow.definition': 'full',
                u'event.series': 'f16b43df-d1d4-4a85-8989-c060b85cea8d',
                u'event.title': 'Clase 2',
                u'event.location': 'GC-Etna',
                u'org.opencastproject.workflow.config.captionHold': 'false'
            })

    def test_mp_and_operations(self):
        xml = path.join(self.baseDir, 'manifest.xml')
        mp = fromXML(xml)
        self.assertEqual(0, len(mp.operation))

    def test_properties(self):
        mp = mediapackage.Mediapackage()
        mp.setTitle('title')
        self.assertEqual(mp.title, 'title')
        self.assertEqual(mp.metadata_episode['title'], 'title')
        self.assertEqual(mp.getMetadataByName('title'), 'title')

        now = datetime.datetime.now()
        timeok = False
        if (mp.getMetadataByName('created') < now + datetime.timedelta(10)
                and mp.getMetadataByName('created') >
                now - datetime.timedelta(10)):
            timeok = True
        self.assertTrue(timeok)

        mp.setIdentifier('12345')
        mp.setNewIdentifier()
        self.assertTrue(mp.getIdentifier() != '12345')

        self.assertEqual(mp.getMetadataByName('test'), None)
        self.assertEqual(mp.getMetadataByName('seriestitle'), None)
        self.assertEqual(mp.getMetadataByName('ispartof'), {
            'title': None,
            'identifier': None
        })

        mp.setMetadataByName('seriestitle', 'testseries')
        self.assertEqual(mp.getMetadataByName('seriestitle'), 'testseries')

        mp.setSeriesTitle('test2')
        self.assertEqual(mp.getSeriesTitle(), 'test2')

        mp.setCreator('someone')
        self.assertEqual(mp.getCreator(), 'someone')

        mp.setLicense('Creative Commons')
        self.assertEqual(mp.getLicense(), 'Creative Commons')

        mp.setContributor('contributor1')
        self.assertEqual(mp.getContributor(), 'contributor1')

        mp.setLanguage('language1')
        self.assertEqual(mp.getLanguage(), 'language1')

        mp.setDescription('description1')
        self.assertEqual(mp.getDescription(), 'description1')

        now = datetime.datetime.now()
        mp.setLocalDate(now)
        self.assertEqual(mp.getLocalDate(), now)

        self.assertEqual(mp.getStartDateAsString(), now.isoformat())
        aux = time.time()
        utcdiff = datetime.datetime.utcfromtimestamp(
            aux) - datetime.datetime.fromtimestamp(aux)
        self.assertEqual(mp.getStartDateAsString(True, False),
                         (now + utcdiff).isoformat())
        self.assertEqual(mp.getStartDateAsString(False, True),
                         unicode(mp.getDate() - utcdiff))
        self.assertEqual(mp.getStartDateAsString(False, False),
                         unicode(mp.getDate()))

        mp.setSeries(None)
        self.assertEqual(mp.metadata_series, {
            'title': None,
            'identifier': None
        })
        self.assertEqual(mp.metadata_episode["isPartOf"], None)

    def test_getAsDict(self):
        mp = mediapackage.Mediapackage()
        mp.add(self.path_track1, mediapackage.TYPE_TRACK,
               "presentation/source", None, 532)
        mp.add(self.path_track2, mediapackage.TYPE_TRACK, "presenter/source",
               None, 532)
        mp.add(self.path_catalog, mediapackage.TYPE_CATALOG, "catalog/source")
        mp.add(self.path_attach, mediapackage.TYPE_ATTACHMENT,
               "attachment/source")
        mp.add(self.path_other, mediapackage.TYPE_OTHER, "other/source")

        info = mp.getAsDict()
        self.assertTrue(info.has_key('id'))
        self.assertTrue(info.has_key('title'))
        self.assertTrue(info.has_key('status'))
        self.assertTrue(info.has_key('start'))
        self.assertTrue(info.has_key('creator'))
        self.assertTrue(info.has_key('tracks'))

    def test_element_tags(self):
        self.assertTrue(self.track1.getTags(), ['archive'])
        self.track1.addTag('engage')
        self.assertTrue(self.track1.getTags(), ['archive', 'engage'])
        self.track1.removeTag('archive')
        self.assertEqual(self.track1.getTags(), ['engage'])
        self.assertTrue(self.track1.containsTag('engage'))
        self.assertEqual(self.track1.containsTag('archive'), False)
        self.track1.setTags(['test', 'sometag'])
        self.assertEqual(self.track1.containsTag('engage'), False)
        self.track1.clearTags()
        self.assertEqual(self.track1.getTags(), set([]))

    def test_element_set_uri(self):
        self.assertEqual(
            self.track1.uri,
            path.join(get_resource('mediapackage'), 'SCREEN.mpeg'))
        self.track1.setURI(self.path_track2)
        self.assertEqual(
            self.track1.uri,
            path.join(get_resource('mediapackage'), 'CAMERA.mpeg'))

    def test_element_set_mime(self):
        self.assertEqual(self.track1.mime, None)
        self.track1.setMimeType('video/mp4')
        self.assertEqual(self.track1.mime, 'video/mp4')

    def test_element_set_flavor(self):
        self.assertEqual(self.track1.flavor, 'presentation/source')
        self.track1.setFlavor('presenter/source')
        self.assertEqual(self.track1.flavor, 'presenter/source')

    def test_element_set_mp(self):
        mp = mediapackage.Mediapackage()
        self.track1.setMediapackage(mp)
        string = 'test'
        self.assertRaises(TypeError, self.track1.setMediapackage, string)
Beispiel #39
0
class TestFunctions(TestCase):

    baseDir = get_resource('mediapackage')
    path_track1 = os.path.join(baseDir, 'SCREEN.mpeg')
    path_track2 = os.path.join(baseDir, 'CAMERA.mpeg')
    path_catalog = os.path.join(baseDir, 'episode.xml')
    path_attach = os.path.join(baseDir, 'attachment.txt')
    path_other = os.path.join(baseDir, 'manifest.xml')

    def setUp(self):
        self.track1 = mediapackage.Track(uri=self.path_track1,
                                         duration=532,
                                         flavor="presentation/source",
                                         mimetype="video/mpeg")
        self.track2 = mediapackage.Track(uri=self.path_track2,
                                         duration=532,
                                         flavor="presenter/source",
                                         mimetype="video/mpeg")
        self.catalog = mediapackage.Catalog(uri=self.path_catalog,
                                            flavor="catalog/source",
                                            mimetype="text/xml")
        self.tmppath = mkdtemp()

    def tearDown(self):
        rmtree(self.tmppath)

    def get_folders_in_repository(self, d):
        folders_list = [
            os.path.join(d, o) for o in os.listdir(d)
            if (os.path.isdir(os.path.join(d, o)) and not 'attach' in
                (os.path.join(d, o)) and not 'rectemp' in (os.path.join(d, o)))
        ]
        return folders_list

    def test_create_repository(self):
        repo = repository.Repository()
        self.assertTrue(repo.root, os.path.expanduser('~/Repository'))
        self.assertTrue(repo.get_attach_path(),
                        os.path.expanduser('~/Repository/attach'))
        root = '/tmp'
        repo = repository.Repository(root)
        self.assertTrue(os.path.isdir('/tmp/attach/'))
        root = '/tmp/AAA'
        repo = repository.Repository(root)
        self.assertTrue(os.path.isdir('/tmp/AAA/attach/'))

    def test_repository(self):
        root = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
                            'resources')
        repo = repository.Repository(root)
        self.assertEqual(repo.size(), 1)

    def test_big_repository(self):
        root = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..',
                            'resources', 'repository')
        repo = repository.Repository(root)
        self.assertEqual(len(repo), 5)
        self.assertEqual(len(repo.list_by_status(mediapackage.FAILED)), 1)

        for (key, mp) in list(repo.items()):
            self.assertTrue(mp.getDuration() >= 0)

        self.assertEqual(
            repo["dae91194-2114-481b-8908-8a8962baf8da"].getIdentifier(),
            "dae91194-2114-481b-8908-8a8962baf8da")

        self.assertFalse(
            repo.get("dae91194-2114-481b-8908-8a8962baf8da").manual)
        self.assertTrue(
            repo.get("dae91194-2114-481b-8908-8a8962baf8db").manual)
        self.assertFalse(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dd").manual)
        self.assertTrue(
            repo.get("dae91194-2114-481b-8908-8a8962baf8de").manual)

        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8da").status,
            mediapackage.SCHEDULED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8db").status,
            mediapackage.RECORDING)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dc").status,
            mediapackage.RECORDED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8dd").status,
            mediapackage.FAILED)
        self.assertEqual(
            repo.get("dae91194-2114-481b-8908-8a8962baf8de").status,
            mediapackage.RECORDED)

        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8da").operations),
            0)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8db").operations),
            0)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8dc").operations),
            1)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8dd").operations),
            2)
        self.assertEqual(
            len(repo.get("dae91194-2114-481b-8908-8a8962baf8de").operations),
            3)

        mp_duration = repo.get(
            "dae91194-2114-481b-8908-8a8962baf8da").getDuration()
        self.assertEqual(mp_duration, 2106)
        track_duration = repo.get("dae91194-2114-481b-8908-8a8962baf8da"
                                  ).getTrack("track-1").getDuration()
        self.assertEqual(track_duration, 2160)

    @skip("need special configuration")
    def test_add(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)

        repo.add(mp)
        self.assertRaises(KeyError, repo.add, mp)
        self.assertEqual(repo.size(), 1)

    @skip("need special configuration")
    def test_update(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        self.assertRaises(KeyError, repo.update, mp)

        repo.add(mp)
        self.assertEqual(repo.size(), 1)

        mp.metadata_episode["title"] = "new Title"

        repo.update(mp)
        self.assertEqual(repo.size(), 1)

    @skip("need special configuration")
    def test_delete(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        repo.add(mp)
        self.assertEqual(repo.size(), 1)

        repo.delete(mp)
        self.assertEqual(repo.size(), 0)
        self.assertEqual(len(os.listdir(self.tmppath)), 2)  #attach and rectemp

    @skip("need special configuration")
    def test_bad_delete(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.add(self.track1)
        mp.add(self.track2)
        mp.add(self.catalog)
        mp.metadata_episode["title"] = "Title"

        self.assertRaises(KeyError, repo.delete, mp)

    def test_bad_add_and_update(self):
        pass

    def __get_tmp_bin(self, name, values):
        tmp_file = mkstemp(name)[1]
        bin = {
            'file': os.path.basename(tmp_file),
            'path': os.path.dirname(tmp_file)
        }
        bin.update(values)
        return bin

    def test_add_after_rec_manual(self):
        duration = 134
        repo = repository.Repository(self.tmppath)
        mp = mediapackage.Mediapackage()
        #TODO file extension to mimetype???
        bins = [
            self.__get_tmp_bin(
                't.avi', {
                    'device': 'test',
                    'name': 'name1',
                    'dev': 'dev1',
                    'mimetype': 'video/mp4',
                    'flavor': 'presenter'
                }),
            self.__get_tmp_bin(
                't.mp4', {
                    'device': 'test',
                    'name': 'name2',
                    'dev': 'dev2',
                    'mimetype': 'video/mp4',
                    'flavor': 'presentation'
                })
        ]

        self.assertTrue(mp.manual)
        repo.add_after_rec(mp, bins, duration)

        self.assertEqual(mp.getDuration(), duration)
        self.assertEqual(len(repo), 1)
        self.assertEqual(len(mp.getTracks()), len(bins))

    def test_add_after_rec_no_manual(self):
        duration = 134
        repo = repository.Repository(self.tmppath)
        mp = mediapackage.Mediapackage()
        repo.add(mp)
        mp.addAttachmentAsString(
            'capture.device.names=name1,name3',
            name='org.opencastproject.capture.agent.properties',
            identifier='org.opencastproject.capture.agent.properties')

        mp.manual = False
        #TODO file extension to mimetype???
        bins = [
            self.__get_tmp_bin(
                't.avi', {
                    'device': 'test',
                    'name': 'name1',
                    'dev': 'dev1',
                    'mimetype': 'video/mp4',
                    'flavor': 'presenter'
                }),
            self.__get_tmp_bin(
                't.mp4', {
                    'device': 'test',
                    'name': 'name2',
                    'dev': 'dev2',
                    'mimetype': 'video/mp4',
                    'flavor': 'presentation'
                })
        ]

        self.assertFalse(mp.manual)
        repo.add_after_rec(mp, bins, duration)

        self.assertEqual(mp.getDuration(), duration)
        self.assertEqual(len(repo), 1)
        self.assertEqual(len(mp.getTracks()), 2)

    def test_get_next_and_past_mediapackages(self):
        repo = repository.Repository(self.tmppath)
        now = datetime.datetime.utcnow()

        mp = mediapackage.Mediapackage(identifier="1",
                                       title='MP#1',
                                       date=(now - datetime.timedelta(days=1)))
        repo.add(mp)
        mp = mediapackage.Mediapackage(identifier="2",
                                       title='MP#2',
                                       date=(now -
                                             datetime.timedelta(days=30)))
        repo.add(mp)
        mp = mediapackage.Mediapackage(identifier="3",
                                       title='MP#3',
                                       date=(now -
                                             datetime.timedelta(days=60)))
        repo.add(mp)
        mp_next = mediapackage.Mediapackage(identifier="4",
                                            title='MP#4',
                                            date=(now +
                                                  datetime.timedelta(days=1)))
        repo.add(mp_next)
        mp = mediapackage.Mediapackage(identifier="5",
                                       title='MP#5',
                                       date=(now +
                                             datetime.timedelta(days=30)))
        repo.add(mp)

        self.assertEqual(repo.get_next_mediapackage(), mp_next)
        self.assertEqual(len(repo.get_next_mediapackages()), 2)
        self.assertEqual(len(repo.get_past_mediapackages()), 3)
        self.assertEqual(len(repo.get_past_mediapackages(40)), 1)

    def test_repair_inconsistencies(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.status = mediapackage.RECORDED
        mp.setOpStatus("pr0", mediapackage.OP_IDLE)
        mp.setOpStatus("pr1", mediapackage.OP_PENDING)
        mp.setOpStatus("pr2", mediapackage.OP_PROCESSING)
        mp.setOpStatus("pr3", mediapackage.OP_DONE)
        mp.setOpStatus("pr4", mediapackage.OP_FAILED)

        repo.add(mp)
        repo.repair_inconsistencies(mp)

        self.assertEqual(mp.status, mediapackage.RECORDED)
        self.assertEqual(mp.getOpStatus("pr0"), mediapackage.OP_IDLE)
        self.assertEqual(mp.getOpStatus("pr1"), mediapackage.OP_FAILED)
        self.assertEqual(mp.getOpStatus("pr2"), mediapackage.OP_FAILED)
        self.assertEqual(mp.getOpStatus("pr3"), mediapackage.OP_DONE)
        self.assertEqual(mp.getOpStatus("pr4"), mediapackage.OP_FAILED)

    def test_repo_lifecycle(self):
        repo = repository.Repository(self.tmppath)

        mp = mediapackage.Mediapackage()
        mp.title = 'lifecycle test MP'
        self.assertEqual(len(repo), 0)

        repo.add_after_rec(mp, [], 30)
        self.assertEqual(len(repo), 1)

        for catalog in mp.getCatalogs():
            self.assertEqual(mp.getURI(), os.path.dirname(catalog.getURI()))
            self.assertTrue(
                os.path.isfile(catalog.getURI()),
                'The catalog path {0} not exists'.format(catalog.getURI()))

    def test_folder_name_template(self):
        repo = repository.Repository(self.tmppath, 'test',
                                     'gc_{hostname}_m{second}')

        mp = mediapackage.Mediapackage()
        repo.add(mp)
        self.assertEqual(
            mp.getURI(),
            os.path.join(
                repo.root, 'gc_{hostname}_m{second}'.format(
                    hostname="test", second=mp.getDate().strftime('%S'))))

    def test_folder_name_template_no_alphanumeric(self):
        repo = repository.Repository(self.tmppath, 'test',
                                     'Foo-Bar[!!??]-{hostname}_m{second}')

        mp = mediapackage.Mediapackage()
        repo.add(mp)
        self.assertEqual(
            mp.getURI(),
            os.path.join(
                repo.root, 'FooBar{hostname}_m{second}'.format(
                    hostname="test", second=mp.getDate().strftime('%S'))))

    def test_folder_name_template_unique(self):
        repo = repository.Repository(self.tmppath, 'test', 'test')

        mp1 = mediapackage.Mediapackage()
        mp2 = mediapackage.Mediapackage()
        mp3 = mediapackage.Mediapackage()

        repo.add(mp1)
        self.assertEqual(mp1.getURI(), os.path.join(repo.root, 'test'))
        repo.add(mp2)
        self.assertEqual(mp2.getURI(), os.path.join(repo.root, 'test_2'))
        repo.add(mp3)
        self.assertEqual(mp3.getURI(), os.path.join(repo.root, 'test_3'))

    def test_save_temprec_on_crash(self):
        repo = repository.Repository(self.tmppath, 'test', 'test')

        for file_name in ('CAMERA.avi', 'SCREEN.avi'):
            f = open(repo.get_rectemp_path(file_name), 'w')
            f.write("DATA" * 1000)
            f.close()

        open(repo.get_rectemp_path("None.avi"), 'w').close()

        # After crash. Create a new repo
        repo = repository.Repository(self.tmppath, 'test', 'test')
        num_files = num_backup_files = 0
        for name in os.listdir(repo.get_rectemp_path()):
            full_path = os.path.join(repo.get_rectemp_path(), name)
            if os.path.isfile(full_path) and os.path.getsize(full_path):
                num_files += 1
            if os.path.isdir(full_path):
                num_backup_files = len(os.listdir(full_path))

        self.assertEqual(num_files, 0)
        self.assertEqual(num_backup_files, 2)

    def test_recover_recording(self):
        repo_folder = get_resource('repository')
        rectemp_aux = get_resource('utils/temporary_recording')
        rectemp = get_resource('repository/rectemp')

        # Read info.json
        info = {}
        info_filename = os.path.join(rectemp_aux, 'info.json')
        with open(info_filename, 'r') as handle:
            info = json.load(handle)

        # Modify path of tracks
        for indx, track in enumerate(info['tracks']):
            info['tracks'][indx]['path'] = rectemp

        # Copy temporary files
        for temp_file in os.listdir(rectemp_aux):
            full_path = os.path.join(rectemp_aux, temp_file)
            copy(full_path, os.path.join(rectemp, temp_file))

        # Overwrite info.json with new paths
        f = open(os.path.join(rectemp, 'info.json'), 'w')
        f.write(json.dumps(info, indent=4, sort_keys=True))
        f.close()

        # Get old length
        old_length = len(self.get_folders_in_repository(repo_folder))

        # Create the repository
        from galicaster.core import context
        logger = context.get_logger()
        repo = repository.Repository(
            repo_folder, '',
            'gc_{hostname}_{year}-{month}-{day}T{hour}h{minute}m{second}',
            logger)

        # Check 1
        self.assertEqual(old_length + 1,
                         len(self.get_folders_in_repository(repo_folder)))

        # Check 2
        mp = repo.get('4ea1049f-c946-4d36-95d4-b8d01223bd73')
        self.assertNotEqual(mp, None)
        mp_info = mp.getAsDict()
        self.assertEqual(mp_info['status'], 4)
        self.assertTrue('Recovered' in mp_info['title'])
        self.assertEqual(len(mp_info['tracks']), 2)

        # Clean
        for temp_file in os.listdir(rectemp):
            os.remove(os.path.join(rectemp, temp_file))
        repo.delete(mp)
Beispiel #40
0
    def setUp(self):
        conf_file = get_resource('profile/conf_good.ini')
        conf_dist_file = get_resource('profile/conf-dist.ini')
        folder_path = get_resource('profile/folder')

        self.conf = Conf(conf_file,conf_dist_file, folder_path)
Beispiel #41
0
 def test_init_all_files(self):
     conf_file = get_resource('conf/conf.ini')
     conf_dist_file = get_resource('conf/conf-dist.ini')
     conf = Conf(conf_file, conf_dist_file)
     self.assertEqual(conf_file, conf.conf_file)
     self.assertEqual(conf_dist_file, conf.conf_dist_file)
Beispiel #42
0

@pytest.fixture()
def tmp_py(tmp_dir: Path):
    yield tmp_dir / f"{secrets.token_hex(8)}.py"


@pytest.fixture()
def tmp_yaml(tmp_dir: Path):
    yield tmp_dir / f"{secrets.token_hex(8)}.yaml"


@pytest.mark.parametrize(
    "pipeline_yaml",
    [
        T("Hello World", get_resource("hello_world.yaml")),
        T("CF Deployment", get_resource("simple_cf_deploy.yaml")),
        T("Simple Python pipeline", get_resource("simple_python.yaml")),
        # Testflight ymls from https://github.com/concourse/concourse/tree/master/testflight/fixtures
        T("archive-pipeline-1.yml", "archive-pipeline-1.yml"),
        T("archive-pipeline-2.yml", "archive-pipeline-2.yml"),
        T("archive-pipeline-3.yml", "archive-pipeline-3.yml"),
        T("caching.yml", "caching.yml"),
        T("clear-task-cache.yml", "clear-task-cache.yml"),
        T("config-test.yml", "config-test.yml"),
        T("config_params.yml", "config_params.yml"),
        T(
            "container_limits.yml", "container_limits.yml"
        ),  # Memory limit not int -> 1GB
        T(
            "container_limits_failing.yml", "container_limits_failing.yml"
Beispiel #43
0
 def setUp(self):
     conf_file = get_resource('conf/conf.ini')
     dist_file = get_resource('conf/conf-dist.ini')
     self.conf = Conf(conf_file,dist_file)