def test_hd_video(token):
    # TODO: Check resolution, size, duration etc

    logging.info("In HD video test")
    for app in [conf.RTMP, conf.RTMP_HLS]:
        push_retry = 0
        success = False
        while push_retry < 5 and not success:
            logging.info("Stream attempt: %d", push_retry + 1)
            push_retry += 1
            multitask = utils.Multitask()
            publisher = utils.Ffmpeg()
            publisher.input(conf.VIDEOS["HD"])
            publisher.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    token), '-f', 'flv')

            logging.info("When subscribed with an valid resource-id")
            subscriber = utils.Ffmpeg()
            subscriber.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    token))

            multitask.return_dict[conf.PLAY_VALID] = None
            multitask.return_dict[conf.PUSH_VALID] = None

            multitask.add(subscriber.get_dimensions, conf.PUSH_VALID,
                          conf.PLAY_VALID)
            multitask.add(publisher.push, conf.PUSH_VALID)

            multitask.run()

            logging.debug(multitask.return_dict[conf.PLAY_VALID],
                          multitask.return_dict[conf.PUSH_VALID])

            if multitask.return_dict[
                    conf.PUSH_VALID] and multitask.return_dict[
                        conf.PLAY_VALID]:
                if utils.validate_dimension(
                        conf.VIDEOS["HD"],
                        multitask.return_dict[conf.PLAY_VALID]):
                    success = True
        assert success

        logging.info("HD video test with %s has passed", app)

    logging.info("All HD video tests have passed!")
def test_load(token):

    logging.info("In load tests")
    for app in [conf.RTMP, conf.RTMP_HLS]:
        for res_id in conf.RESOURCE_ID.values():
            logging.debug("Trying with %s", res_id)
            push_retry = 0
            success = False
            while push_retry < 5 and not success:

                logging.info("Stream attempt %d", push_retry + 1)

                push_retry += 1
                multitask = utils.Multitask()
                publisher = utils.Ffmpeg()
                publisher.input(conf.VIDEOS["countdown"])
                publisher.output(utils.get_rtmp_path(app, res_id, token), '-f',
                                 'flv')

                logging.info("subscribing with %s", res_id)
                subscriber = utils.Ffmpeg()
                subscriber.output(utils.get_rtmp_path(app, res_id, token))

                multitask.return_dict[conf.PLAY_VALID] = None
                multitask.return_dict[conf.PUSH_VALID] = None

                multitask.add(subscriber.play, conf.PUSH_VALID,
                              conf.PLAY_VALID)
                multitask.add(publisher.push, conf.PUSH_VALID)

                multitask.run()

                logging.debug(multitask.return_dict[conf.PLAY_VALID],
                              multitask.return_dict[conf.PUSH_VALID])

                if multitask.return_dict[
                        conf.PUSH_VALID] and multitask.return_dict[
                            conf.PLAY_VALID]:
                    success = True

            assert success
            logging.info("Passed with app %s and id %s", [app], [res_id])

    logging.info('All load tests have passed!')
def test_live_stream(token):
    multitask = utils.Multitask()

    publisher = utils.Ffmpeg()
    publisher.input(conf.LIVE_STREAM)
    publisher.output(
        utils.get_rtmp_path(conf.RTMP, conf.RESOURCE_ID["test-resource-1"],
                            token), 'f', 'flv')

    subscriber = utils.Ffmpeg()
    subscriber.input(
        utils.get_rtmp_path(conf.RTMP, conf.RESOURCE_ID["test-resource-1"],
                            token))

    multitask.add(publisher.push, conf.PUSH_VALID, 100)
    # multitask.add(subscriber.get_frame_rate, conf.FRAME_RATE)
    multitask.run()
    logging.debug(multitask.return_dict)
    assert (multitask.return_dict['frame_rate'] > 0)

    logging.info("Live Stream Test passed!")
def test_record_length(token):
    logging.info("In Record Test")
    multitask = utils.Multitask()

    src_path = conf.RECORD_SRC_DIR
    wm = pyinotify.WatchManager()
    wm.add_watch(src_path, pyinotify.IN_CLOSE_WRITE, utils.inCloseWrite)
    notifier = pyinotify.Notifier(wm)

    publisher = utils.Ffmpeg()
    publisher.input(conf.VIDEOS["countdown"])
    publisher.output(
        utils.get_rtmp_path(conf.RTMP_HLS, conf.RESOURCE_ID["test-resource-1"],
                            token), '-f', 'flv')

    multitask.add(notifier.loop)
    multitask.add(publisher.push, conf.PUSH_VALID)
    logging.info("Initialising notifier and video stream")
    multitask.run()
def test_hls(token):
    success = False

    multitask = utils.Multitask()
    publisher = utils.Ffmpeg()

    logging.info("Published with asha video")
    publisher.input(conf.VIDEOS["countdown"])
    publisher.filter('-c:v', 'libx264', '-preset', 'veryfast', '-maxrate',
                     '3000k', '-bufsize', '6000k', '-pix_fmt', 'yuv420p', '-g',
                     '50', '-c:a', 'aac', '-b:a', '160k', '-ac', '2', '-ar',
                     '44100')
    publisher.output(
        utils.get_rtmp_path(conf.RTMP_HLS, conf.RESOURCE_ID["test-resource-1"],
                            token), '-f', 'flv')

    logging.info("Subscribing with HLS")
    subscriber = utils.Ffmpeg()
    subscriber.output(None, conf.RESOURCE_ID["test-resource-1"], token)

    multitask.return_dict[conf.PUSH_VALID] = None
    multitask.return_dict[conf.PLAY_VALID] = None

    multitask.add(subscriber.hls, conf.PUSH_VALID, conf.PLAY_VALID)
    multitask.add(publisher.push, conf.PUSH_VALID)

    multitask.run()

    logging.debug(multitask.return_dict[conf.PLAY_VALID],
                  multitask.return_dict[conf.PUSH_VALID])

    if (multitask.return_dict[conf.PUSH_VALID]
            and multitask.return_dict[conf.PLAY_VALID] == 200):
        success = True

    assert success

    print('All HLS tests have passed!', file=sys.stderr)
def test_token(token):
    logging.info("In token-related tests")
    incorrect_token = utils.generate_random_chars()

    # ***************when publisher has valid token*************

    logging.info("When video is published with a valid token")

    for app in [conf.RTMP, conf.RTMP_HLS]:
        push_retry = 0
        success = False
        while push_retry < 5 and not success:

            logging.info("Stream attempt %d", push_retry + 1)

            push_retry += 1

            multitask = utils.Multitask()
            publisher = utils.Ffmpeg()
            publisher.input(conf.VIDEOS["countdown"])
            publisher.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    token), '-f', 'flv')

            logging.info("When subscribed with a valid token")
            subscriber = utils.Ffmpeg()
            subscriber.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    token))

            logging.info("When subscribed with an invalid token")
            subscriber2 = utils.Ffmpeg()
            subscriber2.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    incorrect_token))

            multitask.return_dict[conf.PLAY_VALID] = None
            multitask.return_dict[conf.PLAY_INVALID] = None
            multitask.return_dict[conf.PUSH_VALID] = None

            multitask.add(subscriber.play, conf.PUSH_VALID, conf.PLAY_VALID)
            multitask.add(publisher.push, conf.PUSH_VALID)
            multitask.add(subscriber2.play, conf.PUSH_VALID, conf.PLAY_INVALID)

            multitask.run()

            logging.debug(multitask.return_dict[conf.PLAY_VALID],
                          multitask.return_dict[conf.PUSH_VALID],
                          multitask.return_dict[conf.PLAY_INVALID])
            if (multitask.return_dict[conf.PUSH_VALID]
                    and multitask.return_dict[conf.PLAY_VALID]
                    and not multitask.return_dict[conf.PLAY_INVALID]):
                success = True
        logging.info("%s publish with valid token has passed!", app)
        assert success

    # ***************when publisher has incorrect token*************

    logging.info("When video is published with an invalid token")

    for app in [conf.RTMP, conf.RTMP_HLS]:
        push_retry = 0
        success = False
        while push_retry < 5 and not success:

            logging.info("Stream attempt %d", push_retry + 1)

            push_retry += 1
            multitask = utils.Multitask()
            publisher = utils.Ffmpeg()
            publisher.input(conf.VIDEOS["countdown"])
            publisher.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    incorrect_token), '-f', 'flv')

            logging.info("When subscribed with a valid token")
            subscriber = utils.Ffmpeg()
            subscriber.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    token))

            logging.info("When subscribed with an invalid token")
            subscriber2 = utils.Ffmpeg()
            subscriber2.output(
                utils.get_rtmp_path(app, conf.RESOURCE_ID["test-resource-1"],
                                    incorrect_token))

            multitask.return_dict[conf.PLAY_VALID] = None
            multitask.return_dict[conf.PLAY_INVALID] = None
            multitask.return_dict[conf.PUSH_VALID] = None

            multitask.add(subscriber.play, conf.PUSH_VALID, conf.PLAY_VALID)
            multitask.add(publisher.push, conf.PUSH_VALID)
            multitask.add(subscriber2.play, conf.PUSH_VALID, conf.PLAY_INVALID)

            multitask.run()

            logging.debug(multitask.return_dict[conf.PLAY_VALID],
                          multitask.return_dict[conf.PUSH_VALID],
                          multitask.return_dict[conf.PLAY_INVALID])

            if (not multitask.return_dict[conf.PUSH_VALID]
                    and not multitask.return_dict[conf.PLAY_VALID]
                    and not multitask.return_dict[conf.PLAY_INVALID]):
                success = True
        assert success
        logging.info("%s publish with an invalid token has passed!", app)

    logging.info("All access token related tests have passed!")