diff options
| author | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
|---|---|---|
| committer | kx <kx@radix.pro> | 2024-06-04 06:43:08 +0300 |
| commit | 7e2ccccace24636f29ddc210b94606abd4c7e42b (patch) | |
| tree | 545d43ea12671048956cafeb12303e84d601e571 /BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py | |
| parent | 27b044605cd5f6b33a3d231576003850b3fe305b (diff) | |
| download | edk2-trunk.tar.xz | |
Renormalized end-of-lines from master@27b044605cd5f6b33a3d231576003850b3fe305btrunk
Diffstat (limited to 'BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py')
| -rw-r--r-- | BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py | 1056 |
1 files changed, 528 insertions, 528 deletions
diff --git a/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py b/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py index bac127f8e2..4addd32577 100644 --- a/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py +++ b/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py @@ -1,528 +1,528 @@ -## @file
-# This file contain unit test for DecParser
-#
-# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-
-import os
-import unittest
-from Logger.Log import FatalError
-
-from Parser.DecParser import \
- Dec, \
- _DecDefine, \
- _DecLibraryclass, \
- _DecPcd, \
- _DecGuid, \
- FileContent, \
- _DecBase, \
- CleanString
-
-from Object.Parser.DecObject import _DecComments
-
-#
-# Test CleanString
-#
-class CleanStringTestCase(unittest.TestCase):
- def testCleanString(self):
- Line, Comment = CleanString('')
- self.assertEqual(Line, '')
- self.assertEqual(Comment, '')
-
- Line, Comment = CleanString('line without comment')
- self.assertEqual(Line, 'line without comment')
- self.assertEqual(Comment, '')
-
- Line, Comment = CleanString('# pure comment')
- self.assertEqual(Line, '')
- self.assertEqual(Comment, '# pure comment')
-
- Line, Comment = CleanString('line # and comment')
- self.assertEqual(Line, 'line')
- self.assertEqual(Comment, '# and comment')
-
- def testCleanStringCpp(self):
- Line, Comment = CleanString('line // and comment', AllowCppStyleComment = True)
- self.assertEqual(Line, 'line')
- self.assertEqual(Comment, '# and comment')
-
-#
-# Test _DecBase._MacroParser function
-#
-class MacroParserTestCase(unittest.TestCase):
- def setUp(self):
- self.dec = _DecBase(FileContent('dummy', []))
-
- def testCorrectMacro(self):
- self.dec._MacroParser('DEFINE MACRO1 = test1')
- self.failIf('MACRO1' not in self.dec._LocalMacro)
- self.assertEqual(self.dec._LocalMacro['MACRO1'], 'test1')
-
- def testErrorMacro1(self):
- # Raise fatal error, macro name must be upper case letter
- self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE not_upper_case = test2')
-
- def testErrorMacro2(self):
- # No macro name given
- self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE ')
-
-#
-# Test _DecBase._TryBackSlash function
-#
-class TryBackSlashTestCase(unittest.TestCase):
- def setUp(self):
- Content = [
- # Right case
- 'test no backslash',
-
- 'test with backslash \\',
- 'continue second line',
-
- # Do not precede with whitespace
- '\\',
-
- # Empty line after backlash is not allowed
- 'line with backslash \\',
- ''
- ]
- self.dec = _DecBase(FileContent('dummy', Content))
-
- def testBackSlash(self):
- #
- # Right case, assert return values
- #
- ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), [])
- self.assertEqual(ConcatLine, 'test no backslash')
- self.assertEqual(CommentList, [])
-
- ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), [])
- self.assertEqual(CommentList, [])
- self.assertEqual(ConcatLine, 'test with backslash continue second line')
-
- #
- # Error cases, assert raise exception
- #
- self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), [])
- self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), [])
-
-#
-# Test _DecBase.Parse function
-#
-class DataItem(_DecComments):
- def __init__(self):
- _DecComments.__init__(self)
- self.String = ''
-
-class Data(_DecComments):
- def __init__(self):
- _DecComments.__init__(self)
- # List of DataItem
- self.ItemList = []
-
-class TestInner(_DecBase):
- def __init__(self, RawData):
- _DecBase.__init__(self, RawData)
- self.ItemObject = Data()
-
- def _StopCurrentParsing(self, Line):
- return Line == '[TOP]'
-
- def _ParseItem(self):
- Item = DataItem()
- Item.String = self._RawData.CurrentLine
- self.ItemObject.ItemList.append(Item)
- return Item
-
- def _TailCommentStrategy(self, Comment):
- return Comment.find('@comment') != -1
-
-class TestTop(_DecBase):
- def __init__(self, RawData):
- _DecBase.__init__(self, RawData)
- # List of Data
- self.ItemObject = []
-
- # Top parser
- def _StopCurrentParsing(self, Line):
- return False
-
- def _ParseItem(self):
- TestParser = TestInner(self._RawData)
- TestParser.Parse()
- self.ItemObject.append(TestParser.ItemObject)
- return TestParser.ItemObject
-
-class ParseTestCase(unittest.TestCase):
- def setUp(self):
- pass
-
- def testParse(self):
- Content = \
- '''# Top comment
- [TOP]
- # sub1 head comment
- (test item has both head and tail comment) # sub1 tail comment
- # sub2 head comment
- (test item has head and special tail comment)
- # @comment test TailCommentStrategy branch
-
- (test item has no comment)
-
- # test NextLine branch
- [TOP]
- sub-item
- '''
- dec = TestTop(FileContent('dummy', Content.splitlines()))
- dec.Parse()
-
- # Two sections
- self.assertEqual(len(dec.ItemObject), 2)
-
- data = dec.ItemObject[0]
- self.assertEqual(data._HeadComment[0][0], '# Top comment')
- self.assertEqual(data._HeadComment[0][1], 1)
-
- # 3 subitems
- self.assertEqual(len(data.ItemList), 3)
-
- dataitem = data.ItemList[0]
- self.assertEqual(dataitem.String, '(test item has both head and tail comment)')
- # Comment content
- self.assertEqual(dataitem._HeadComment[0][0], '# sub1 head comment')
- self.assertEqual(dataitem._TailComment[0][0], '# sub1 tail comment')
- # Comment line number
- self.assertEqual(dataitem._HeadComment[0][1], 3)
- self.assertEqual(dataitem._TailComment[0][1], 4)
-
- dataitem = data.ItemList[1]
- self.assertEqual(dataitem.String, '(test item has head and special tail comment)')
- # Comment content
- self.assertEqual(dataitem._HeadComment[0][0], '# sub2 head comment')
- self.assertEqual(dataitem._TailComment[0][0], '# @comment test TailCommentStrategy branch')
- # Comment line number
- self.assertEqual(dataitem._HeadComment[0][1], 5)
- self.assertEqual(dataitem._TailComment[0][1], 7)
-
- dataitem = data.ItemList[2]
- self.assertEqual(dataitem.String, '(test item has no comment)')
- # Comment content
- self.assertEqual(dataitem._HeadComment, [])
- self.assertEqual(dataitem._TailComment, [])
-
- data = dec.ItemObject[1]
- self.assertEqual(data._HeadComment[0][0], '# test NextLine branch')
- self.assertEqual(data._HeadComment[0][1], 11)
-
- # 1 subitems
- self.assertEqual(len(data.ItemList), 1)
-
- dataitem = data.ItemList[0]
- self.assertEqual(dataitem.String, 'sub-item')
- self.assertEqual(dataitem._HeadComment, [])
- self.assertEqual(dataitem._TailComment, [])
-
-#
-# Test _DecDefine._ParseItem
-#
-class DecDefineTestCase(unittest.TestCase):
- def GetObj(self, Content):
- Obj = _DecDefine(FileContent('dummy', Content.splitlines()))
- Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()
- return Obj
-
- def testDecDefine(self):
- item = self.GetObj('PACKAGE_NAME = MdePkg')._ParseItem()
- self.assertEqual(item.Key, 'PACKAGE_NAME')
- self.assertEqual(item.Value, 'MdePkg')
-
- def testDecDefine1(self):
- obj = self.GetObj('PACKAGE_NAME')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testDecDefine2(self):
- obj = self.GetObj('unknown_key = ')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testDecDefine3(self):
- obj = self.GetObj('PACKAGE_NAME = ')
- self.assertRaises(FatalError, obj._ParseItem)
-
-#
-# Test _DecLibraryclass._ParseItem
-#
-class DecLibraryTestCase(unittest.TestCase):
- def GetObj(self, Content):
- Obj = _DecLibraryclass(FileContent('dummy', Content.splitlines()))
- Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()
- return Obj
-
- def testNoInc(self):
- obj = self.GetObj('UefiRuntimeLib')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testEmpty(self):
- obj = self.GetObj(' | ')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testLibclassNaming(self):
- obj = self.GetObj('lowercase_efiRuntimeLib|Include/Library/UefiRuntimeLib.h')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testLibclassExt(self):
- obj = self.GetObj('RuntimeLib|Include/Library/UefiRuntimeLib.no_h')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testLibclassRelative(self):
- obj = self.GetObj('RuntimeLib|Include/../UefiRuntimeLib.h')
- self.assertRaises(FatalError, obj._ParseItem)
-
-#
-# Test _DecPcd._ParseItem
-#
-class DecPcdTestCase(unittest.TestCase):
- def GetObj(self, Content):
- Obj = _DecPcd(FileContent('dummy', Content.splitlines()))
- Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()
- Obj._RawData.CurrentScope = [('PcdsFeatureFlag'.upper(), 'COMMON')]
- return Obj
-
- def testOK(self):
- item = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')._ParseItem()
- self.assertEqual(item.TokenSpaceGuidCName, 'gEfiMdePkgTokenSpaceGuid')
- self.assertEqual(item.TokenCName, 'PcdComponentNameDisable')
- self.assertEqual(item.DefaultValue, 'FALSE')
- self.assertEqual(item.DatumType, 'BOOLEAN')
- self.assertEqual(item.TokenValue, '0x0000000d')
-
- def testNoCvar(self):
- obj = self.GetObj('123ai.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testSplit(self):
- obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable FALSE|BOOLEAN|0x0000000d')
- self.assertRaises(FatalError, obj._ParseItem)
-
- obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d | abc')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testUnknownType(self):
- obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|unknown|0x0000000d')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testVoid(self):
- obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|abc|VOID*|0x0000000d')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testUINT(self):
- obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|0xabc|UINT8|0x0000000d')
- self.assertRaises(FatalError, obj._ParseItem)
-
-#
-# Test _DecInclude._ParseItem
-#
-class DecIncludeTestCase(unittest.TestCase):
- #
- # Test code to be added
- #
- pass
-
-#
-# Test _DecGuid._ParseItem
-#
-class DecGuidTestCase(unittest.TestCase):
- def GetObj(self, Content):
- Obj = _DecGuid(FileContent('dummy', Content.splitlines()))
- Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()
- Obj._RawData.CurrentScope = [('guids'.upper(), 'COMMON')]
- return Obj
-
- def testCValue(self):
- item = self.GetObj('gEfiIpSecProtocolGuid={ 0xdfb386f7, 0xe100, 0x43ad,'
- ' {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')._ParseItem()
- self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid')
- self.assertEqual(item.GuidCValue, '{ 0xdfb386f7, 0xe100, 0x43ad, {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')
-
- def testGuidString(self):
- item = self.GetObj('gEfiIpSecProtocolGuid=1E73767F-8F52-4603-AEB4-F29B510B6766')._ParseItem()
- self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid')
- self.assertEqual(item.GuidCValue, '1E73767F-8F52-4603-AEB4-F29B510B6766')
-
- def testNoValue1(self):
- obj = self.GetObj('gEfiIpSecProtocolGuid')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testNoValue2(self):
- obj = self.GetObj('gEfiIpSecProtocolGuid=')
- self.assertRaises(FatalError, obj._ParseItem)
-
- def testNoName(self):
- obj = self.GetObj('=')
- self.assertRaises(FatalError, obj._ParseItem)
-
-#
-# Test Dec.__init__
-#
-class DecDecInitTestCase(unittest.TestCase):
- def testNoDecFile(self):
- self.assertRaises(FatalError, Dec, 'No_Such_File')
-
-class TmpFile:
- def __init__(self, File):
- self.File = File
-
- def Write(self, Content):
- try:
- FileObj = open(self.File, 'w')
- FileObj.write(Content)
- FileObj.close()
- except:
- pass
-
- def Remove(self):
- try:
- os.remove(self.File)
- except:
- pass
-
-#
-# Test Dec._UserExtentionSectionParser
-#
-class DecUESectionTestCase(unittest.TestCase):
- def setUp(self):
- self.File = TmpFile('test.dec')
- self.File.Write(
-'''[userextensions.intel."myid"]
-[userextensions.intel."myid".IA32]
-[userextensions.intel."myid".IA32,]
-[userextensions.intel."myid]
-'''
- )
-
- def tearDown(self):
- self.File.Remove()
-
- def testUserExtentionHeader(self):
- dec = Dec('test.dec', False)
-
- # OK: [userextensions.intel."myid"]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- dec._UserExtentionSectionParser()
- self.assertEqual(len(dec._RawData.CurrentScope), 1)
- self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper())
- self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel')
- self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"')
- self.assertEqual(dec._RawData.CurrentScope[0][3], 'COMMON')
-
- # OK: [userextensions.intel."myid".IA32]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- dec._UserExtentionSectionParser()
- self.assertEqual(len(dec._RawData.CurrentScope), 1)
- self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper())
- self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel')
- self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"')
- self.assertEqual(dec._RawData.CurrentScope[0][3], 'IA32')
-
- # Fail: [userextensions.intel."myid".IA32,]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._UserExtentionSectionParser)
-
- # Fail: [userextensions.intel."myid]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._UserExtentionSectionParser)
-
-#
-# Test Dec._SectionHeaderParser
-#
-class DecSectionTestCase(unittest.TestCase):
- def setUp(self):
- self.File = TmpFile('test.dec')
- self.File.Write(
-'''[no section start or end
-[,] # empty sub-section
-[unknow_section_name]
-[Includes.IA32.other] # no third one
-[PcdsFeatureFlag, PcdsFixedAtBuild] # feature flag PCD must not be in the same section of other types of PCD
-[Includes.IA32, Includes.IA32]
-[Includes, Includes.IA32] # common cannot be with other arch
-[Includes.IA32, PcdsFeatureFlag] # different section name
-''' )
-
- def tearDown(self):
- self.File.Remove()
-
- def testSectionHeader(self):
- dec = Dec('test.dec', False)
- # [no section start or end
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- #[,] # empty sub-section
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- # [unknow_section_name]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- # [Includes.IA32.other] # no third one
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- # [PcdsFeatureFlag, PcdsFixedAtBuild]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- # [Includes.IA32, Includes.IA32]
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- dec._SectionHeaderParser()
- self.assertEqual(len(dec._RawData.CurrentScope), 1)
- self.assertEqual(dec._RawData.CurrentScope[0][0], 'Includes'.upper())
- self.assertEqual(dec._RawData.CurrentScope[0][1], 'IA32')
-
- # [Includes, Includes.IA32] # common cannot be with other arch
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
- # [Includes.IA32, PcdsFeatureFlag] # different section name not allowed
- dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]
- self.assertRaises(FatalError, dec._SectionHeaderParser)
-
-#
-# Test Dec._ParseDecComment
-#
-class DecDecCommentTestCase(unittest.TestCase):
- def testDecHeadComment(self):
- File = TmpFile('test.dec')
- File.Write(
- '''# abc
- ##''')
- dec = Dec('test.dec', False)
- dec.ParseDecComment()
- self.assertEqual(len(dec._HeadComment), 2)
- self.assertEqual(dec._HeadComment[0][0], '# abc')
- self.assertEqual(dec._HeadComment[0][1], 1)
- self.assertEqual(dec._HeadComment[1][0], '##')
- self.assertEqual(dec._HeadComment[1][1], 2)
- File.Remove()
-
- def testNoDoubleComment(self):
- File = TmpFile('test.dec')
- File.Write(
- '''# abc
- #
- [section_start]''')
- dec = Dec('test.dec', False)
- dec.ParseDecComment()
- self.assertEqual(len(dec._HeadComment), 2)
- self.assertEqual(dec._HeadComment[0][0], '# abc')
- self.assertEqual(dec._HeadComment[0][1], 1)
- self.assertEqual(dec._HeadComment[1][0], '#')
- self.assertEqual(dec._HeadComment[1][1], 2)
- File.Remove()
-
-if __name__ == '__main__':
- import Logger.Logger
- Logger.Logger.Initialize()
- unittest.main()
-
+## @file +# This file contain unit test for DecParser +# +# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent + +import os +import unittest +from Logger.Log import FatalError + +from Parser.DecParser import \ + Dec, \ + _DecDefine, \ + _DecLibraryclass, \ + _DecPcd, \ + _DecGuid, \ + FileContent, \ + _DecBase, \ + CleanString + +from Object.Parser.DecObject import _DecComments + +# +# Test CleanString +# +class CleanStringTestCase(unittest.TestCase): + def testCleanString(self): + Line, Comment = CleanString('') + self.assertEqual(Line, '') + self.assertEqual(Comment, '') + + Line, Comment = CleanString('line without comment') + self.assertEqual(Line, 'line without comment') + self.assertEqual(Comment, '') + + Line, Comment = CleanString('# pure comment') + self.assertEqual(Line, '') + self.assertEqual(Comment, '# pure comment') + + Line, Comment = CleanString('line # and comment') + self.assertEqual(Line, 'line') + self.assertEqual(Comment, '# and comment') + + def testCleanStringCpp(self): + Line, Comment = CleanString('line // and comment', AllowCppStyleComment = True) + self.assertEqual(Line, 'line') + self.assertEqual(Comment, '# and comment') + +# +# Test _DecBase._MacroParser function +# +class MacroParserTestCase(unittest.TestCase): + def setUp(self): + self.dec = _DecBase(FileContent('dummy', [])) + + def testCorrectMacro(self): + self.dec._MacroParser('DEFINE MACRO1 = test1') + self.failIf('MACRO1' not in self.dec._LocalMacro) + self.assertEqual(self.dec._LocalMacro['MACRO1'], 'test1') + + def testErrorMacro1(self): + # Raise fatal error, macro name must be upper case letter + self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE not_upper_case = test2') + + def testErrorMacro2(self): + # No macro name given + self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE ') + +# +# Test _DecBase._TryBackSlash function +# +class TryBackSlashTestCase(unittest.TestCase): + def setUp(self): + Content = [ + # Right case + 'test no backslash', + + 'test with backslash \\', + 'continue second line', + + # Do not precede with whitespace + '\\', + + # Empty line after backlash is not allowed + 'line with backslash \\', + '' + ] + self.dec = _DecBase(FileContent('dummy', Content)) + + def testBackSlash(self): + # + # Right case, assert return values + # + ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), []) + self.assertEqual(ConcatLine, 'test no backslash') + self.assertEqual(CommentList, []) + + ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), []) + self.assertEqual(CommentList, []) + self.assertEqual(ConcatLine, 'test with backslash continue second line') + + # + # Error cases, assert raise exception + # + self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), []) + self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), []) + +# +# Test _DecBase.Parse function +# +class DataItem(_DecComments): + def __init__(self): + _DecComments.__init__(self) + self.String = '' + +class Data(_DecComments): + def __init__(self): + _DecComments.__init__(self) + # List of DataItem + self.ItemList = [] + +class TestInner(_DecBase): + def __init__(self, RawData): + _DecBase.__init__(self, RawData) + self.ItemObject = Data() + + def _StopCurrentParsing(self, Line): + return Line == '[TOP]' + + def _ParseItem(self): + Item = DataItem() + Item.String = self._RawData.CurrentLine + self.ItemObject.ItemList.append(Item) + return Item + + def _TailCommentStrategy(self, Comment): + return Comment.find('@comment') != -1 + +class TestTop(_DecBase): + def __init__(self, RawData): + _DecBase.__init__(self, RawData) + # List of Data + self.ItemObject = [] + + # Top parser + def _StopCurrentParsing(self, Line): + return False + + def _ParseItem(self): + TestParser = TestInner(self._RawData) + TestParser.Parse() + self.ItemObject.append(TestParser.ItemObject) + return TestParser.ItemObject + +class ParseTestCase(unittest.TestCase): + def setUp(self): + pass + + def testParse(self): + Content = \ + '''# Top comment + [TOP] + # sub1 head comment + (test item has both head and tail comment) # sub1 tail comment + # sub2 head comment + (test item has head and special tail comment) + # @comment test TailCommentStrategy branch + + (test item has no comment) + + # test NextLine branch + [TOP] + sub-item + ''' + dec = TestTop(FileContent('dummy', Content.splitlines())) + dec.Parse() + + # Two sections + self.assertEqual(len(dec.ItemObject), 2) + + data = dec.ItemObject[0] + self.assertEqual(data._HeadComment[0][0], '# Top comment') + self.assertEqual(data._HeadComment[0][1], 1) + + # 3 subitems + self.assertEqual(len(data.ItemList), 3) + + dataitem = data.ItemList[0] + self.assertEqual(dataitem.String, '(test item has both head and tail comment)') + # Comment content + self.assertEqual(dataitem._HeadComment[0][0], '# sub1 head comment') + self.assertEqual(dataitem._TailComment[0][0], '# sub1 tail comment') + # Comment line number + self.assertEqual(dataitem._HeadComment[0][1], 3) + self.assertEqual(dataitem._TailComment[0][1], 4) + + dataitem = data.ItemList[1] + self.assertEqual(dataitem.String, '(test item has head and special tail comment)') + # Comment content + self.assertEqual(dataitem._HeadComment[0][0], '# sub2 head comment') + self.assertEqual(dataitem._TailComment[0][0], '# @comment test TailCommentStrategy branch') + # Comment line number + self.assertEqual(dataitem._HeadComment[0][1], 5) + self.assertEqual(dataitem._TailComment[0][1], 7) + + dataitem = data.ItemList[2] + self.assertEqual(dataitem.String, '(test item has no comment)') + # Comment content + self.assertEqual(dataitem._HeadComment, []) + self.assertEqual(dataitem._TailComment, []) + + data = dec.ItemObject[1] + self.assertEqual(data._HeadComment[0][0], '# test NextLine branch') + self.assertEqual(data._HeadComment[0][1], 11) + + # 1 subitems + self.assertEqual(len(data.ItemList), 1) + + dataitem = data.ItemList[0] + self.assertEqual(dataitem.String, 'sub-item') + self.assertEqual(dataitem._HeadComment, []) + self.assertEqual(dataitem._TailComment, []) + +# +# Test _DecDefine._ParseItem +# +class DecDefineTestCase(unittest.TestCase): + def GetObj(self, Content): + Obj = _DecDefine(FileContent('dummy', Content.splitlines())) + Obj._RawData.CurrentLine = Obj._RawData.GetNextLine() + return Obj + + def testDecDefine(self): + item = self.GetObj('PACKAGE_NAME = MdePkg')._ParseItem() + self.assertEqual(item.Key, 'PACKAGE_NAME') + self.assertEqual(item.Value, 'MdePkg') + + def testDecDefine1(self): + obj = self.GetObj('PACKAGE_NAME') + self.assertRaises(FatalError, obj._ParseItem) + + def testDecDefine2(self): + obj = self.GetObj('unknown_key = ') + self.assertRaises(FatalError, obj._ParseItem) + + def testDecDefine3(self): + obj = self.GetObj('PACKAGE_NAME = ') + self.assertRaises(FatalError, obj._ParseItem) + +# +# Test _DecLibraryclass._ParseItem +# +class DecLibraryTestCase(unittest.TestCase): + def GetObj(self, Content): + Obj = _DecLibraryclass(FileContent('dummy', Content.splitlines())) + Obj._RawData.CurrentLine = Obj._RawData.GetNextLine() + return Obj + + def testNoInc(self): + obj = self.GetObj('UefiRuntimeLib') + self.assertRaises(FatalError, obj._ParseItem) + + def testEmpty(self): + obj = self.GetObj(' | ') + self.assertRaises(FatalError, obj._ParseItem) + + def testLibclassNaming(self): + obj = self.GetObj('lowercase_efiRuntimeLib|Include/Library/UefiRuntimeLib.h') + self.assertRaises(FatalError, obj._ParseItem) + + def testLibclassExt(self): + obj = self.GetObj('RuntimeLib|Include/Library/UefiRuntimeLib.no_h') + self.assertRaises(FatalError, obj._ParseItem) + + def testLibclassRelative(self): + obj = self.GetObj('RuntimeLib|Include/../UefiRuntimeLib.h') + self.assertRaises(FatalError, obj._ParseItem) + +# +# Test _DecPcd._ParseItem +# +class DecPcdTestCase(unittest.TestCase): + def GetObj(self, Content): + Obj = _DecPcd(FileContent('dummy', Content.splitlines())) + Obj._RawData.CurrentLine = Obj._RawData.GetNextLine() + Obj._RawData.CurrentScope = [('PcdsFeatureFlag'.upper(), 'COMMON')] + return Obj + + def testOK(self): + item = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')._ParseItem() + self.assertEqual(item.TokenSpaceGuidCName, 'gEfiMdePkgTokenSpaceGuid') + self.assertEqual(item.TokenCName, 'PcdComponentNameDisable') + self.assertEqual(item.DefaultValue, 'FALSE') + self.assertEqual(item.DatumType, 'BOOLEAN') + self.assertEqual(item.TokenValue, '0x0000000d') + + def testNoCvar(self): + obj = self.GetObj('123ai.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d') + self.assertRaises(FatalError, obj._ParseItem) + + def testSplit(self): + obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable FALSE|BOOLEAN|0x0000000d') + self.assertRaises(FatalError, obj._ParseItem) + + obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d | abc') + self.assertRaises(FatalError, obj._ParseItem) + + def testUnknownType(self): + obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|unknown|0x0000000d') + self.assertRaises(FatalError, obj._ParseItem) + + def testVoid(self): + obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|abc|VOID*|0x0000000d') + self.assertRaises(FatalError, obj._ParseItem) + + def testUINT(self): + obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|0xabc|UINT8|0x0000000d') + self.assertRaises(FatalError, obj._ParseItem) + +# +# Test _DecInclude._ParseItem +# +class DecIncludeTestCase(unittest.TestCase): + # + # Test code to be added + # + pass + +# +# Test _DecGuid._ParseItem +# +class DecGuidTestCase(unittest.TestCase): + def GetObj(self, Content): + Obj = _DecGuid(FileContent('dummy', Content.splitlines())) + Obj._RawData.CurrentLine = Obj._RawData.GetNextLine() + Obj._RawData.CurrentScope = [('guids'.upper(), 'COMMON')] + return Obj + + def testCValue(self): + item = self.GetObj('gEfiIpSecProtocolGuid={ 0xdfb386f7, 0xe100, 0x43ad,' + ' {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')._ParseItem() + self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid') + self.assertEqual(item.GuidCValue, '{ 0xdfb386f7, 0xe100, 0x43ad, {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}') + + def testGuidString(self): + item = self.GetObj('gEfiIpSecProtocolGuid=1E73767F-8F52-4603-AEB4-F29B510B6766')._ParseItem() + self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid') + self.assertEqual(item.GuidCValue, '1E73767F-8F52-4603-AEB4-F29B510B6766') + + def testNoValue1(self): + obj = self.GetObj('gEfiIpSecProtocolGuid') + self.assertRaises(FatalError, obj._ParseItem) + + def testNoValue2(self): + obj = self.GetObj('gEfiIpSecProtocolGuid=') + self.assertRaises(FatalError, obj._ParseItem) + + def testNoName(self): + obj = self.GetObj('=') + self.assertRaises(FatalError, obj._ParseItem) + +# +# Test Dec.__init__ +# +class DecDecInitTestCase(unittest.TestCase): + def testNoDecFile(self): + self.assertRaises(FatalError, Dec, 'No_Such_File') + +class TmpFile: + def __init__(self, File): + self.File = File + + def Write(self, Content): + try: + FileObj = open(self.File, 'w') + FileObj.write(Content) + FileObj.close() + except: + pass + + def Remove(self): + try: + os.remove(self.File) + except: + pass + +# +# Test Dec._UserExtentionSectionParser +# +class DecUESectionTestCase(unittest.TestCase): + def setUp(self): + self.File = TmpFile('test.dec') + self.File.Write( +'''[userextensions.intel."myid"] +[userextensions.intel."myid".IA32] +[userextensions.intel."myid".IA32,] +[userextensions.intel."myid] +''' + ) + + def tearDown(self): + self.File.Remove() + + def testUserExtentionHeader(self): + dec = Dec('test.dec', False) + + # OK: [userextensions.intel."myid"] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + dec._UserExtentionSectionParser() + self.assertEqual(len(dec._RawData.CurrentScope), 1) + self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper()) + self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel') + self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"') + self.assertEqual(dec._RawData.CurrentScope[0][3], 'COMMON') + + # OK: [userextensions.intel."myid".IA32] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + dec._UserExtentionSectionParser() + self.assertEqual(len(dec._RawData.CurrentScope), 1) + self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper()) + self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel') + self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"') + self.assertEqual(dec._RawData.CurrentScope[0][3], 'IA32') + + # Fail: [userextensions.intel."myid".IA32,] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._UserExtentionSectionParser) + + # Fail: [userextensions.intel."myid] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._UserExtentionSectionParser) + +# +# Test Dec._SectionHeaderParser +# +class DecSectionTestCase(unittest.TestCase): + def setUp(self): + self.File = TmpFile('test.dec') + self.File.Write( +'''[no section start or end +[,] # empty sub-section +[unknow_section_name] +[Includes.IA32.other] # no third one +[PcdsFeatureFlag, PcdsFixedAtBuild] # feature flag PCD must not be in the same section of other types of PCD +[Includes.IA32, Includes.IA32] +[Includes, Includes.IA32] # common cannot be with other arch +[Includes.IA32, PcdsFeatureFlag] # different section name +''' ) + + def tearDown(self): + self.File.Remove() + + def testSectionHeader(self): + dec = Dec('test.dec', False) + # [no section start or end + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + #[,] # empty sub-section + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + # [unknow_section_name] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + # [Includes.IA32.other] # no third one + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + # [PcdsFeatureFlag, PcdsFixedAtBuild] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + # [Includes.IA32, Includes.IA32] + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + dec._SectionHeaderParser() + self.assertEqual(len(dec._RawData.CurrentScope), 1) + self.assertEqual(dec._RawData.CurrentScope[0][0], 'Includes'.upper()) + self.assertEqual(dec._RawData.CurrentScope[0][1], 'IA32') + + # [Includes, Includes.IA32] # common cannot be with other arch + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + + # [Includes.IA32, PcdsFeatureFlag] # different section name not allowed + dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0] + self.assertRaises(FatalError, dec._SectionHeaderParser) + +# +# Test Dec._ParseDecComment +# +class DecDecCommentTestCase(unittest.TestCase): + def testDecHeadComment(self): + File = TmpFile('test.dec') + File.Write( + '''# abc + ##''') + dec = Dec('test.dec', False) + dec.ParseDecComment() + self.assertEqual(len(dec._HeadComment), 2) + self.assertEqual(dec._HeadComment[0][0], '# abc') + self.assertEqual(dec._HeadComment[0][1], 1) + self.assertEqual(dec._HeadComment[1][0], '##') + self.assertEqual(dec._HeadComment[1][1], 2) + File.Remove() + + def testNoDoubleComment(self): + File = TmpFile('test.dec') + File.Write( + '''# abc + # + [section_start]''') + dec = Dec('test.dec', False) + dec.ParseDecComment() + self.assertEqual(len(dec._HeadComment), 2) + self.assertEqual(dec._HeadComment[0][0], '# abc') + self.assertEqual(dec._HeadComment[0][1], 1) + self.assertEqual(dec._HeadComment[1][0], '#') + self.assertEqual(dec._HeadComment[1][1], 2) + File.Remove() + +if __name__ == '__main__': + import Logger.Logger + Logger.Logger.Initialize() + unittest.main() + |
