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
import pushRelease
import listCurrentReleases
import upgradeRelease
import revertRelease
import showHistory
import deleteRelease


class TestIOC(unittest.TestCase):
    '''Pushing to a facility that does not have the iocTop for this package should not actually push the files across.'''

    testDataFolder = "/tmp"

    def setUp(self):
        self.testDataFolder = testUtils.getTestFolder()
        testUtils.createStdIOCFolders()
 
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.iocTestFolder))
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder))
        
    def test_pushListUpgradeEtc(self):
        '''Pushing to a facility that does not have the iocTop for this package should not actually push the files across.'''
        startingDir = os.path.realpath(os.curdir)
        testPushPkgName = "test1_specific_package"
        testPushVersionName = "testPush_V1"
        testUtils.createNewIOCRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)
        testUtils.cd(startingDir)
        # Now look into iocTop to make sure the release made it
        for facility in toolconfig.getListOfFacilities():
            arg = [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', testPushPkgName)]
            lsresult = multi_facility_process_helper.ls(arg)
            if globals.verbose:
                print "lsresult is ", lsresult
            file2details = {}
            for details in lsresult:
                file2details[details['name']] = details
            if facility == 'test1':
                self.assertTrue(testPushVersionName in file2details)
                releaseitself = [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                releaseDetails = {}
                for details in releaselsresult:
                    releaseDetails[details['name']] = details
                self.assertTrue('README' in releaseDetails)
                self.assertTrue('iocBoot' in releaseDetails)
                self.assertTrue(not releaseDetails['README']['isFolder'])
                self.assertTrue(releaseDetails['iocBoot']['isFolder'])
                self.assertTrue(not releaseDetails['README']['isLink'])
                self.assertTrue(not releaseDetails['iocBoot']['isLink'])
            else:
                self.assertTrue(testPushVersionName not in file2details)
                releaseitself = [os.path.join(self.testDataFolder, testUtils.iocTestFolder, facility, 'iocTop', testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                self.assertTrue(not releaselsresult)
                
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])
        listCurrentReleases.execute(args + ['-i'])
        
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', 'testPush_V1']
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        
        testPushVersionName = "testPush_V2"
        testUtils.createNewIOCRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)
        
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        revertArgs = ['-f', 'ALL', '-i', 'ALL']
        if globals.verbose:
            revertArgs.append('-v')
        revertRelease.execute(revertArgs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)
        
        
        testPushVersionName = "testPush_V3"
        testUtils.createNewIOCRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.IOCWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        # V1 is no longer used, so we should be able to delete...
        delargs = ['testPush_V1']
        if globals.verbose:
            delargs.append('-v')
        deleteRelease.execute(delargs)

        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])
        

        # This needs to be the last line        
        testUtils.cd(startingDir)


class TestHLA(unittest.TestCase):
    '''Pushing to a facility that does not have the HLATop for this package should not actually push the files across.'''

    testDataFolder = "/tmp"

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

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

    def test_pushListUpgradeEtc(self):
        '''Pushing to a facility that does not have the HLATop for this package should not actually push the files across.'''
        startingDir = os.path.realpath(os.curdir)
        testPushPkgName = "test1_specific_package"
        testPushVersionName = "testPush_V1"
        testUtils.createNewHLARelease(testPushPkgName, testPushVersionName)
        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)
        testUtils.cd(startingDir)
        # Now look into hlaTop to make sure the release made it
        for facility in toolconfig.getListOfFacilities():
            arg = [os.path.join(self.testDataFolder, testUtils.HLATestFolder, facility, 'physicsTop', 'release',
                                testPushPkgName)]
            print arg
            lsresult = multi_facility_process_helper.ls(arg)
            if globals.verbose:
                print "lsresult is ", lsresult
            file2details = {}
            for details in lsresult:
                file2details[details['name']] = details
            if facility == 'test1':
                self.assertTrue(testPushVersionName in file2details)
                releaseitself = [
                    os.path.join(self.testDataFolder, testUtils.HLATestFolder, facility, 'physicsTop', 'release',
                                 testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                releaseDetails = {}
                for details in releaselsresult:
                    releaseDetails[details['name']] = details
                self.assertTrue('README' in releaseDetails)
            else:
                self.assertTrue(testPushVersionName not in file2details)
                releaseitself = [
                    os.path.join(self.testDataFolder, testUtils.HLATestFolder, facility, 'physicsTop', 'release',
                                 testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                self.assertTrue(not releaselsresult)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])
        listCurrentReleases.execute(args + ['-i'])

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', 'testPush_V1']
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testPushVersionName = "testPush_V2"
        testUtils.createNewHLARelease(testPushPkgName, testPushVersionName)
        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        revertArgs = ['-f', 'ALL', '-i', 'ALL']
        if globals.verbose:
            revertArgs.append('-v')
        revertRelease.execute(revertArgs)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)

        testPushVersionName = "testPush_V3"
        testUtils.createNewHLARelease(testPushPkgName, testPushVersionName)
        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(
            os.path.join(self.testDataFolder, testUtils.HLAWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        # V1 is no longer used, so we should be able to delete...
        delargs = ['testPush_V1']
        if globals.verbose:
            delargs.append('-v')
        deleteRelease.execute(delargs)

        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])

        # This needs to be the last line
        testUtils.cd(startingDir)


class TestPyDM(unittest.TestCase):
    '''Pushing to a facility that does not have the PyDMTop for this package should not actually push the files across.'''

    testDataFolder = "/tmp"

    def setUp(self):
        self.testDataFolder = testUtils.getTestFolder()
        testUtils.createStdPyDMFolders()
 
        
    def tearDown(self):
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.PyDMTestFolder))
        shutil.rmtree(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder))
        
    def test_pushListUpgradeEtc(self):
        '''Pushing to a facility that does not have the PyDMTop for this package should not actually push the files across.'''
        startingDir = os.path.realpath(os.curdir)
        testPushPkgName = "pydm-test1_specific_subsys"
        testPushVersionName = "testPush_V1"
        testUtils.createNewPyDMRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)
        testUtils.cd(startingDir)
        # Now look into pydmTop to make sure the release made it
        for facility in toolconfig.getListOfFacilities():
            arg = [os.path.join(self.testDataFolder, testUtils.PyDMTestFolder, facility, 'pydmTop', 'release', testPushPkgName)]
            print arg
            lsresult = multi_facility_process_helper.ls(arg)
            if globals.verbose:
                print "lsresult is ", lsresult
            file2details = {}
            for details in lsresult:
                file2details[details['name']] = details
            if facility == 'test1':
                self.assertTrue(testPushVersionName in file2details)
                releaseitself = [os.path.join(self.testDataFolder, testUtils.PyDMTestFolder, facility, 'pydmTop', 'release', testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                releaseDetails = {}
                for details in releaselsresult:
                    releaseDetails[details['name']] = details
                self.assertTrue('README' in releaseDetails)
            else:
                self.assertTrue(testPushVersionName not in file2details)
                releaseitself = [os.path.join(self.testDataFolder, testUtils.PyDMTestFolder, facility, 'pydmTop', 'release', testPushPkgName, testPushVersionName)]
                releaselsresult = multi_facility_process_helper.ls(releaseitself)
                if globals.verbose:
                    print "releaselsresult is ", releaselsresult
                self.assertTrue(not releaselsresult)
                
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])
        listCurrentReleases.execute(args + ['-i'])
        
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', 'testPush_V1']
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        
        testPushVersionName = "testPush_V2"
        testUtils.createNewPyDMRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)
        
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        revertArgs = ['-f', 'ALL', '-i', 'ALL']
        if globals.verbose:
            revertArgs.append('-v')
        revertRelease.execute(revertArgs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        showHistory.execute(args)
        
        
        testPushVersionName = "testPush_V3"
        testUtils.createNewPyDMRelease(testPushPkgName, testPushVersionName)
        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        args = []
        if globals.verbose:
            args.append('-v')
        pushRelease.execute(args)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        upargs = ['-f', 'ALL', '-i', 'ALL', testPushVersionName]
        if globals.verbose:
            upargs.append('-v')
        upgradeRelease.execute(upargs)

        testUtils.cd(os.path.join(self.testDataFolder, testUtils.PyDMWorkspaceFolder, testPushPkgName, testPushVersionName))
        listCurrentReleases.execute(args)

        # V1 is no longer used, so we should be able to delete...
        delargs = ['testPush_V1']
        if globals.verbose:
            delargs.append('-v')
        deleteRelease.execute(delargs)

        listCurrentReleases.execute(args + ['-p'])
        listCurrentReleases.execute(args + ['-u'])
        

        # This needs to be the last line        
        testUtils.cd(startingDir)
