#!/usr/bin/env python
# test has been developed by Robert Harakaly and changed for SAM by Victor Galaktionov
# get  the  replica entries associated with a list of GUIDs (lfc_getreplicas) 
# 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(_test):
    def info(self):
        return "Test OK: "
    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.guid1=self.get_guid()
        self.name1= LFC_VO + "/lfc_getreplica_test1"
        self.guid2=self.get_guid()
        self.name2= LFC_VO + "/lfc_getreplica_test2"

        lfc.lfc_creatg(self.name1, self.guid1, 0664)
        lfc.lfc_creatg(self.name2, self.guid2, 0664)

        lfc.lfc_addreplica(self.guid1, None, "test-se.cern.ch", self.sfn1, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid2, None, "test-se.in2p3.fr", self.sfn2, '-', 'D', "", "")
    def clean(self):
        lfc.lfc_delreplica(self.guid1, None, self.sfn1)
        lfc.lfc_delreplica(self.guid2, None, self.sfn2)
        lfc.lfc_unlink(self.name1)
        lfc.lfc_unlink(self.name2)

    def test(self):
        ret, list = lfc.lfc_getreplicas([self.guid1, self.guid2], "")
        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.sfn2

        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_OK_se(_test):
    def info(self):
        return "Test SE filter: "
    def prepare(self):
        self.sfn11="sfn://test-se.cern.ch"  + LFC_VO + "/hary/lfc_getreplica_test"
	self.sfn12="sfn://test-se.in2p3.fr" + LFC_VO + "/hary/lfc_getreplica_test"
        self.sfn13="sfn://test-se.cern.ch"  + LFC_VO + "/lfc_getreplica_test"
        self.sfn21="sfn://test-se.cern.ch"  + LFC_VO + "/hary/lfc_getreplica_test1"
        self.sfn22="sfn://test-se.in2p3.fr" + LFC_VO + "/hary/lfc_getreplica_test1"

        self.guid1=self.get_guid()
        self.name1= LFC_VO + "/lfc_getreplica_test1"
        self.guid2=self.get_guid()
        self.name2= LFC_VO + "/lfc_getreplica_test2"

        lfc.lfc_creatg(self.name1, self.guid1, 0664)
        lfc.lfc_creatg(self.name2, self.guid2, 0664)

        lfc.lfc_addreplica(self.guid1, None, "test-se.cern.ch", self.sfn11, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid1, None, "test-se.in2p3.fr", self.sfn12, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid1, None, "test-se.cern.ch", self.sfn13, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid2, None, "test-se.cern.ch", self.sfn21, '-', 'D', "", "")
        lfc.lfc_addreplica(self.guid2, None, "test-se.in2p3.fr", self.sfn22, '-', 'D', "", "")
 
    def clean(self):
        lfc.lfc_delreplica(self.guid1, None, self.sfn11)
        lfc.lfc_delreplica(self.guid1, None, self.sfn12)
        lfc.lfc_delreplica(self.guid1, None, self.sfn13)
        lfc.lfc_unlink(self.name1)
        lfc.lfc_delreplica(self.guid2, None, self.sfn22)
        lfc.lfc_delreplica(self.guid2, None, self.sfn21)
        lfc.lfc_unlink(self.name2)
    def test(self):
        ret, list = lfc.lfc_getreplicas([self.guid1,self.guid2], "test-se.cern.ch")
        return (list,ret)
    def ret(self):
        retval=[]
        retval.append(lfc.lfc_filereplica())
        retval.append(lfc.lfc_filereplica())
        retval.append(lfc.lfc_filereplica())
        retval[0].sfn = self.sfn11
        retval[1].sfn = self.sfn13
        retval[2].sfn = self.sfn21

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

class test_EINVAL1(_ntest):
    def info(self):
        return "Test guid length exeeds CA_MAXGUIDLEN (EINVAL):"
    def test(self):
        guid = "a" * (lfc.CA_MAXGUIDLEN+2)
        ret, list = lfc.lfc_getreplicas([guid], "")
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.EINVAL)
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (list, serrno, testRetVal) = testVal

        if serrno != 0:
            return False

        for item in list:
            if item.errcode != reterr:
                return False
	
        return True

class test_EINVAL2(_ntest):
    def info(self):
        return "Test SE name length exeeds CA_MAXNAMELEN (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 = "a" * (lfc.CA_MAXNAMELEN + 2)
        ret, list = lfc.lfc_getreplicas([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.guid = self.get_guid()
    def test(self):
        ret, list = lfc.lfc_getreplicas([self.guid], "")
        return (list,lfc.cvar.serrno,ret)
    def ret(self):
        return (None, errno.ENOENT)
    def compare(self, testVal, retVal):
        ((ret, reterr), retRetVal) = retVal
        (list, serrno, testRetVal) = testVal

        if serrno != 0:
            return False

        for item in list:
            if item.errcode != reterr:
                return False

        return True


class lfc_getreplicas_test(_testRunner):
    def __init__(self):
        self.name = "lfc_getreplicas_test"
        self.tests=[test_OK, test_OK_se, test_EINVAL1, test_EINVAL2, test_ENOENT]


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

