]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py
BaseTools: use set instead of list for a variable to be used with in
[mirror_edk2.git] / BaseTools / Source / Python / UPT / UnitTest / DecParserUnitTest.py
CommitLineData
4234283c
LG
1## @file\r
2# This file contain unit test for DecParser\r
3#\r
4# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14import os\r
15import unittest\r
16from Logger.Log import FatalError\r
17\r
18from Parser.DecParser import \\r
19 Dec, \\r
20 _DecDefine, \\r
21 _DecLibraryclass, \\r
22 _DecPcd, \\r
23 _DecGuid, \\r
24 FileContent, \\r
25 _DecBase, \\r
26 CleanString\r
27 \r
28from Object.Parser.DecObject import _DecComments\r
29\r
30#\r
31# Test CleanString\r
32#\r
33class CleanStringTestCase(unittest.TestCase):\r
34 def testCleanString(self):\r
35 Line, Comment = CleanString('')\r
36 self.assertEqual(Line, '')\r
37 self.assertEqual(Comment, '')\r
38 \r
39 Line, Comment = CleanString('line without comment')\r
40 self.assertEqual(Line, 'line without comment')\r
41 self.assertEqual(Comment, '')\r
42 \r
43 Line, Comment = CleanString('# pure comment')\r
44 self.assertEqual(Line, '')\r
45 self.assertEqual(Comment, '# pure comment')\r
46 \r
47 Line, Comment = CleanString('line # and comment')\r
48 self.assertEqual(Line, 'line')\r
49 self.assertEqual(Comment, '# and comment')\r
50 \r
51 def testCleanStringCpp(self):\r
52 Line, Comment = CleanString('line // and comment', AllowCppStyleComment = True)\r
53 self.assertEqual(Line, 'line')\r
54 self.assertEqual(Comment, '# and comment')\r
55\r
56#\r
57# Test _DecBase._MacroParser function\r
58#\r
59class MacroParserTestCase(unittest.TestCase):\r
60 def setUp(self):\r
61 self.dec = _DecBase(FileContent('dummy', []))\r
62 \r
63 def testCorrectMacro(self):\r
64 self.dec._MacroParser('DEFINE MARCRO1 = test1')\r
65 self.failIf('MARCRO1' not in self.dec._LocalMacro)\r
66 self.assertEqual(self.dec._LocalMacro['MARCRO1'], 'test1')\r
67 \r
68 def testErrorMacro1(self):\r
69 # Raise fatal error, macro name must be upper case letter\r
70 self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE not_upper_case = test2')\r
71 \r
72 def testErrorMacro2(self):\r
73 # No macro name given\r
74 self.assertRaises(FatalError, self.dec._MacroParser, 'DEFINE ')\r
75\r
76#\r
77# Test _DecBase._TryBackSlash function\r
78#\r
79class TryBackSlashTestCase(unittest.TestCase):\r
80 def setUp(self):\r
81 Content = [\r
82 # Right case\r
83 'test no backslash',\r
84 \r
85 'test with backslash \\',\r
86 'continue second line',\r
87 \r
88 # Do not precede with whitespace\r
89 '\\',\r
90 \r
91 # Empty line after backlash is not allowed\r
92 'line with backslash \\',\r
93 ''\r
94 ]\r
95 self.dec = _DecBase(FileContent('dummy', Content))\r
96 \r
97 def testBackSlash(self):\r
98 #\r
99 # Right case, assert return values\r
100 #\r
101 ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), [])\r
102 self.assertEqual(ConcatLine, 'test no backslash')\r
103 self.assertEqual(CommentList, [])\r
104 \r
105 ConcatLine, CommentList = self.dec._TryBackSlash(self.dec._RawData.GetNextLine(), [])\r
106 self.assertEqual(CommentList, [])\r
107 self.assertEqual(ConcatLine, 'test with backslash continue second line')\r
108 \r
109 #\r
110 # Error cases, assert raise exception\r
111 #\r
112 self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), [])\r
113 self.assertRaises(FatalError, self.dec._TryBackSlash, self.dec._RawData.GetNextLine(), [])\r
114\r
115#\r
116# Test _DecBase.Parse function\r
117#\r
118class DataItem(_DecComments):\r
119 def __init__(self):\r
120 _DecComments.__init__(self)\r
121 self.String = ''\r
122\r
123class Data(_DecComments):\r
124 def __init__(self):\r
125 _DecComments.__init__(self)\r
126 # List of DataItem\r
127 self.ItemList = []\r
128\r
129class TestInner(_DecBase):\r
130 def __init__(self, RawData):\r
131 _DecBase.__init__(self, RawData)\r
132 self.ItemObject = Data()\r
133 \r
134 def _StopCurrentParsing(self, Line):\r
135 return Line == '[TOP]'\r
136 \r
137 def _ParseItem(self):\r
138 Item = DataItem()\r
139 Item.String = self._RawData.CurrentLine\r
140 self.ItemObject.ItemList.append(Item)\r
141 return Item\r
142 \r
143 def _TailCommentStrategy(self, Comment):\r
144 return Comment.find('@comment') != -1\r
145\r
146class TestTop(_DecBase):\r
147 def __init__(self, RawData):\r
148 _DecBase.__init__(self, RawData)\r
149 # List of Data\r
150 self.ItemObject = []\r
151 \r
152 # Top parser\r
153 def _StopCurrentParsing(self, Line):\r
154 return False\r
155\r
156 def _ParseItem(self):\r
157 TestParser = TestInner(self._RawData)\r
158 TestParser.Parse()\r
159 self.ItemObject.append(TestParser.ItemObject)\r
160 return TestParser.ItemObject\r
161\r
162class ParseTestCase(unittest.TestCase): \r
163 def setUp(self):\r
164 pass\r
165 \r
166 def testParse(self):\r
167 Content = \\r
168 '''# Top comment\r
169 [TOP]\r
170 # sub1 head comment\r
171 (test item has both head and tail comment) # sub1 tail comment\r
172 # sub2 head comment\r
173 (test item has head and special tail comment)\r
174 # @comment test TailCommentStrategy branch\r
175 \r
176 (test item has no comment)\r
177 \r
178 # test NextLine branch\r
179 [TOP]\r
180 sub-item\r
181 '''\r
182 dec = TestTop(FileContent('dummy', Content.splitlines()))\r
183 dec.Parse()\r
184 \r
185 # Two sections\r
186 self.assertEqual(len(dec.ItemObject), 2)\r
187 \r
188 data = dec.ItemObject[0]\r
189 self.assertEqual(data._HeadComment[0][0], '# Top comment')\r
190 self.assertEqual(data._HeadComment[0][1], 1)\r
191 \r
192 # 3 subitems\r
193 self.assertEqual(len(data.ItemList), 3)\r
194 \r
195 dataitem = data.ItemList[0]\r
196 self.assertEqual(dataitem.String, '(test item has both head and tail comment)')\r
197 # Comment content\r
198 self.assertEqual(dataitem._HeadComment[0][0], '# sub1 head comment')\r
199 self.assertEqual(dataitem._TailComment[0][0], '# sub1 tail comment')\r
200 # Comment line number\r
201 self.assertEqual(dataitem._HeadComment[0][1], 3)\r
202 self.assertEqual(dataitem._TailComment[0][1], 4)\r
203 \r
204 dataitem = data.ItemList[1]\r
205 self.assertEqual(dataitem.String, '(test item has head and special tail comment)')\r
206 # Comment content\r
207 self.assertEqual(dataitem._HeadComment[0][0], '# sub2 head comment')\r
208 self.assertEqual(dataitem._TailComment[0][0], '# @comment test TailCommentStrategy branch')\r
209 # Comment line number\r
210 self.assertEqual(dataitem._HeadComment[0][1], 5)\r
211 self.assertEqual(dataitem._TailComment[0][1], 7)\r
212 \r
213 dataitem = data.ItemList[2]\r
214 self.assertEqual(dataitem.String, '(test item has no comment)')\r
215 # Comment content\r
216 self.assertEqual(dataitem._HeadComment, [])\r
217 self.assertEqual(dataitem._TailComment, [])\r
218 \r
219 data = dec.ItemObject[1]\r
220 self.assertEqual(data._HeadComment[0][0], '# test NextLine branch')\r
221 self.assertEqual(data._HeadComment[0][1], 11)\r
222 \r
223 # 1 subitems\r
224 self.assertEqual(len(data.ItemList), 1)\r
225 \r
226 dataitem = data.ItemList[0]\r
227 self.assertEqual(dataitem.String, 'sub-item')\r
228 self.assertEqual(dataitem._HeadComment, [])\r
229 self.assertEqual(dataitem._TailComment, [])\r
230\r
231#\r
232# Test _DecDefine._ParseItem\r
233#\r
234class DecDefineTestCase(unittest.TestCase):\r
235 def GetObj(self, Content):\r
236 Obj = _DecDefine(FileContent('dummy', Content.splitlines()))\r
237 Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()\r
238 return Obj\r
239\r
240 def testDecDefine(self):\r
241 item = self.GetObj('PACKAGE_NAME = MdePkg')._ParseItem()\r
242 self.assertEqual(item.Key, 'PACKAGE_NAME')\r
243 self.assertEqual(item.Value, 'MdePkg')\r
244 \r
245 def testDecDefine1(self):\r
246 obj = self.GetObj('PACKAGE_NAME')\r
247 self.assertRaises(FatalError, obj._ParseItem)\r
248 \r
249 def testDecDefine2(self):\r
250 obj = self.GetObj('unknown_key = ')\r
251 self.assertRaises(FatalError, obj._ParseItem)\r
252 \r
253 def testDecDefine3(self):\r
254 obj = self.GetObj('PACKAGE_NAME = ')\r
255 self.assertRaises(FatalError, obj._ParseItem)\r
256\r
257#\r
258# Test _DecLibraryclass._ParseItem\r
259#\r
260class DecLibraryTestCase(unittest.TestCase):\r
261 def GetObj(self, Content):\r
262 Obj = _DecLibraryclass(FileContent('dummy', Content.splitlines()))\r
263 Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()\r
264 return Obj\r
265 \r
266 def testNoInc(self):\r
267 obj = self.GetObj('UefiRuntimeLib')\r
268 self.assertRaises(FatalError, obj._ParseItem)\r
269 \r
270 def testEmpty(self):\r
271 obj = self.GetObj(' | ')\r
272 self.assertRaises(FatalError, obj._ParseItem)\r
273 \r
274 def testLibclassNaming(self):\r
275 obj = self.GetObj('lowercase_efiRuntimeLib|Include/Library/UefiRuntimeLib.h')\r
276 self.assertRaises(FatalError, obj._ParseItem)\r
277 \r
278 def testLibclassExt(self):\r
279 obj = self.GetObj('RuntimeLib|Include/Library/UefiRuntimeLib.no_h')\r
280 self.assertRaises(FatalError, obj._ParseItem)\r
281 \r
282 def testLibclassRelative(self):\r
283 obj = self.GetObj('RuntimeLib|Include/../UefiRuntimeLib.h')\r
284 self.assertRaises(FatalError, obj._ParseItem)\r
285\r
286#\r
287# Test _DecPcd._ParseItem\r
288#\r
289class DecPcdTestCase(unittest.TestCase):\r
290 def GetObj(self, Content):\r
291 Obj = _DecPcd(FileContent('dummy', Content.splitlines()))\r
292 Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()\r
293 Obj._RawData.CurrentScope = [('PcdsFeatureFlag'.upper(), 'COMMON')]\r
294 return Obj\r
295 \r
296 def testOK(self):\r
297 item = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')._ParseItem()\r
298 self.assertEqual(item.TokenSpaceGuidCName, 'gEfiMdePkgTokenSpaceGuid')\r
299 self.assertEqual(item.TokenCName, 'PcdComponentNameDisable')\r
300 self.assertEqual(item.DefaultValue, 'FALSE')\r
301 self.assertEqual(item.DatumType, 'BOOLEAN')\r
302 self.assertEqual(item.TokenValue, '0x0000000d')\r
303 \r
304 def testNoCvar(self):\r
305 obj = self.GetObj('123ai.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d')\r
306 self.assertRaises(FatalError, obj._ParseItem)\r
307 \r
308 def testSplit(self):\r
309 obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable FALSE|BOOLEAN|0x0000000d')\r
310 self.assertRaises(FatalError, obj._ParseItem)\r
311 \r
312 obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|BOOLEAN|0x0000000d | abc')\r
313 self.assertRaises(FatalError, obj._ParseItem)\r
314 \r
315 def testUnknownType(self):\r
316 obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|FALSE|unknown|0x0000000d')\r
317 self.assertRaises(FatalError, obj._ParseItem)\r
318 \r
319 def testVoid(self):\r
320 obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|abc|VOID*|0x0000000d')\r
321 self.assertRaises(FatalError, obj._ParseItem)\r
322 \r
323 def testUINT(self):\r
324 obj = self.GetObj('gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|0xabc|UINT8|0x0000000d')\r
325 self.assertRaises(FatalError, obj._ParseItem)\r
326\r
327#\r
328# Test _DecInclude._ParseItem\r
329#\r
330class DecIncludeTestCase(unittest.TestCase):\r
331 #\r
332 # Test code to be added\r
333 #\r
334 pass\r
335\r
336#\r
337# Test _DecGuid._ParseItem\r
338#\r
339class DecGuidTestCase(unittest.TestCase):\r
340 def GetObj(self, Content):\r
341 Obj = _DecGuid(FileContent('dummy', Content.splitlines()))\r
342 Obj._RawData.CurrentLine = Obj._RawData.GetNextLine()\r
343 Obj._RawData.CurrentScope = [('guids'.upper(), 'COMMON')]\r
344 return Obj\r
345 \r
346 def testCValue(self):\r
347 item = self.GetObj('gEfiIpSecProtocolGuid={ 0xdfb386f7, 0xe100, 0x43ad,'\r
348 ' {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')._ParseItem()\r
349 self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid')\r
350 self.assertEqual(item.GuidCValue, '{ 0xdfb386f7, 0xe100, 0x43ad, {0x9c, 0x9a, 0xed, 0x90, 0xd0, 0x8a, 0x5e, 0x12 }}')\r
351 \r
352 def testGuidString(self):\r
353 item = self.GetObj('gEfiIpSecProtocolGuid=1E73767F-8F52-4603-AEB4-F29B510B6766')._ParseItem()\r
354 self.assertEqual(item.GuidCName, 'gEfiIpSecProtocolGuid')\r
355 self.assertEqual(item.GuidCValue, '1E73767F-8F52-4603-AEB4-F29B510B6766')\r
356 \r
357 def testNoValue1(self):\r
358 obj = self.GetObj('gEfiIpSecProtocolGuid')\r
359 self.assertRaises(FatalError, obj._ParseItem)\r
360 \r
361 def testNoValue2(self):\r
362 obj = self.GetObj('gEfiIpSecProtocolGuid=')\r
363 self.assertRaises(FatalError, obj._ParseItem)\r
364 \r
365 def testNoName(self):\r
366 obj = self.GetObj('=')\r
367 self.assertRaises(FatalError, obj._ParseItem)\r
368\r
369#\r
370# Test Dec.__init__\r
371#\r
372class DecDecInitTestCase(unittest.TestCase):\r
373 def testNoDecFile(self):\r
374 self.assertRaises(FatalError, Dec, 'No_Such_File')\r
375\r
376class TmpFile:\r
377 def __init__(self, File):\r
378 self.File = File\r
379 \r
380 def Write(self, Content):\r
381 try:\r
382 FileObj = open(self.File, 'w')\r
383 FileObj.write(Content)\r
384 FileObj.close()\r
385 except:\r
386 pass\r
387 \r
388 def Remove(self):\r
389 try:\r
390 os.remove(self.File)\r
391 except:\r
392 pass\r
393\r
394#\r
395# Test Dec._UserExtentionSectionParser\r
396#\r
397class DecUESectionTestCase(unittest.TestCase):\r
398 def setUp(self):\r
399 self.File = TmpFile('test.dec')\r
400 self.File.Write(\r
401'''[userextensions.intel."myid"]\r
402[userextensions.intel."myid".IA32]\r
403[userextensions.intel."myid".IA32,]\r
404[userextensions.intel."myid]\r
405'''\r
406 )\r
407 \r
408 def tearDown(self):\r
409 self.File.Remove()\r
410 \r
411 def testUserExtentionHeader(self):\r
412 dec = Dec('test.dec', False)\r
413 \r
414 # OK: [userextensions.intel."myid"]\r
415 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
416 dec._UserExtentionSectionParser()\r
417 self.assertEqual(len(dec._RawData.CurrentScope), 1)\r
418 self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper())\r
419 self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel')\r
420 self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"')\r
421 self.assertEqual(dec._RawData.CurrentScope[0][3], 'COMMON')\r
422 \r
423 # OK: [userextensions.intel."myid".IA32]\r
424 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
425 dec._UserExtentionSectionParser()\r
426 self.assertEqual(len(dec._RawData.CurrentScope), 1)\r
427 self.assertEqual(dec._RawData.CurrentScope[0][0], 'userextensions'.upper())\r
428 self.assertEqual(dec._RawData.CurrentScope[0][1], 'intel')\r
429 self.assertEqual(dec._RawData.CurrentScope[0][2], '"myid"')\r
430 self.assertEqual(dec._RawData.CurrentScope[0][3], 'IA32')\r
431 \r
432 # Fail: [userextensions.intel."myid".IA32,]\r
433 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
434 self.assertRaises(FatalError, dec._UserExtentionSectionParser)\r
435 \r
436 # Fail: [userextensions.intel."myid]\r
437 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
438 self.assertRaises(FatalError, dec._UserExtentionSectionParser)\r
439\r
440#\r
441# Test Dec._SectionHeaderParser\r
442#\r
443class DecSectionTestCase(unittest.TestCase):\r
444 def setUp(self):\r
445 self.File = TmpFile('test.dec')\r
446 self.File.Write(\r
447'''[no section start or end\r
448[,] # empty sub-section\r
449[unknow_section_name]\r
450[Includes.IA32.other] # no third one\r
451[PcdsFeatureFlag, PcdsFixedAtBuild] # feature flag PCD must not be in the same section of other types of PCD\r
452[Includes.IA32, Includes.IA32]\r
453[Includes, Includes.IA32] # common cannot be with other arch\r
454[Includes.IA32, PcdsFeatureFlag] # different section name\r
455''' )\r
456 \r
457 def tearDown(self):\r
458 self.File.Remove()\r
459 \r
460 def testSectionHeader(self):\r
461 dec = Dec('test.dec', False)\r
462 # [no section start or end\r
463 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
464 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
465 \r
466 #[,] # empty sub-section\r
467 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
468 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
469 \r
470 # [unknow_section_name]\r
471 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
472 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
473 \r
474 # [Includes.IA32.other] # no third one\r
475 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
476 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
477 \r
478 # [PcdsFeatureFlag, PcdsFixedAtBuild]\r
479 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
480 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
481 \r
482 # [Includes.IA32, Includes.IA32]\r
483 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
484 dec._SectionHeaderParser()\r
485 self.assertEqual(len(dec._RawData.CurrentScope), 1)\r
486 self.assertEqual(dec._RawData.CurrentScope[0][0], 'Includes'.upper())\r
487 self.assertEqual(dec._RawData.CurrentScope[0][1], 'IA32')\r
488 \r
489 # [Includes, Includes.IA32] # common cannot be with other arch\r
490 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
491 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
492 \r
493 # [Includes.IA32, PcdsFeatureFlag] # different section name not allowed\r
494 dec._RawData.CurrentLine = CleanString(dec._RawData.GetNextLine())[0]\r
495 self.assertRaises(FatalError, dec._SectionHeaderParser)\r
496\r
497#\r
498# Test Dec._ParseDecComment\r
499#\r
500class DecDecCommentTestCase(unittest.TestCase):\r
501 def testDecHeadComment(self):\r
502 File = TmpFile('test.dec')\r
503 File.Write(\r
504 '''# abc\r
505 ##''')\r
506 dec = Dec('test.dec', False)\r
507 dec.ParseDecComment()\r
508 self.assertEqual(len(dec._HeadComment), 2)\r
509 self.assertEqual(dec._HeadComment[0][0], '# abc')\r
510 self.assertEqual(dec._HeadComment[0][1], 1)\r
511 self.assertEqual(dec._HeadComment[1][0], '##')\r
512 self.assertEqual(dec._HeadComment[1][1], 2)\r
513 File.Remove()\r
514 \r
515 def testNoDoubleComment(self):\r
516 File = TmpFile('test.dec')\r
517 File.Write(\r
518 '''# abc\r
519 #\r
520 [section_start]''')\r
521 dec = Dec('test.dec', False)\r
522 dec.ParseDecComment()\r
523 self.assertEqual(len(dec._HeadComment), 2)\r
524 self.assertEqual(dec._HeadComment[0][0], '# abc')\r
525 self.assertEqual(dec._HeadComment[0][1], 1)\r
526 self.assertEqual(dec._HeadComment[1][0], '#')\r
527 self.assertEqual(dec._HeadComment[1][1], 2)\r
528 File.Remove()\r
529\r
530if __name__ == '__main__':\r
531 import Logger.Logger\r
532 Logger.Logger.Initialize()\r
533 unittest.main()\r
534\r