]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py
BaseTools: use set instead of list for a variable to be used with in
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UnitTest / DecParserTest.py
1 ## @file
2 # This file contain unit test for DecParser
3 #
4 # Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
5 #
6 # This program and the accompanying materials are licensed and made available
7 # under the terms and conditions of the BSD License which accompanies this
8 # distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
10 #
11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 import os
15 import unittest
16
17 from Parser.DecParserMisc import \
18 IsValidCArray, \
19 IsValidPcdDatum
20
21 from Parser.DecParser import Dec
22
23 from Library.ParserValidate import IsValidCFormatGuid
24
25 #
26 # Test tool function
27 #
28 def TestToolFuncs():
29 assert IsValidCArray('{0x1, 0x23}')
30
31 # Empty after comma
32 assert not IsValidCArray('{0x1, 0x23, }')
33
34 # 0x2345 too long
35 assert not IsValidCArray('{0x1, 0x2345}')
36
37 # Must end with '}'
38 assert not IsValidCArray('{0x1, 0x23, ')
39
40 # Whitespace between numbers
41 assert not IsValidCArray('{0x1, 0x2 3, }')
42
43 assert IsValidPcdDatum('VOID*', '"test"')[0]
44 assert IsValidPcdDatum('VOID*', 'L"test"')[0]
45 assert IsValidPcdDatum('BOOLEAN', 'TRUE')[0]
46 assert IsValidPcdDatum('BOOLEAN', 'FALSE')[0]
47 assert IsValidPcdDatum('BOOLEAN', '0')[0]
48 assert IsValidPcdDatum('BOOLEAN', '1')[0]
49 assert IsValidPcdDatum('UINT8', '0xab')[0]
50
51 assert not IsValidPcdDatum('UNKNOWNTYPE', '0xabc')[0]
52 assert not IsValidPcdDatum('UINT8', 'not number')[0]
53
54 assert( IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }}'))
55 assert( not IsValidCFormatGuid('{ 0xfa0b1735 , 0x87a0, 0x4193, {0xb2, 0x66 , 0x53, 0x8c , 0x38, 0xaf, 0x48, 0xce }} 0xaa'))
56
57 def TestTemplate(TestString, TestFunc):
58 Path = os.path.join(os.getcwd(), 'test.dec')
59 Path = os.path.normpath(Path)
60 try:
61 f = open(Path, 'w')
62
63 # Write test string to file
64 f.write(TestString)
65
66 # Close file
67 f.close()
68 except:
69 print 'Can not create temporary file [%s]!' % Path
70 exit(-1)
71
72 # Call test function to test
73 Ret = TestFunc(Path, TestString)
74
75 # Test done, remove temporary file
76 os.remove(Path)
77 return Ret
78
79 # To make test unit works OK, must set IsRaiseError to True
80 # This function test right syntax DEC file
81 # @retval: parser object
82 #
83 def TestOK(Path, TestString):
84 try:
85 Parser = Dec(Path)
86 except:
87 raise 'Bug!!! Correct syntax in DEC file, but exception raised!\n' + TestString
88 return Parser
89
90 # This function test wrong syntax DEC file
91 # if parser checked wrong syntax, exception thrown and it's expected result
92 def TestError(Path, TestString):
93 try:
94 Dec(Path)
95 except:
96 # Raise error, get expected result
97 return True
98 raise 'Bug!!! Wrong syntax in DEC file, but passed by DEC parser!!\n' + TestString
99
100 def TestDecDefine():
101 TestString = '''
102 [Defines]
103 DEC_SPECIFICATION = 0x00010005
104 PACKAGE_NAME = MdePkg
105 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
106 PACKAGE_VERSION = 1.02
107 '''
108 Parser = TestTemplate(TestString, TestOK)
109 DefObj = Parser.GetDefineSectionObject()
110 assert DefObj.GetPackageSpecification() == '0x00010005'
111 assert DefObj.GetPackageName() == 'MdePkg'
112 assert DefObj.GetPackageGuid() == '1E73767F-8F52-4603-AEB4-F29B510B6766'
113 assert DefObj.GetPackageVersion() == '1.02'
114
115 TestString = '''
116 [Defines]
117 UNKNOW_KEY = 0x00010005 # A unknown key
118 '''
119 assert TestTemplate(TestString, TestError)
120
121 TestString = '''
122 [Defines]
123 PACKAGE_GUID = F-8F52-4603-AEB4-F29B510B6766 # Error GUID
124 '''
125 assert TestTemplate(TestString, TestError)
126
127 def TestDecInclude():
128 TestString = '''
129 [Defines]
130 DEC_SPECIFICATION = 0x00010005
131 PACKAGE_NAME = MdePkg
132 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
133 PACKAGE_VERSION = 1.02
134 [ \\
135 Includes]
136 Include
137 [Includes.IA32]
138 Include/Ia32
139 '''
140
141 # Create directory in current directory
142 try:
143 os.makedirs('Include/Ia32')
144 except:
145 pass
146 Parser = TestTemplate(TestString, TestOK)
147
148 IncObj = Parser.GetIncludeSectionObject()
149 Items = IncObj.GetIncludes()
150 assert len(Items) == 1
151 assert Items[0].File == 'Include'
152
153 Items = IncObj.GetIncludes('IA32')
154 assert len(Items) == 1
155 # normpath is called in DEC parser so '/' is converted to '\'
156 assert Items[0].File == 'Include\\Ia32'
157
158 TestString = '''
159 [Defines]
160 DEC_SPECIFICATION = 0x00010005
161 PACKAGE_NAME = MdePkg
162 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
163 PACKAGE_VERSION = 1.02
164 [Includes]
165 Include_not_exist # directory does not exist
166 '''
167 assert TestTemplate(TestString, TestError)
168
169 os.removedirs('Include/Ia32')
170
171 def TestDecGuidPpiProtocol():
172 TestString = '''
173 [Defines]
174 DEC_SPECIFICATION = 0x00010005
175 PACKAGE_NAME = MdePkg
176 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
177 PACKAGE_VERSION = 1.02
178 [Guids]
179 #
180 # GUID defined in UEFI2.1/UEFI2.0/EFI1.1
181 #
182 ## Include/Guid/GlobalVariable.h
183 gEfiGlobalVariableGuid = { 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}
184 [Protocols]
185 ## Include/Protocol/Bds.h
186 gEfiBdsArchProtocolGuid = { 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}
187 [Ppis]
188 ## Include/Ppi/MasterBootMode.h
189 gEfiPeiMasterBootModePpiGuid = { 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } }
190 '''
191 Parser = TestTemplate(TestString, TestOK)
192 Obj = Parser.GetGuidSectionObject()
193 Items = Obj.GetGuids()
194 assert Obj.GetSectionName() == 'Guids'.upper()
195 assert len(Items) == 1
196 assert Items[0].GuidCName == 'gEfiGlobalVariableGuid'
197 assert Items[0].GuidCValue == '{ 0x8BE4DF61, 0x93CA, 0x11D2, { 0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C }}'
198
199 Obj = Parser.GetProtocolSectionObject()
200 Items = Obj.GetProtocols()
201 assert Obj.GetSectionName() == 'Protocols'.upper()
202 assert len(Items) == 1
203 assert Items[0].GuidCName == 'gEfiBdsArchProtocolGuid'
204 assert Items[0].GuidCValue == '{ 0x665E3FF6, 0x46CC, 0x11D4, { 0x9A, 0x38, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D }}'
205
206 Obj = Parser.GetPpiSectionObject()
207 Items = Obj.GetPpis()
208 assert Obj.GetSectionName() == 'Ppis'.upper()
209 assert len(Items) == 1
210 assert Items[0].GuidCName == 'gEfiPeiMasterBootModePpiGuid'
211 assert Items[0].GuidCValue == '{ 0x7408d748, 0xfc8c, 0x4ee6, {0x92, 0x88, 0xc4, 0xbe, 0xc0, 0x92, 0xa4, 0x10 } }'
212
213 def TestDecPcd():
214 TestString = '''
215 [Defines]
216 DEC_SPECIFICATION = 0x00010005
217 PACKAGE_NAME = MdePkg
218 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
219 PACKAGE_VERSION = 1.02
220 [PcdsFeatureFlag]
221 ## If TRUE, the component name protocol will not be installed.
222 gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d
223
224 [PcdsFixedAtBuild]
225 ## Indicates the maximum length of unicode string
226 gEfiMdePkgTokenSpaceGuid.PcdMaximumUnicodeStringLength|1000000|UINT32|0x00000001
227
228 [PcdsFixedAtBuild.IPF]
229 ## The base address of IO port space for IA64 arch
230 gEfiMdePkgTokenSpaceGuid.PcdIoBlockBaseAddressForIpf|0x0ffffc000000|UINT64|0x0000000f
231
232 [PcdsFixedAtBuild,PcdsPatchableInModule]
233 ## This flag is used to control the printout of DebugLib
234 gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000|UINT32|0x00000006
235
236 [PcdsFixedAtBuild,PcdsPatchableInModule,PcdsDynamic]
237 ## This value is used to set the base address of pci express hierarchy
238 gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xE0000000|UINT64|0x0000000a
239 '''
240 Parser = TestTemplate(TestString, TestOK)
241 Obj = Parser.GetPcdSectionObject()
242 Items = Obj.GetPcds('PcdsFeatureFlag', 'COMMON')
243 assert len(Items) == 1
244 assert Items[0].TokenSpaceGuidCName == 'gEfiMdePkgTokenSpaceGuid'
245 assert Items[0].TokenCName == 'PcdComponentNameDisable'
246 assert Items[0].DefaultValue == 'FALSE'
247 assert Items[0].DatumType == 'BOOLEAN'
248 assert Items[0].TokenValue == '0x0000000d'
249
250 Items = Obj.GetPcdsByType('PcdsFixedAtBuild')
251 assert len(Items) == 4
252 assert len(Obj.GetPcdsByType('PcdsPatchableInModule')) == 2
253
254 def TestDecUserExtension():
255 TestString = '''
256 [Defines]
257 DEC_SPECIFICATION = 0x00010005
258 PACKAGE_NAME = MdePkg
259 PACKAGE_GUID = 1E73767F-8F52-4603-AEB4-F29B510B6766
260 PACKAGE_VERSION = 1.02
261 [UserExtensions.MyID."TestString".IA32]
262 Some Strings...
263 '''
264 Parser = TestTemplate(TestString, TestOK)
265 Obj = Parser.GetUserExtensionSectionObject()
266 Items = Obj.GetAllUserExtensions()
267 assert len(Items) == 1
268 assert Items[0].UserString == 'Some Strings...'
269 assert len(Items[0].ArchAndModuleType) == 1
270 assert ['MyID', '"TestString"', 'IA32'] in Items[0].ArchAndModuleType
271
272 if __name__ == '__main__':
273 import Logger.Logger
274 Logger.Logger.Initialize()
275 unittest.FunctionTestCase(TestToolFuncs).runTest()
276 unittest.FunctionTestCase(TestDecDefine).runTest()
277 unittest.FunctionTestCase(TestDecInclude).runTest()
278 unittest.FunctionTestCase(TestDecGuidPpiProtocol).runTest()
279 unittest.FunctionTestCase(TestDecPcd).runTest()
280 unittest.FunctionTestCase(TestDecUserExtension).runTest()
281
282 print 'All tests passed...'
283
284