#!/usr/bin/env python
# The  test has been  developed by Robert Harakaly and changed for SAM by Victor Galaktionov
# get the replica entries associated with a LFC file in the name server (lfc_getreplica) 
# meta: proxy=true
# meta: preconfig=../../LFC-config

import os, lfc, sys, errno
from testClass import _test, _ntest, _testRunner, SAM_Run, LFC_VO, TEST_HOME

class test_OK_name(_test):
    def info(self):
	return "Test existing replica (name): "
    def prepare(self):
        self.sfn="sfn://test-se.cern.ch" +  LFC_VO + "/hary/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO + "/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        lfc.lfc_addreplica(self.guid, None, os.getenv("LFC_HOST"), self.sfn, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn)
        lfc.lfc_unlink(self.name)
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica(self.name, "", "")
        return (list,ret)
    def ret(self):
        retval=lfc.lfc_filereplica()
        retval.status="D"
        retval.sfn=self.sfn
        return retval
    def compare(self, testVal, retVal):
        (ret, retRetVal) = retVal
        (test, testRetVal) = testVal
        retval = True
        if (retRetVal == testRetVal):
            retval = retval & ( test[0].sfn == ret.sfn )
        else:
            retval = False
        return retval

class test_OK_guid(_test):
    def info(self):
        return "Test existing replica (guid): "
    def prepare(self):
        self.sfn="sfn://test-se.cern.ch" + LFC_VO + "/hary/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO +"/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        lfc.lfc_addreplica(self.guid, None, os.getenv("LFC_HOST"), self.sfn, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn)
        lfc.lfc_unlink(self.name)
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica("", self.guid, "")
        return (list,ret)
    def ret(self):
        retval=lfc.lfc_filereplica()
        retval.fileid=25159L
        retval.status="D"
        retval.sfn=self.sfn
        return retval
    def compare(self, testVal, retVal):
        (ret, retRetVal) = retVal
        (test, testRetVal) = testVal
        retval = True
        if (retRetVal == testRetVal):
            retval = retval & ( test[0].sfn == ret.sfn )
        else:
            retval = False
        return retval

class test_OK(_test):
    def info(self):
        return "Test existing replica (both): "
    def prepare(self):
        self.sfn="sfn://test-se.cern.ch" + LFC_VO +"/hary/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO +"/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        lfc.lfc_addreplica(self.guid, None, os.getenv("LFC_HOST"), self.sfn, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn)
        lfc.lfc_unlink(self.name)
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica(self.name, self.guid, "")
        return (list,ret)
    def ret(self):
        retval=lfc.lfc_filereplica()
        retval.fileid=25159L
        retval.status="D"
        retval.sfn=self.sfn
        return retval
    def compare(self, testVal, retVal):
        (ret, retRetVal) = retVal
        (test, testRetVal) = testVal
        retval = True
        if (retRetVal == testRetVal):
            retval = retval & ( test[0].sfn == ret.sfn )
        else:
            retval = False
        return retval

class test_OK_se(_test):
    def info(self):
        return "Test SE filter: "
    def prepare(self):
        self.sfn1="sfn://test-se.cern.ch"  + LFC_VO + "/hary/lfc_getreplica_test"
	self.sfn2="sfn://test-se.in2p3.fr" + LFC_VO + "/hary/lfc_getreplica_test"
        self.sfn3="sfn://test-se.cern.ch"  + LFC_VO + "/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO +"/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        lfc.lfc_addreplica(self.guid, None, "test-se.cern.ch", self.sfn1, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid, None, "test-se.in2p3.fr", self.sfn2, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid, None, "test-se.cern.ch", self.sfn3, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn1)
        lfc.lfc_delreplica(self.guid, None, self.sfn2)
        lfc.lfc_delreplica(self.guid, None, self.sfn3)
        lfc.lfc_unlink(self.name)
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica(self.name, self.guid, "test-se.cern.ch")
        return (list,ret)
    def ret(self):
        retval=[]
        retval.append(lfc.lfc_filereplica())
        retval.append(lfc.lfc_filereplica())
        retval[0].sfn = self.sfn1
        retval[1].sfn = self.sfn3

        return retval
    def compare(self, testVal, retVal):
        (ret, retRetVal) = retVal
        (test, testRetVal) = testVal
        retval = True
        if ((retRetVal == testRetVal) & ( len(test) == 2 )):
            retval = retval & ( test[0].sfn == ret[0].sfn )
            retval = retval & ( test[1].sfn == ret[1].sfn )
        else:
            retval = False
        return retval

class test_EINVAL1(_ntest):
    def info(self):
        return "Test existing replica nonmatching guid/name (EINVAL):"
    def prepare(self):
        self.sfn="sfn://test-se.cern.ch" + LFC_VO +"/hary/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO +"/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        self.name1= LFC_VO +"/lfc_getreplica_test1"
        self.guid1=self.get_guid()
        lfc.lfc_creatg(self.name1, self.guid1, 0664)
        lfc.lfc_addreplica(self.guid, None, os.getenv("LFC_HOST"), self.sfn, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn)
        lfc.lfc_unlink(self.name)
        lfc.lfc_unlink(self.name1)
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica(self.name1, self.guid, "")
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.EINVAL)
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (test, testerr, testRetVal) = testVal
        if ((retRetVal == testRetVal) & (reterr == testerr)):
            retval = True
        else:
            retval = False
        return retval

class test_EINVAL2(_ntest):
    def info(self):
        return "Test guid length exeeds CA_MAXGUILEN (EINVAL): "
    def test(self):
        guid = ""
        for i in range (0,lfc.CA_MAXGUIDLEN+1):
            guid = guid + "a"
        ret, list = lfc.lfc_getreplica("", guid, "")
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.EINVAL)
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (test, testerr, testRetVal) = testVal
        if ((retRetVal == testRetVal) & (reterr == testerr)):
            retval = True
        else:
            retval = False
        return retval

class test_EINVAL3(_ntest):
    def info(self):
        return "Test SE name length exeeds CA_MAXGUILEN (EINVAL): "
    def prepare(self):
        self.sfn1="sfn://test-se.cern.ch" + LFC_VO +"/hary/lfc_getreplica_test"
        self.sfn2="sfn://test-se.in2p3.fr"+ LFC_VO + "/hary/lfc_getreplica_test"
        self.sfn3="sfn://test-se.cern.ch" + LFC_VO + "/lfc_getreplica_test"
        self.guid=self.get_guid()
        self.name= LFC_VO +"/lfc_getreplica_test"
        lfc.lfc_creatg(self.name, self.guid, 0664)
        lfc.lfc_addreplica(self.guid, None, "test-se.cern.ch", self.sfn1, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid, None, "test-se.in2p3.fr", self.sfn2, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid, None, "test-se.cern.ch", self.sfn3, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid, None, self.sfn1)
        lfc.lfc_delreplica(self.guid, None, self.sfn2)
        lfc.lfc_delreplica(self.guid, None, self.sfn3)
        lfc.lfc_unlink(self.name)
    def test(self):
        se = ""
        for i in range (0,lfc.CA_MAXNAMELEN+1):
            se = se + "a"
        ret, list = lfc.lfc_getreplica(self.name, self.guid, se)
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.EINVAL) 
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (test, testerr, testRetVal) = testVal
        if ((retRetVal == testRetVal) & (reterr == testerr)):
            retval = True
        else:
            retval = False
        return retval

class test_ENOENT(_ntest):
    def info(self):
        return "Test existing replica nonexisting file (ENOENT): "
    def prepare(self):
        self.name= LFC_VO +"/lfc_getreplica_test"
    def test(self):
        filereplica=lfc.lfc_filereplica()
        ret, list = lfc.lfc_getreplica(self.name, "", "")
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.ENOENT)
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (test, testerr, testRetVal) = testVal
        if ((retRetVal == testRetVal) & (reterr == testerr)):
            retval = True
        else:
            retval = False
        return retval


class lfc_getreplica_test(_testRunner):
    def __init__(self):
        self.name = "lfc_getreplica_test_test"
        self.tests=[test_OK_name, test_OK_guid, test_OK, test_OK_se, test_EINVAL1, test_EINVAL2, test_EINVAL3, test_ENOENT]



#************* Interface for SAM and Python tests ***************
SAM_Run(lfc_getreplica_test)

