diff options
Diffstat (limited to 'BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py')
| -rw-r--r-- | BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py | 558 |
1 files changed, 279 insertions, 279 deletions
diff --git a/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py b/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py index b9f7dfe52a..3c64c8ef45 100644 --- a/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py +++ b/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py @@ -1,279 +1,279 @@ -## @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
-
-from __future__ import print_function
-import os
-import unittest
-
-from Parser.DecParserMisc import \
- IsValidCArray, \
- IsValidPcdDatum
-
-from Parser.DecParser import Dec
-
-from Library.ParserValidate import IsValidCFormatGuid
-
-#
-# Test tool function
-#
-def TestToolFuncs():
- assert IsValidCArray('{0x1, 0x23}')
-
- # Empty after comma
- assert not IsValidCArray('{0x1, 0x23, }')
-
- # 0x2345 too long
- assert not IsValidCArray('{0x1, 0x2345}')
-
- # Must end with '}'
- assert not IsValidCArray('{0x1, 0x23, ')
-
- # Whitespace between numbers
- assert not IsValidCArray('{0x1, 0x2 3, }')
-
- assert IsValidPcdDatum('VOID*', '"test"')[0]
- assert IsValidPcdDatum('VOID*', 'L"test"')[0]
- assert IsValidPcdDatum('BOOLEAN', 'TRUE')[0]
- assert IsValidPcdDatum('BOOLEAN', 'FALSE')[0]
- assert IsValidPcdDatum('BOOLEAN', '0')[0]
- assert IsValidPcdDatum('BOOLEAN', '1')[0]
- assert IsValidPcdDatum('UINT8', '0xab')[0]
-
- assert not IsValidPcdDatum('UNKNOWNTYPE', '0xabc')[0]
- assert not IsValidPcdDatum('UINT8', 'not number')[0]
-
- assert( IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }}'))
- assert( not IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }} 0xaa'))
-
-def TestTemplate(TestString, TestFunc):
- Path = os.path.join(os.getcwd(), 'test.dec')
- Path = os.path.normpath(Path)
- try:
- f = open(Path, 'w')
-
- # Write test string to file
- f.write(TestString)
-
- # Close file
- f.close()
- except:
- print('Can not create temporary file [%s]!' % Path)
- exit(-1)
-
- # Call test function to test
- Ret = TestFunc(Path, TestString)
-
- # Test done, remove temporary file
- os.remove(Path)
- return Ret
-
-# To make test unit works OK, must set IsRaiseError to True
-# This function test right syntax DEC file
-# @retval: parser object
-#
-def TestOK(Path, TestString):
- try:
- Parser = Dec(Path)
- except:
- raise 'Bug!!! Correct syntax in DEC file, but exception raised!\n' + TestString
- return Parser
-
-# This function test wrong syntax DEC file
-# if parser checked wrong syntax, exception thrown and it's expected result
-def TestError(Path, TestString):
- try:
- Dec(Path)
- except:
- # Raise error, get expected result
- return True
- raise 'Bug!!! Wrong syntax in DEC file, but passed by DEC parser!!\n' + TestString
-
-def TestDecDefine():
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- '''
- Parser = TestTemplate(TestString, TestOK)
- DefObj = Parser.GetDefineSectionObject()
- assert DefObj.GetPackageSpecification() == '0x00010005'
- assert DefObj.GetPackageName() == 'MdePkg'
- assert DefObj.GetPackageGuid() == '1E73767F-8F52-4603-AEB4-F29B510B6766'
- assert DefObj.GetPackageVersion() == '1.02'
-
- TestString = '''
- [Defines]
- UNKNOW_KEY = 0x00010005 # A unknown key
- '''
- assert TestTemplate(TestString, TestError)
-
- TestString = '''
- [Defines]
- PACKAGE_GUID = F-8F52-4603-AEB4-F29B510B6766 # Error GUID
- '''
- assert TestTemplate(TestString, TestError)
-
-def TestDecInclude():
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- [ \\
- Includes]
- Include
- [Includes.IA32]
- Include/Ia32
- '''
-
- # Create directory in current directory
- try:
- os.makedirs('Include/Ia32')
- except:
- pass
- Parser = TestTemplate(TestString, TestOK)
-
- IncObj = Parser.GetIncludeSectionObject()
- Items = IncObj.GetIncludes()
- assert len(Items) == 1
- assert Items[0].File == 'Include'
-
- Items = IncObj.GetIncludes('IA32')
- assert len(Items) == 1
- # normpath is called in DEC parser so '/' is converted to '\'
- assert Items[0].File == 'Include\\Ia32'
-
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- [Includes]
- Include_not_exist # directory does not exist
- '''
- assert TestTemplate(TestString, TestError)
-
- os.removedirs('Include/Ia32')
-
-def TestDecGuidPpiProtocol():
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- [Guids]
- #
- # GUID defined in UEFI2.1/UEFI2.0/EFI1.1
- #
- ## Include/Guid/GlobalVariable.h
- gEfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}
- [Protocols]
- ## Include/Protocol/Bds.h
- gEfiBdsArchProtocolGuid = { 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}
- [Ppis]
- ## Include/Ppi/MasterBootMode.h
- gEfiPeiMasterBootModePpiGuid = { 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } }
- '''
- Parser = TestTemplate(TestString, TestOK)
- Obj = Parser.GetGuidSectionObject()
- Items = Obj.GetGuids()
- assert Obj.GetSectionName() == 'Guids'.upper()
- assert len(Items) == 1
- assert Items[0].GuidCName == 'gEfiGlobalVariableGuid'
- assert Items[0].GuidCValue == '{ 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}'
-
- Obj = Parser.GetProtocolSectionObject()
- Items = Obj.GetProtocols()
- assert Obj.GetSectionName() == 'Protocols'.upper()
- assert len(Items) == 1
- assert Items[0].GuidCName == 'gEfiBdsArchProtocolGuid'
- assert Items[0].GuidCValue == '{ 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}'
-
- Obj = Parser.GetPpiSectionObject()
- Items = Obj.GetPpis()
- assert Obj.GetSectionName() == 'Ppis'.upper()
- assert len(Items) == 1
- assert Items[0].GuidCName == 'gEfiPeiMasterBootModePpiGuid'
- assert Items[0].GuidCValue == '{ 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } }'
-
-def TestDecPcd():
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- [PcdsFeatureFlag]
- ## If TRUE, the component name protocol will not be installed.
- gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d
-
- [PcdsFixedAtBuild]
- ## Indicates the maximum length of unicode string
- gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000|UINT32|0x00000001
-
- [PcdsFixedAtBuild.IPF]
- ## The base address of IO port space for IA64 arch
- gEfiMdePkgTokenSpaceGuid.PcdIoBlockBaseAddressForIpf|0x0ffffc000000|UINT64|0x0000000f
-
- [PcdsFixedAtBuild,PcdsPatchableInModule]
- ## This flag is used to control the printout of DebugLib
- gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000|UINT32|0x00000006
-
- [PcdsFixedAtBuild,PcdsPatchableInModule,PcdsDynamic]
- ## This value is used to set the base address of pci express hierarchy
- gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000|UINT64|0x0000000a
- '''
- Parser = TestTemplate(TestString, TestOK)
- Obj = Parser.GetPcdSectionObject()
- Items = Obj.GetPcds('PcdsFeatureFlag', 'COMMON')
- assert len(Items) == 1
- assert Items[0].TokenSpaceGuidCName == 'gEfiMdePkgTokenSpaceGuid'
- assert Items[0].TokenCName == 'PcdComponentNameDisable'
- assert Items[0].DefaultValue == 'FALSE'
- assert Items[0].DatumType == 'BOOLEAN'
- assert Items[0].TokenValue == '0x0000000d'
-
- Items = Obj.GetPcdsByType('PcdsFixedAtBuild')
- assert len(Items) == 4
- assert len(Obj.GetPcdsByType('PcdsPatchableInModule')) == 2
-
-def TestDecUserExtension():
- TestString = '''
- [Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = MdePkg
- PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
- PACKAGE_VERSION = 1.02
- [UserExtensions.MyID."TestString".IA32]
- Some Strings...
- '''
- Parser = TestTemplate(TestString, TestOK)
- Obj = Parser.GetUserExtensionSectionObject()
- Items = Obj.GetAllUserExtensions()
- assert len(Items) == 1
- assert Items[0].UserString == 'Some Strings...'
- assert len(Items[0].ArchAndModuleType) == 1
- assert ['MyID', '"TestString"', 'IA32'] in Items[0].ArchAndModuleType
-
-if __name__ == '__main__':
- import Logger.Logger
- Logger.Logger.Initialize()
- unittest.FunctionTestCase(TestToolFuncs).runTest()
- unittest.FunctionTestCase(TestDecDefine).runTest()
- unittest.FunctionTestCase(TestDecInclude).runTest()
- unittest.FunctionTestCase(TestDecGuidPpiProtocol).runTest()
- unittest.FunctionTestCase(TestDecPcd).runTest()
- unittest.FunctionTestCase(TestDecUserExtension).runTest()
-
- print('All tests passed...')
-
-
+## @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 + +from __future__ import print_function +import os +import unittest + +from Parser.DecParserMisc import \ + IsValidCArray, \ + IsValidPcdDatum + +from Parser.DecParser import Dec + +from Library.ParserValidate import IsValidCFormatGuid + +# +# Test tool function +# +def TestToolFuncs(): + assert IsValidCArray('{0x1, 0x23}') + + # Empty after comma + assert not IsValidCArray('{0x1, 0x23, }') + + # 0x2345 too long + assert not IsValidCArray('{0x1, 0x2345}') + + # Must end with '}' + assert not IsValidCArray('{0x1, 0x23, ') + + # Whitespace between numbers + assert not IsValidCArray('{0x1, 0x2 3, }') + + assert IsValidPcdDatum('VOID*', '"test"')[0] + assert IsValidPcdDatum('VOID*', 'L"test"')[0] + assert IsValidPcdDatum('BOOLEAN', 'TRUE')[0] + assert IsValidPcdDatum('BOOLEAN', 'FALSE')[0] + assert IsValidPcdDatum('BOOLEAN', '0')[0] + assert IsValidPcdDatum('BOOLEAN', '1')[0] + assert IsValidPcdDatum('UINT8', '0xab')[0] + + assert not IsValidPcdDatum('UNKNOWNTYPE', '0xabc')[0] + assert not IsValidPcdDatum('UINT8', 'not number')[0] + + assert( IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }}')) + assert( not IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }} 0xaa')) + +def TestTemplate(TestString, TestFunc): + Path = os.path.join(os.getcwd(), 'test.dec') + Path = os.path.normpath(Path) + try: + f = open(Path, 'w') + + # Write test string to file + f.write(TestString) + + # Close file + f.close() + except: + print('Can not create temporary file [%s]!' % Path) + exit(-1) + + # Call test function to test + Ret = TestFunc(Path, TestString) + + # Test done, remove temporary file + os.remove(Path) + return Ret + +# To make test unit works OK, must set IsRaiseError to True +# This function test right syntax DEC file +# @retval: parser object +# +def TestOK(Path, TestString): + try: + Parser = Dec(Path) + except: + raise 'Bug!!! Correct syntax in DEC file, but exception raised!\n' + TestString + return Parser + +# This function test wrong syntax DEC file +# if parser checked wrong syntax, exception thrown and it's expected result +def TestError(Path, TestString): + try: + Dec(Path) + except: + # Raise error, get expected result + return True + raise 'Bug!!! Wrong syntax in DEC file, but passed by DEC parser!!\n' + TestString + +def TestDecDefine(): + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + ''' + Parser = TestTemplate(TestString, TestOK) + DefObj = Parser.GetDefineSectionObject() + assert DefObj.GetPackageSpecification() == '0x00010005' + assert DefObj.GetPackageName() == 'MdePkg' + assert DefObj.GetPackageGuid() == '1E73767F-8F52-4603-AEB4-F29B510B6766' + assert DefObj.GetPackageVersion() == '1.02' + + TestString = ''' + [Defines] + UNKNOW_KEY = 0x00010005 # A unknown key + ''' + assert TestTemplate(TestString, TestError) + + TestString = ''' + [Defines] + PACKAGE_GUID = F-8F52-4603-AEB4-F29B510B6766 # Error GUID + ''' + assert TestTemplate(TestString, TestError) + +def TestDecInclude(): + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + [ \\ + Includes] + Include + [Includes.IA32] + Include/Ia32 + ''' + + # Create directory in current directory + try: + os.makedirs('Include/Ia32') + except: + pass + Parser = TestTemplate(TestString, TestOK) + + IncObj = Parser.GetIncludeSectionObject() + Items = IncObj.GetIncludes() + assert len(Items) == 1 + assert Items[0].File == 'Include' + + Items = IncObj.GetIncludes('IA32') + assert len(Items) == 1 + # normpath is called in DEC parser so '/' is converted to '\' + assert Items[0].File == 'Include\\Ia32' + + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + [Includes] + Include_not_exist # directory does not exist + ''' + assert TestTemplate(TestString, TestError) + + os.removedirs('Include/Ia32') + +def TestDecGuidPpiProtocol(): + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + [Guids] + # + # GUID defined in UEFI2.1/UEFI2.0/EFI1.1 + # + ## Include/Guid/GlobalVariable.h + gEfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }} + [Protocols] + ## Include/Protocol/Bds.h + gEfiBdsArchProtocolGuid = { 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }} + [Ppis] + ## Include/Ppi/MasterBootMode.h + gEfiPeiMasterBootModePpiGuid = { 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } } + ''' + Parser = TestTemplate(TestString, TestOK) + Obj = Parser.GetGuidSectionObject() + Items = Obj.GetGuids() + assert Obj.GetSectionName() == 'Guids'.upper() + assert len(Items) == 1 + assert Items[0].GuidCName == 'gEfiGlobalVariableGuid' + assert Items[0].GuidCValue == '{ 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}' + + Obj = Parser.GetProtocolSectionObject() + Items = Obj.GetProtocols() + assert Obj.GetSectionName() == 'Protocols'.upper() + assert len(Items) == 1 + assert Items[0].GuidCName == 'gEfiBdsArchProtocolGuid' + assert Items[0].GuidCValue == '{ 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}' + + Obj = Parser.GetPpiSectionObject() + Items = Obj.GetPpis() + assert Obj.GetSectionName() == 'Ppis'.upper() + assert len(Items) == 1 + assert Items[0].GuidCName == 'gEfiPeiMasterBootModePpiGuid' + assert Items[0].GuidCValue == '{ 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } }' + +def TestDecPcd(): + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + [PcdsFeatureFlag] + ## If TRUE, the component name protocol will not be installed. + gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d + + [PcdsFixedAtBuild] + ## Indicates the maximum length of unicode string + gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000|UINT32|0x00000001 + + [PcdsFixedAtBuild.IPF] + ## The base address of IO port space for IA64 arch + gEfiMdePkgTokenSpaceGuid.PcdIoBlockBaseAddressForIpf|0x0ffffc000000|UINT64|0x0000000f + + [PcdsFixedAtBuild,PcdsPatchableInModule] + ## This flag is used to control the printout of DebugLib + gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000|UINT32|0x00000006 + + [PcdsFixedAtBuild,PcdsPatchableInModule,PcdsDynamic] + ## This value is used to set the base address of pci express hierarchy + gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000|UINT64|0x0000000a + ''' + Parser = TestTemplate(TestString, TestOK) + Obj = Parser.GetPcdSectionObject() + Items = Obj.GetPcds('PcdsFeatureFlag', 'COMMON') + assert len(Items) == 1 + assert Items[0].TokenSpaceGuidCName == 'gEfiMdePkgTokenSpaceGuid' + assert Items[0].TokenCName == 'PcdComponentNameDisable' + assert Items[0].DefaultValue == 'FALSE' + assert Items[0].DatumType == 'BOOLEAN' + assert Items[0].TokenValue == '0x0000000d' + + Items = Obj.GetPcdsByType('PcdsFixedAtBuild') + assert len(Items) == 4 + assert len(Obj.GetPcdsByType('PcdsPatchableInModule')) == 2 + +def TestDecUserExtension(): + TestString = ''' + [Defines] + DEC_SPECIFICATION = 0x00010005 + PACKAGE_NAME = MdePkg + PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766 + PACKAGE_VERSION = 1.02 + [UserExtensions.MyID."TestString".IA32] + Some Strings... + ''' + Parser = TestTemplate(TestString, TestOK) + Obj = Parser.GetUserExtensionSectionObject() + Items = Obj.GetAllUserExtensions() + assert len(Items) == 1 + assert Items[0].UserString == 'Some Strings...' + assert len(Items[0].ArchAndModuleType) == 1 + assert ['MyID', '"TestString"', 'IA32'] in Items[0].ArchAndModuleType + +if __name__ == '__main__': + import Logger.Logger + Logger.Logger.Initialize() + unittest.FunctionTestCase(TestToolFuncs).runTest() + unittest.FunctionTestCase(TestDecDefine).runTest() + unittest.FunctionTestCase(TestDecInclude).runTest() + unittest.FunctionTestCase(TestDecGuidPpiProtocol).runTest() + unittest.FunctionTestCase(TestDecPcd).runTest() + unittest.FunctionTestCase(TestDecUserExtension).runTest() + + print('All tests passed...') + + |
