def testSpacesAroundAction(self): for line in (' ^Hello World -> Boo', ' ^Hello World -> Boo', ' ^Hello World -> Boo'): self.failUnlessEqual(str(textfsm.TextFSMRule(line)), ' ^Hello World -> Boo') # A '->' without a leading space is considered part of the matching line. self.failUnlessEqual( ' A simple line-> Boo -> Next', str(textfsm.TextFSMRule(' A simple line-> Boo -> Next')))
def testFSMRule(self): # Basic line, no action line = ' ^A beer called ${beer}' r = textfsm.TextFSMRule(line) self.failUnlessEqual(r.match, '^A beer called ${beer}') self.failUnlessEqual(r.line_op, '') self.failUnlessEqual(r.new_state, '') self.failUnlessEqual(r.record_op, '') # Multiple matches line = ' ^A $hi called ${beer}' r = textfsm.TextFSMRule(line) self.failUnlessEqual(r.match, '^A $hi called ${beer}') self.failUnlessEqual(r.line_op, '') self.failUnlessEqual(r.new_state, '') self.failUnlessEqual(r.record_op, '') # Line with action. line = ' ^A beer called ${beer} -> Next' r = textfsm.TextFSMRule(line) self.failUnlessEqual(r.match, '^A beer called ${beer}') self.failUnlessEqual(r.line_op, 'Next') self.failUnlessEqual(r.new_state, '') self.failUnlessEqual(r.record_op, '') # Line with record. line = ' ^A beer called ${beer} -> Continue.Record' r = textfsm.TextFSMRule(line) self.failUnlessEqual(r.match, '^A beer called ${beer}') self.failUnlessEqual(r.line_op, 'Continue') self.failUnlessEqual(r.new_state, '') self.failUnlessEqual(r.record_op, 'Record') # Line with new state. line = ' ^A beer called ${beer} -> Next.NoRecord End' r = textfsm.TextFSMRule(line) self.failUnlessEqual(r.match, '^A beer called ${beer}') self.failUnlessEqual(r.line_op, 'Next') self.failUnlessEqual(r.new_state, 'End') self.failUnlessEqual(r.record_op, 'NoRecord') # Bad syntax tests. self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSMRule, ' ^A beer called ${beer} -> Next Next Next') self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSMRule, ' ^A beer called ${beer} -> Boo.hoo') self.failUnlessRaises( textfsm.TextFSMTemplateError, textfsm.TextFSMRule, ' ^A beer called ${beer} -> Continue.Record $Hi')
def testFSMRule(self): # Basic line, no action line = ' ^A beer called ${beer}Δ' r = textfsm.TextFSMRule(line) self.assertEqual(r.match, '^A beer called ${beer}Δ') self.assertEqual(r.line_op, '') self.assertEqual(r.new_state, '') self.assertEqual(r.record_op, '')
def testInvalidStates(self): # 'Continue' should not accept a destination. self.assertRaises(textfsm.TextFSMTemplateError, textfsm.TextFSMRule, '^.* -> Continue Start') # 'Error' accepts a text string but "next' state does not. self.assertEqual(str(textfsm.TextFSMRule(' ^ -> Error "hi there"')), ' ^ -> Error "hi there"') self.assertRaises(textfsm.TextFSMTemplateError, textfsm.TextFSMRule, '^.* -> Next "Hello World"')
def testImplicitDefaultRules(self): for line in (' ^A beer called ${beer} -> Record End', ' ^A beer called ${beer} -> End', ' ^A beer called ${beer} -> Next.NoRecord End', ' ^A beer called ${beer} -> Clear End', ' ^A beer called ${beer} -> Error "Hello World"'): r = textfsm.TextFSMRule(line) self.failUnlessEqual(str(r), line) for line in (' ^A beer called ${beer} -> Next "Hello World"', ' ^A beer called ${beer} -> Record.Next', ' ^A beer called ${beer} -> Continue End', ' ^A beer called ${beer} -> Beer End'): self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSMRule, line)
def testValidateFSM(self): # No Values. f = cStringIO.StringIO('\nNotStart\n') self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSM, f) # No states. f = cStringIO.StringIO('Value unused (.)\n\n') self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSM, f) # No 'Start' state. f = cStringIO.StringIO('Value unused (.)\n\nNotStart\n') self.failUnlessRaises(textfsm.TextFSMTemplateError, textfsm.TextFSM, f) # Has 'Start' state with valid destination f = cStringIO.StringIO('Value unused (.)\n\nStart\n') t = textfsm.TextFSM(f) t.states['Start'] = [] t.states['Start'].append(textfsm.TextFSMRule('^.* -> Start')) t._ValidateFSM() # Invalid destination. t.states['Start'].append(textfsm.TextFSMRule('^.* -> bogus')) self.failUnlessRaises(textfsm.TextFSMTemplateError, t._ValidateFSM) # Now valid again. t.states['bogus'] = [] t.states['bogus'].append(textfsm.TextFSMRule('^.* -> Start')) t._ValidateFSM() # Valid destination with options. t.states['bogus'] = [] t.states['bogus'].append( textfsm.TextFSMRule('^.* -> Next.Record Start')) t._ValidateFSM() # Error with and without messages string. t.states['bogus'] = [] t.states['bogus'].append(textfsm.TextFSMRule('^.* -> Error')) t._ValidateFSM() t.states['bogus'].append(textfsm.TextFSMRule('^.* -> Error "Boo hoo"')) t._ValidateFSM()