2 # This file contain unit test for DecParser
4 # Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
10 from Logger
.Log
import FatalError
12 from Parser
.DecParser
import \
22 from Object
.Parser
.DecObject
import _DecComments
27 class CleanStringTestCase(unittest
.TestCase
):
28 def testCleanString(self
):
29 Line
, Comment
= CleanString('')
30 self
.assertEqual(Line
, '')
31 self
.assertEqual(Comment
, '')
33 Line
, Comment
= CleanString('line without comment')
34 self
.assertEqual(Line
, 'line without comment')
35 self
.assertEqual(Comment
, '')
37 Line
, Comment
= CleanString('# pure comment')
38 self
.assertEqual(Line
, '')
39 self
.assertEqual(Comment
, '# pure comment')
41 Line
, Comment
= CleanString('line # and comment')
42 self
.assertEqual(Line
, 'line')
43 self
.assertEqual(Comment
, '# and comment')
45 def testCleanStringCpp(self
):
46 Line
, Comment
= CleanString('line // and comment', AllowCppStyleComment
= True)
47 self
.assertEqual(Line
, 'line')
48 self
.assertEqual(Comment
, '# and comment')
51 # Test _DecBase._MacroParser function
53 class MacroParserTestCase(unittest
.TestCase
):
55 self
.dec
= _DecBase(FileContent('dummy', []))
57 def testCorrectMacro(self
):
58 self
.dec
._MacroParser
('DEFINE MACRO1 = test1')
59 self
.failIf('MACRO1' not in self
.dec
._LocalMacro
)
60 self
.assertEqual(self
.dec
._LocalMacro
['MACRO1'], 'test1')
62 def testErrorMacro1(self
):
63 # Raise fatal error, macro name must be upper case letter
64 self
.assertRaises(FatalError
, self
.dec
._MacroParser
, 'DEFINE not_upper_case = test2')
66 def testErrorMacro2(self
):
68 self
.assertRaises(FatalError
, self
.dec
._MacroParser
, 'DEFINE ')
71 # Test _DecBase._TryBackSlash function
73 class TryBackSlashTestCase(unittest
.TestCase
):
79 'test with backslash \\',
80 'continue second line',
82 # Do not precede with whitespace
85 # Empty line after backlash is not allowed
86 'line with backslash \\',
89 self
.dec
= _DecBase(FileContent('dummy', Content
))
91 def testBackSlash(self
):
93 # Right case, assert return values
95 ConcatLine
, CommentList
= self
.dec
._TryBackSlash
(self
.dec
._RawData
.GetNextLine(), [])
96 self
.assertEqual(ConcatLine
, 'test no backslash')
97 self
.assertEqual(CommentList
, [])
99 ConcatLine
, CommentList
= self
.dec
._TryBackSlash
(self
.dec
._RawData
.GetNextLine(), [])
100 self
.assertEqual(CommentList
, [])
101 self
.assertEqual(ConcatLine
, 'test with backslash continue second line')
104 # Error cases, assert raise exception
106 self
.assertRaises(FatalError
, self
.dec
._TryBackSlash
, self
.dec
._RawData
.GetNextLine(), [])
107 self
.assertRaises(FatalError
, self
.dec
._TryBackSlash
, self
.dec
._RawData
.GetNextLine(), [])
110 # Test _DecBase.Parse function
112 class DataItem(_DecComments
):
114 _DecComments
.__init
__(self
)
117 class Data(_DecComments
):
119 _DecComments
.__init
__(self
)
123 class TestInner(_DecBase
):
124 def __init__(self
, RawData
):
125 _DecBase
.__init
__(self
, RawData
)
126 self
.ItemObject
= Data()
128 def _StopCurrentParsing(self
, Line
):
129 return Line
== '[TOP]'
131 def _ParseItem(self
):
133 Item
.String
= self
._RawData
.CurrentLine
134 self
.ItemObject
.ItemList
.append(Item
)
137 def _TailCommentStrategy(self
, Comment
):
138 return Comment
.find('@comment') != -1
140 class TestTop(_DecBase
):
141 def __init__(self
, RawData
):
142 _DecBase
.__init
__(self
, RawData
)
147 def _StopCurrentParsing(self
, Line
):
150 def _ParseItem(self
):
151 TestParser
= TestInner(self
._RawData
)
153 self
.ItemObject
.append(TestParser
.ItemObject
)
154 return TestParser
.ItemObject
156 class ParseTestCase(unittest
.TestCase
):
165 (test item has both head and tail comment) # sub1 tail comment
167 (test item has head and special tail comment)
168 # @comment test TailCommentStrategy branch
170 (test item has no comment)
172 # test NextLine branch
176 dec
= TestTop(FileContent('dummy', Content
.splitlines()))
180 self
.assertEqual(len(dec
.ItemObject
), 2)
182 data
= dec
.ItemObject
[0]
183 self
.assertEqual(data
._HeadComment
[0][0], '# Top comment')
184 self
.assertEqual(data
._HeadComment
[0][1], 1)
187 self
.assertEqual(len(data
.ItemList
), 3)
189 dataitem
= data
.ItemList
[0]
190 self
.assertEqual(dataitem
.String
, '(test item has both head and tail comment)')
192 self
.assertEqual(dataitem
._HeadComment
[0][0], '# sub1 head comment')
193 self
.assertEqual(dataitem
._TailComment
[0][0], '# sub1 tail comment')
194 # Comment line number
195 self
.assertEqual(dataitem
._HeadComment
[0][1], 3)
196 self
.assertEqual(dataitem
._TailComment
[0][1], 4)
198 dataitem
= data
.ItemList
[1]
199 self
.assertEqual(dataitem
.String
, '(test item has head and special tail comment)')
201 self
.assertEqual(dataitem
._HeadComment
[0][0], '# sub2 head comment')
202 self
.assertEqual(dataitem
._TailComment
[0][0], '# @comment test TailCommentStrategy branch')
203 # Comment line number
204 self
.assertEqual(dataitem
._HeadComment
[0][1], 5)
205 self
.assertEqual(dataitem
._TailComment
[0][1], 7)
207 dataitem
= data
.ItemList
[2]
208 self
.assertEqual(dataitem
.String
, '(test item has no comment)')
210 self
.assertEqual(dataitem
._HeadComment
, [])
211 self
.assertEqual(dataitem
._TailComment
, [])
213 data
= dec
.ItemObject
[1]
214 self
.assertEqual(data
._HeadComment
[0][0], '# test NextLine branch')
215 self
.assertEqual(data
._HeadComment
[0][1], 11)
218 self
.assertEqual(len(data
.ItemList
), 1)
220 dataitem
= data
.ItemList
[0]
221 self
.assertEqual(dataitem
.String
, 'sub-item')
222 self
.assertEqual(dataitem
._HeadComment
, [])
223 self
.assertEqual(dataitem
._TailComment
, [])
226 # Test _DecDefine._ParseItem
228 class DecDefineTestCase(unittest
.TestCase
):
229 def GetObj(self
, Content
):
230 Obj
= _DecDefine(FileContent('dummy', Content
.splitlines()))
231 Obj
._RawData
.CurrentLine
= Obj
._RawData
.GetNextLine()
234 def testDecDefine(self
):
235 item
= self
.GetObj('PACKAGE_NAME = MdePkg')._ParseItem
()
236 self
.assertEqual(item
.Key
, 'PACKAGE_NAME')
237 self
.assertEqual(item
.Value
, 'MdePkg')
239 def testDecDefine1(self
):
240 obj
= self
.GetObj('PACKAGE_NAME')
241 self
.assertRaises(FatalError
, obj
._ParseItem
)
243 def testDecDefine2(self
):
244 obj
= self
.GetObj('unknown_key = ')
245 self
.assertRaises(FatalError
, obj
._ParseItem
)
247 def testDecDefine3(self
):
248 obj
= self
.GetObj('PACKAGE_NAME = ')
249 self
.assertRaises(FatalError
, obj
._ParseItem
)
252 # Test _DecLibraryclass._ParseItem
254 class DecLibraryTestCase(unittest
.TestCase
):
255 def GetObj(self
, Content
):
256 Obj
= _DecLibraryclass(FileContent('dummy', Content
.splitlines()))
257 Obj
._RawData
.CurrentLine
= Obj
._RawData
.GetNextLine()
261 obj
= self
.GetObj('UefiRuntimeLib')
262 self
.assertRaises(FatalError
, obj
._ParseItem
)
265 obj
= self
.GetObj(' | ')
266 self
.assertRaises(FatalError
, obj
._ParseItem
)
268 def testLibclassNaming(self
):
269 obj
= self
.GetObj('lowercase_efiRuntimeLib|Include/Library/UefiRuntimeLib.h')
270 self
.assertRaises(FatalError
, obj
._ParseItem
)
272 def testLibclassExt(self
):
273 obj
= self
.GetObj('RuntimeLib|Include/Library/UefiRuntimeLib.no_h')
274 self
.assertRaises(FatalError
, obj
._ParseItem
)
276 def testLibclassRelative(self
):
277 obj
= self
.GetObj('RuntimeLib|Include/../UefiRuntimeLib.h')
278 self
.assertRaises(FatalError
, obj
._ParseItem
)
281 # Test _DecPcd._ParseItem
283 class DecPcdTestCase(unittest
.TestCase
):
284 def GetObj(self
, Content
):
285 Obj
= _DecPcd(FileContent('dummy', Content
.splitlines()))
286 Obj
._RawData
.CurrentLine
= Obj
._RawData
.GetNextLine()
287 Obj
._RawData
.CurrentScope
= [('PcdsFeatureFlag'.upper(), 'COMMON')]
291 item
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')._ParseItem
()
292 self
.assertEqual(item
.TokenSpaceGuidCName
, 'gEfiMdePkgTokenSpaceGuid')
293 self
.assertEqual(item
.TokenCName
, 'PcdComponentNameDisable')
294 self
.assertEqual(item
.DefaultValue
, 'FALSE')
295 self
.assertEqual(item
.DatumType
, 'BOOLEAN')
296 self
.assertEqual(item
.TokenValue
, '0x0000000d')
298 def testNoCvar(self
):
299 obj
= self
.GetObj('123ai.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')
300 self
.assertRaises(FatalError
, obj
._ParseItem
)
303 obj
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable FALSE|BOOLEAN|0x0000000d')
304 self
.assertRaises(FatalError
, obj
._ParseItem
)
306 obj
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d | abc')
307 self
.assertRaises(FatalError
, obj
._ParseItem
)
309 def testUnknownType(self
):
310 obj
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|unknown|0x0000000d')
311 self
.assertRaises(FatalError
, obj
._ParseItem
)
314 obj
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|abc|VOID*|0x0000000d')
315 self
.assertRaises(FatalError
, obj
._ParseItem
)
318 obj
= self
.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|0xabc|UINT8|0x0000000d')
319 self
.assertRaises(FatalError
, obj
._ParseItem
)
322 # Test _DecInclude._ParseItem
324 class DecIncludeTestCase(unittest
.TestCase
):
326 # Test code to be added
331 # Test _DecGuid._ParseItem
333 class DecGuidTestCase(unittest
.TestCase
):
334 def GetObj(self
, Content
):
335 Obj
= _DecGuid(FileContent('dummy', Content
.splitlines()))
336 Obj
._RawData
.CurrentLine
= Obj
._RawData
.GetNextLine()
337 Obj
._RawData
.CurrentScope
= [('guids'.upper(), 'COMMON')]
340 def testCValue(self
):
341 item
= self
.GetObj('gEfiIpSecProtocolGuid={ 0xdfb386f7, 0xe100, 0x43ad,'
342 ' {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')._ParseItem
()
343 self
.assertEqual(item
.GuidCName
, 'gEfiIpSecProtocolGuid')
344 self
.assertEqual(item
.GuidCValue
, '{ 0xdfb386f7, 0xe100, 0x43ad, {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')
346 def testGuidString(self
):
347 item
= self
.GetObj('gEfiIpSecProtocolGuid=1E73767F-8F52-4603-AEB4-F29B510B6766')._ParseItem
()
348 self
.assertEqual(item
.GuidCName
, 'gEfiIpSecProtocolGuid')
349 self
.assertEqual(item
.GuidCValue
, '1E73767F-8F52-4603-AEB4-F29B510B6766')
351 def testNoValue1(self
):
352 obj
= self
.GetObj('gEfiIpSecProtocolGuid')
353 self
.assertRaises(FatalError
, obj
._ParseItem
)
355 def testNoValue2(self
):
356 obj
= self
.GetObj('gEfiIpSecProtocolGuid=')
357 self
.assertRaises(FatalError
, obj
._ParseItem
)
359 def testNoName(self
):
360 obj
= self
.GetObj('=')
361 self
.assertRaises(FatalError
, obj
._ParseItem
)
366 class DecDecInitTestCase(unittest
.TestCase
):
367 def testNoDecFile(self
):
368 self
.assertRaises(FatalError
, Dec
, 'No_Such_File')
371 def __init__(self
, File
):
374 def Write(self
, Content
):
376 FileObj
= open(self
.File
, 'w')
377 FileObj
.write(Content
)
389 # Test Dec._UserExtentionSectionParser
391 class DecUESectionTestCase(unittest
.TestCase
):
393 self
.File
= TmpFile('test.dec')
395 '''[userextensions.intel."myid"]
396 [userextensions.intel."myid".IA32]
397 [userextensions.intel."myid".IA32,]
398 [userextensions.intel."myid]
405 def testUserExtentionHeader(self
):
406 dec
= Dec('test.dec', False)
408 # OK: [userextensions.intel."myid"]
409 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
410 dec
._UserExtentionSectionParser
()
411 self
.assertEqual(len(dec
._RawData
.CurrentScope
), 1)
412 self
.assertEqual(dec
._RawData
.CurrentScope
[0][0], 'userextensions'.upper())
413 self
.assertEqual(dec
._RawData
.CurrentScope
[0][1], 'intel')
414 self
.assertEqual(dec
._RawData
.CurrentScope
[0][2], '"myid"')
415 self
.assertEqual(dec
._RawData
.CurrentScope
[0][3], 'COMMON')
417 # OK: [userextensions.intel."myid".IA32]
418 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
419 dec
._UserExtentionSectionParser
()
420 self
.assertEqual(len(dec
._RawData
.CurrentScope
), 1)
421 self
.assertEqual(dec
._RawData
.CurrentScope
[0][0], 'userextensions'.upper())
422 self
.assertEqual(dec
._RawData
.CurrentScope
[0][1], 'intel')
423 self
.assertEqual(dec
._RawData
.CurrentScope
[0][2], '"myid"')
424 self
.assertEqual(dec
._RawData
.CurrentScope
[0][3], 'IA32')
426 # Fail: [userextensions.intel."myid".IA32,]
427 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
428 self
.assertRaises(FatalError
, dec
._UserExtentionSectionParser
)
430 # Fail: [userextensions.intel."myid]
431 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
432 self
.assertRaises(FatalError
, dec
._UserExtentionSectionParser
)
435 # Test Dec._SectionHeaderParser
437 class DecSectionTestCase(unittest
.TestCase
):
439 self
.File
= TmpFile('test.dec')
441 '''[no section start or end
442 [,] # empty sub-section
443 [unknow_section_name]
444 [Includes.IA32.other] # no third one
445 [PcdsFeatureFlag, PcdsFixedAtBuild] # feature flag PCD must not be in the same section of other types of PCD
446 [Includes.IA32, Includes.IA32]
447 [Includes, Includes.IA32] # common cannot be with other arch
448 [Includes.IA32, PcdsFeatureFlag] # different section name
454 def testSectionHeader(self
):
455 dec
= Dec('test.dec', False)
456 # [no section start or end
457 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
458 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
460 #[,] # empty sub-section
461 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
462 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
464 # [unknow_section_name]
465 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
466 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
468 # [Includes.IA32.other] # no third one
469 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
470 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
472 # [PcdsFeatureFlag, PcdsFixedAtBuild]
473 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
474 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
476 # [Includes.IA32, Includes.IA32]
477 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
478 dec
._SectionHeaderParser
()
479 self
.assertEqual(len(dec
._RawData
.CurrentScope
), 1)
480 self
.assertEqual(dec
._RawData
.CurrentScope
[0][0], 'Includes'.upper())
481 self
.assertEqual(dec
._RawData
.CurrentScope
[0][1], 'IA32')
483 # [Includes, Includes.IA32] # common cannot be with other arch
484 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
485 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
487 # [Includes.IA32, PcdsFeatureFlag] # different section name not allowed
488 dec
._RawData
.CurrentLine
= CleanString(dec
._RawData
.GetNextLine())[0]
489 self
.assertRaises(FatalError
, dec
._SectionHeaderParser
)
492 # Test Dec._ParseDecComment
494 class DecDecCommentTestCase(unittest
.TestCase
):
495 def testDecHeadComment(self
):
496 File
= TmpFile('test.dec')
500 dec
= Dec('test.dec', False)
501 dec
.ParseDecComment()
502 self
.assertEqual(len(dec
._HeadComment
), 2)
503 self
.assertEqual(dec
._HeadComment
[0][0], '# abc')
504 self
.assertEqual(dec
._HeadComment
[0][1], 1)
505 self
.assertEqual(dec
._HeadComment
[1][0], '##')
506 self
.assertEqual(dec
._HeadComment
[1][1], 2)
509 def testNoDoubleComment(self
):
510 File
= TmpFile('test.dec')
515 dec
= Dec('test.dec', False)
516 dec
.ParseDecComment()
517 self
.assertEqual(len(dec
._HeadComment
), 2)
518 self
.assertEqual(dec
._HeadComment
[0][0], '# abc')
519 self
.assertEqual(dec
._HeadComment
[0][1], 1)
520 self
.assertEqual(dec
._HeadComment
[1][0], '#')
521 self
.assertEqual(dec
._HeadComment
[1][1], 2)
524 if __name__
== '__main__':
526 Logger
.Logger
.Initialize()