mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-24 11:45:27 +01:00
280 lines
9.7 KiB
Python
280 lines
9.7 KiB
Python
|
## @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...')
|
||
|
|
||
|
|