def testGetStatus( self ):
        running = Status( string='running' )
        StatusManager.create( self.jobDir, running )
        sm = StatusManager()
        recieved_status = sm.getStatus( self.jobDir )
        self.assertEqual( recieved_status , running )
        os.unlink( self.filename )

        killed = Status( string='killed' , message= "your job has been canceled" )
        StatusManager.create( self.jobDir, killed )
        sm = StatusManager()
        recieved_status = sm.getStatus( self.jobDir )
        self.assertEqual( recieved_status , killed )
        os.unlink( self.filename )
    def testCreation(self):
        #create( filename , status )
        unknown = Status( code = -1 )
        StatusManager.create( self.jobDir , unknown )
        doc = etree.parse( self.filename )
        root = doc.getroot()
        self.assertEqual( root.tag , 'status' )
        children = list(root)
        self.assertEqual( len( children ) , 2 )
        self.assertEqual( children[0].tag , 'value')
        self.assertEqual( children[0].text , 'unknown' )
        self.assertEqual( children[1].tag , 'message')
        self.assertEqual( children[1].text , None )
        os.unlink( self.filename )

        building = Status( code = 0 )
        StatusManager.create( self.jobDir, building )
        doc = etree.parse( self.filename )
        root = doc.getroot()
        self.assertEqual( root.tag , 'status' )
        children = list(root)
        self.assertEqual( len( children ) , 2 )
        self.assertEqual( children[0].tag , 'value')
        self.assertEqual( children[0].text , 'building' )
        self.assertEqual( children[1].tag , 'message')
        self.assertEqual( children[1].text , None )
        os.unlink( self.filename )

        submitted = Status( code = 1, message= 'test message' )
        StatusManager.create( self.jobDir, submitted )
        doc = etree.parse( self.filename )
        root = doc.getroot()
        self.assertEqual( root.tag , 'status' )
        children = list(root)
        self.assertEqual( len( children ) , 2 )
        self.assertEqual( children[0].tag , 'value')
        self.assertEqual( children[0].text , 'submitted' )
        self.assertEqual( children[1].tag , 'message')
        self.assertEqual( children[1].text , 'test message' )
        os.unlink( self.filename )

        running = Status( string='running' )
        StatusManager.create( self.jobDir, running )
        doc = etree.parse( self.filename )
        root = doc.getroot()
        self.assertEqual( root.tag , 'status' )
        children = list(root)
        self.assertEqual( len( children ) , 2 )
        self.assertEqual( children[0].tag , 'value')
        self.assertEqual( children[0].text , 'running' )
        self.assertEqual( children[1].tag , 'message')
        self.assertEqual( children[1].text , None )
        os.unlink( self.filename )
    def testConcurency(self):
        status = Status( string='submitted' )
        StatusManager.create( self.jobDir, status )

        ## sub-process start
        childPid = os.fork()
        if childPid: #father
            sleep(1)
            sm = StatusManager()
            self.assertEqual( status , sm.getStatus( self.jobDir ) )
            self.assertRaises( IOError , sm.setStatus , self.jobDir, status )
            os.kill( childPid , signal.SIGALRM )
            os.wait()

        else: #child
            signal.signal(signal.SIGALRM, handler)
            File = open( self.filename , 'r' )
            fcntl.lockf( File , fcntl.LOCK_SH | fcntl.LOCK_NB )
            signal.pause()
            fcntl.lockf( File , fcntl.LOCK_UN  )
            File.close()
            os._exit(0)
        ## sub-process end

        ## sub-process start
        childPid = os.fork()
        if childPid: #father
            sleep(1)
            sm = StatusManager()
            recieved_status = sm.getStatus( self.jobDir )
            self.assertEqual( recieved_status , Status( string= "unknown" )  )
            self.assertRaises( IOError , sm.setStatus , self.jobDir, status )
            os.kill( childPid , signal.SIGALRM )
            os.wait()

        else: #child
            signal.signal(signal.SIGALRM, handler)
            File = open( self.filename , 'r+' )
            fcntl.lockf( File , fcntl.LOCK_EX | fcntl.LOCK_NB )
            signal.pause()
            fcntl.lockf( File , fcntl.LOCK_UN  )
            File.close()
            os._exit(0)
    def testSetstatus( self):
        StatusManager.create( self.jobDir, Status( string='submitted' ) )

        pending = Status( string= 'pending' )
        sm = StatusManager()
        sm.setStatus( self.jobDir , pending )
        recieved_status = sm.getStatus( self.jobDir )
        self.assertEqual( recieved_status , pending )

        finished = Status( string='finished' , message = 'your job finnished with an unusual status code, check youre results carefully')
        sm.setStatus( self.jobDir , finished )
        recieved_status = sm.getStatus( self.jobDir )
        self.assertEqual( recieved_status , finished )

        #an ended status cannot be changed anymore
        running = Status( string= 'running')
        sm.setStatus( self.jobDir , running )
        recieved_status = sm.getStatus( self.jobDir )
        self.assertNotEqual( recieved_status , running )
        self.assertEqual( recieved_status , finished )
        os.unlink( self.filename )