#!/usr/bin/env python
'''
Copyright (C) 2010-2014, Digium, Inc.
David Vossel <dvossel@digium.com>
Matt Jordan <mjordan@digium.com>

This program is free software, distributed under the terms of
the GNU General Public License Version 2.
'''

import sys
import os
import math
import logging

from twisted.internet import reactor

sys.path.append("lib/python/asterisk")
from test_case import TestCase

testdir = "tests/apps/mixmonitor"

LOGGER = logging.getLogger(__name__)

class MixMonitorTest(TestCase):
    def __init__(self):
        super(MixMonitorTest, self).__init__()

        self.passed = False
        self.last_step = ""
        # playback file is 2559 bytes of ulaw, that will come out to be ~41118 of wav
        self.expectedfilesize = 41118
        self.filesizetolerance = 5000
        self.audiofile1size = -1
        self.audiofile2size = -1
        self.audiofile3size = -1

        self.audiofile1 = os.path.join(os.getcwd(), "%s/testaudio1" % (testdir))
        self.audiofile2 = os.path.join(os.getcwd(), "%s/testaudio2" % (testdir))
        self.audiofile3 = os.path.join(os.getcwd(), "%s/testaudio3" % (testdir))

        self.talkingaudio = os.path.join(os.getcwd(), "%s/sounds/talking" % (testdir))

        self.create_asterisk()

    def read_result(self):
        self.passed = True
        self.stop_reactor()
        LOGGER.info("Reading result file from MixMonitor")
        if os.path.exists(self.audiofile1 + ".raw"):
            self.audiofile1size = os.path.getsize(self.audiofile1 + ".raw")
        if os.path.exists(self.audiofile2 + ".raw"):
            self.audiofile2size = os.path.getsize(self.audiofile2 + ".raw")
        if os.path.exists(self.audiofile3 + ".raw"):
            self.audiofile3size = os.path.getsize(self.audiofile3 + ".raw")

        LOGGER.debug("audiofile1 size is %d, a negative size indicates the file was not present." % (self.audiofile1size, ))
        if math.fabs(self.audiofile1size - self.expectedfilesize) > self.filesizetolerance:
            # if this failed mixmonitor is not creating the correct file size for the time we expect.
            LOGGER.error("audiofile1 size is not within the size tolerance.")
            self.passed = False

        LOGGER.debug("audiofile2 size is %d, a negative size indicates the file was not present." % (self.audiofile2size, ))
        if math.fabs(self.audiofile2size - self.expectedfilesize) > self.filesizetolerance:
            # if this failed it is likely because StopMixMonitor never let go of audiofile1
            LOGGER.error("audiofile2 size is not within the size tolerance.")
            self.passed = False

        LOGGER.debug("audiofile3 size is %d, a negative size indicates the file was not present." % (self.audiofile3size, ))
        if self.audiofile3size == -1:
            # if this failed it is likely because MixMonitor never let go of audiofile2 on hangup
            LOGGER.error("audiofile3 file does not exist.")
            self.passed = False

        if self.passed == True:
            LOGGER.info("Test Passed... All audio files are the correct.")

    def launch_test1(self):
        LOGGER.info("Placing call to test1 exten")
        self.ami.originate(channel="Local/s@listener",
            context="test1",
            exten="s",
            priority="1")

    def launch_test2(self):
        LOGGER.info("Placing call to test2 exten")
        self.ami.originate(channel="Local/s@listener",
            context="test2",
            exten="s",
            priority="1")

    def check_test1(self, ami, event):
        LOGGER.info("Checking Userevent")
        if event.get("userevent").lower() != "test1":
            return
        status = event.get("status")
        LOGGER.debug("Status of test1 is %s" % (status))
        if status != "SUCCESS":
            self.stop_reactor()
            return

        self.ami.registerEvent("UserEvent", self.check_test2)
        self.launch_test2()

    def check_test2(self, ami, event):
        LOGGER.info("Checking Userevent")
        if event.get("userevent").lower() != "test2":
            return
        status = event.get("status")
        LOGGER.debug("Status of test2 is %s" % (status))
        if status != "SUCCESS":
            self.stop_reactor()
            return

        self.read_result()

    def ami_connect(self, ami):
        self.ami = ami
        self.ami.registerEvent("UserEvent", self.check_test1)

        self.ami.setVar(channel = "", variable = "TESTAUDIO1", value = self.audiofile1)
        self.ami.setVar(channel = "", variable = "TESTAUDIO2", value = self.audiofile2)
        self.ami.setVar(channel = "", variable = "TESTAUDIO3", value = self.audiofile3)
        self.ami.setVar(channel = "", variable = "TALK_AUDIO", value = self.talkingaudio)

        self.launch_test1()

    def run(self):
        self.create_ami_factory()



def main():
    test = MixMonitorTest()
    reactor.run()
    if test.passed:
        return 0
    return 1


if __name__ == "__main__":
    sys.exit(main() or 0)


# vim:sw=4:ts=4:expandtab:textwidth=79
