from __future__ import print_function

import os
import unittest
import shutil
import json
import multi_facility_process_helper
import multi_facility_process_helper_client
import globals
import toolconfig
import testUtils


class TestProcessHelperIOCVersions(unittest.TestCase):

    testDataFolder = "/tmp"

    def setUp(self):
         self.testDataFolder = testUtils.getTestFolder()
         testUtils.createStdIOCFolders()
         
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.iocTestFolder))
        
    def test_determineIOCVersions(self):
        """Test the determineIOCVersions"""
        for facility in toolconfig.getListOfFacilities():
            arg = {}
            arg['name'] = 'testPkg'
            arg['releaseFolder'] = os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, "iocTop")
            arg['linkFolder'] = os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, "iocCommon")
            ret = multi_facility_process_helper.determineIOCVersions(arg)
            if globals.verbose:
                print("IOC versions {0}".format(ret))
            self.assertTrue(ret['master'] == "v1")
            # Package the IOCs into a dict for easy assertions
            iocs = {}
            for ioc in ret['iocs']:
                iocs[ioc['ioc']] = (ioc['release'], ioc['isMaster'])
            self.assertTrue("sioc-" + facility + "-001" in iocs)
            self.assertTrue("sioc-" + facility + "-002" in iocs)
            self.assertTrue("sioc-" + facility + "-003" in iocs)
            self.assertTrue("sioc-" + facility + "-004" in iocs)
            self.assertTrue("sioc-" + facility + "-005" not in iocs)
            self.assertTrue("sioc- " + facility + "-suffix" not in iocs)
            
            self.assertTrue(iocs["sioc-" + facility + "-001"][0] == "v1")
            self.assertTrue(iocs["sioc-" + facility + "-001"][1] == True)
            self.assertTrue(iocs["sioc-" + facility + "-002"][0] == "v1")
            self.assertTrue(iocs["sioc-" + facility + "-002"][1] == True)
            self.assertTrue(iocs["sioc-" + facility + "-003"][0] == "v1")
            self.assertTrue(iocs["sioc-" + facility + "-003"][1] == False)
            self.assertTrue(iocs["sioc-" + facility + "-004"][0] == "v2")
            self.assertTrue(iocs["sioc-" + facility + "-004"][1] == False)


class TestProcessHelperHLAVersions(unittest.TestCase):
    testDataFolder = "/tmp"

    def setUp(self):
        self.testDataFolder = testUtils.getTestFolder()
        testUtils.createStdHLAFolders()

    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.HLATestFolder))

    def test_determineHLAVersions(self):
        """Test the determineHLAVersion"""
        for facility in toolconfig.getListOfFacilities():
            arg = {}
            arg['name'] = 'testPkg'
            arg['releaseFolder'] = os.path.join(self.testDataFolder, testUtils.HLATestFolder, facility, "physicsTop",
                                                "release")
            arg['linkFolder'] = os.path.join(self.testDataFolder, testUtils.HLATestFolder, facility, "physicsTop")
            ret = multi_facility_process_helper.determineHLAVersion(arg)
            self.assertTrue(ret == "v1")


class TestProcessHelperPyDMDisplayVersions(unittest.TestCase):

    testDataFolder = "/tmp"

    def setUp(self):
         self.testDataFolder = testUtils.getTestFolder()
         testUtils.createStdPyDMFolders()
         
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.PyDMTestFolder))
        
    def test_determinePyDMDisplayVersions(self):
        """Test the determinePyDMDisplayVersion"""
        for facility in toolconfig.getListOfFacilities():
            arg = {}
            arg['name'] = 'pydm-testSubsys'
            arg['releaseFolder'] = os.path.join(self.testDataFolder, testUtils.PyDMTestFolder, facility, "pydmTop", "release")
            arg['linkFolder'] = os.path.join(self.testDataFolder, testUtils.PyDMTestFolder, facility, "pydmTop")
            ret = multi_facility_process_helper.determinePyDMDisplayVersion(arg)
            self.assertTrue(ret == "v1")


class TestProcessHelperLS(unittest.TestCase):

    testDataFolder = "/tmp"

    def setUp(self):
         self.testDataFolder = testUtils.getTestFolder()
         testUtils.createStdIOCFolders()
         
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.iocTestFolder))
        
    def test_LS(self):
        """Test the ls by checking against the test iocTop folder"""
        for facility in toolconfig.getListOfFacilities():
            arg = [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg')]
            lsresult = multi_facility_process_helper.ls(arg)
            file2details = {}
            for details in lsresult:
                file2details[details['name']] = details
            self.assertTrue("v1" in file2details)
            self.assertTrue("v2" in file2details)
            self.assertTrue("current" in file2details)
            self.assertTrue("Development" in file2details)
            self.assertTrue("sioc-" + facility + "-001" not in file2details)
            # Check links
            self.assertTrue(file2details['v1']['isLink'] == False)
            self.assertTrue(file2details['current']['isLink'] == True)
            self.assertTrue(file2details['current']['pointingTo'] == 'v1')
            self.assertTrue('pointingTo' not in file2details['v1'])
            # Check isFolder at least for folders
            self.assertTrue(file2details['v1']['isFolder'] == True)
            self.assertTrue(file2details['v2']['isFolder'] == True)
            self.assertTrue(file2details['current']['isFolder'] == True)


class TestRemoteLS(unittest.TestCase):

    testDataFolder = "/tmp"

    def setUp(self):
         self.testDataFolder = testUtils.getTestFolder()
         testUtils.createStdIOCFolders()
         
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.iocTestFolder))
        
    def test_RemoteLS(self):
        """Test the ls by checking against the test iocTop folder, but remotely."""
        for facility in toolconfig.getListOfFacilities():
            commandsAndArgs = []
            commandsAndArgs.append(('ls', [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg'), os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'nonexistentPkg')]))
            results = multi_facility_process_helper_client.executeCommandsOnFacility('test1', commandsAndArgs)
            lsresult = results[0]
            if globals.verbose:
                print("After remote execution, results is {0}".format(lsresult))
            file2details = {}
            for details in lsresult:
                file2details[details['name']] = details
            self.assertTrue("v1" in file2details)
            self.assertTrue("v2" in file2details)
            self.assertTrue("current" in file2details)
            self.assertTrue("Development" in file2details)
            self.assertTrue("sioc-" + facility + "-001" not in file2details)
            # Check links
            self.assertTrue(file2details['v1']['isLink'] == False)
            self.assertTrue(file2details['current']['isLink'] == True)
            self.assertTrue(file2details['current']['pointingTo'] == 'v1')
            self.assertTrue('pointingTo' not in file2details['v1'])
            # Check isFolder at least for folders
            self.assertTrue(file2details['v1']['isFolder'] == True)
            self.assertTrue(file2details['v2']['isFolder'] == True)
            self.assertTrue(file2details['current']['isFolder'] == True)
        
        
class TestRemoteFileInfo(unittest.TestCase):

    testDataFolder = "/tmp"

    def setUp(self):
         self.testDataFolder = testUtils.getTestFolder()
         testUtils.createStdIOCFolders()
         
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.iocTestFolder))
        
    def test_RemoteFileInfo(self):
        """Test the fileinfo remotely."""
        for facility in toolconfig.getListOfFacilities():
            commandsAndArgs = []
            commandsAndArgs.append(('fileinfo', [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg'), os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg', 'current'), os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'nonexistentPkg')]))
            results = multi_facility_process_helper_client.executeCommandsOnFacility('test1', commandsAndArgs)
            fileinforesult = results[0]
            if globals.verbose:
                print("After remote execution, results is {0}".format(fileinforesult))
            self.assertTrue(os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg') in fileinforesult)
            self.assertTrue(os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg', 'current') in fileinforesult)
            self.assertTrue(os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'nonexistentPkg') not in fileinforesult)
            # Check links
            self.assertTrue(fileinforesult[os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg', 'current')]['isLink'] == True)
            self.assertTrue(fileinforesult[os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg')]['isLink'] == False)
            # Check isFolder at least for folders
            self.assertTrue(fileinforesult[os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg', 'current')]['isFolder'] == True)
            self.assertTrue(fileinforesult[os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', 'testPkg')]['isFolder'] == True)

                
