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", 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 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 ", 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 ", 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)

                
