]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Tests/TestTools.py
2 # Utility functions and classes for BaseTools unit tests
4 # Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
6 # This program and the accompanying materials
7 # are licensed and made available under the terms and conditions of the BSD License
8 # which accompanies this distribution. The full text of the license may be found at
9 # http://opensource.org/licenses/bsd-license.php
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.
28 TestsDir
= os
.path
.realpath(os
.path
.split(sys
.argv
[0])[0])
29 BaseToolsDir
= os
.path
.realpath(os
.path
.join(TestsDir
, '..'))
30 CSourceDir
= os
.path
.join(BaseToolsDir
, 'Source', 'C')
31 PythonSourceDir
= os
.path
.join(BaseToolsDir
, 'Source', 'Python')
32 TestTempDir
= os
.path
.join(TestsDir
, 'TestTempDir')
34 def MakeTheTestSuite(localItems
):
36 for name
, item
in localItems
.iteritems():
37 if isinstance(item
, types
.TypeType
):
38 if issubclass(item
, unittest
.TestCase
):
39 tests
.append(unittest
.TestLoader().loadTestsFromTestCase(item
))
40 elif issubclass(item
, unittest
.TestSuite
):
42 return lambda: unittest
.TestSuite(tests
)
44 def GetBaseToolsPath():
45 if sys
.platform
in ('win32', 'win64'):
46 return os
.path
.join(BaseToolsDir
, 'Bin', sys
.platform
.title())
47 elif sys
.platform
in ('cygwin'):
48 uname
= os
.popen('uname -sm').read().strip()
49 for char
in (' ', '/'):
50 uname
= uname
.replace(char
, '-')
51 return os
.path
.join(BaseToolsDir
, 'Bin', uname
)
53 uname
= os
.popen('uname -sm').read().strip()
54 for char
in (' ', '/'):
55 uname
= uname
.replace(char
, '-')
56 return os
.path
.join(BaseToolsDir
, 'BinWrappers', uname
)
58 BaseToolsBinPath
= GetBaseToolsPath()
60 class BaseToolsTest(unittest
.TestCase
):
62 def cleanOutDir(self
, dir):
63 for dirItem
in os
.listdir(dir):
64 if dirItem
in ('.', '..'): continue
65 dirItem
= os
.path
.join(dir, dirItem
)
66 self
.RemoveFileOrDir(dirItem
)
68 def CleanUpTmpDir(self
):
69 if os
.path
.exists(self
.testDir
):
70 self
.cleanOutDir(self
.testDir
)
72 def HandleTreeDeleteError(self
, function
, path
, excinfo
):
73 os
.chmod(path
, stat
.S_IWRITE
)
76 def RemoveDir(self
, dir):
77 shutil
.rmtree(dir, False, self
.HandleTreeDeleteError
)
79 def RemoveFileOrDir(self
, path
):
80 if not os
.path
.exists(path
):
82 elif os
.path
.isdir(path
):
87 def DisplayBinaryData(self
, description
, data
):
88 print description
, '(base64 encoded):'
89 b64data
= base64
.b64encode(data
)
92 def DisplayFile(self
, fileName
):
93 sys
.stdout
.write(self
.ReadTmpFile(fileName
))
96 def RunTool(self
, *args
, **kwd
):
97 if 'toolName' in kwd
: toolName
= kwd
['toolName']
99 if 'logFile' in kwd
: logFile
= kwd
['logFile']
102 if toolName
is None: toolName
= self
.toolName
103 bin
= os
.path
.join(self
.baseToolsBins
, toolName
)
104 if logFile
is not None:
105 logFile
= open(os
.path
.join(self
.testDir
, logFile
), 'w')
108 popenOut
= subprocess
.PIPE
110 args
= [toolName
] + list(args
)
112 Proc
= subprocess
.Popen(
113 args
, executable
=bin
,
114 stdout
=popenOut
, stderr
=subprocess
.STDOUT
122 def GetTmpFilePath(self
, fileName
):
123 return os
.path
.join(self
.testDir
, fileName
)
125 def OpenTmpFile(self
, fileName
, mode
= 'r'):
126 return open(os
.path
.join(self
.testDir
, fileName
), mode
)
128 def ReadTmpFile(self
, fileName
):
129 f
= open(self
.GetTmpFilePath(fileName
), 'r')
134 def WriteTmpFile(self
, fileName
, data
):
135 f
= open(self
.GetTmpFilePath(fileName
), 'w')
139 def GenRandomFileData(self
, fileName
, minlen
= None, maxlen
= None):
140 if maxlen
is None: maxlen
= minlen
141 f
= self
.OpenTmpFile(fileName
, 'w')
142 f
.write(self
.GetRandomString(minlen
, maxlen
))
145 def GetRandomString(self
, minlen
= None, maxlen
= None):
146 if minlen
is None: minlen
= 1024
147 if maxlen
is None: maxlen
= minlen
149 [chr(random
.randint(0,255))
150 for x
in xrange(random
.randint(minlen
, maxlen
))
154 self
.savedEnvPath
= os
.environ
['PATH']
155 self
.savedSysPath
= sys
.path
[:]
157 self
.baseToolsBins
= BaseToolsBinPath
158 os
.environ
['PATH'] = \
159 os
.path
.pathsep
.join((os
.environ
['PATH'], self
.baseToolsBins
))
161 self
.testDir
= TestTempDir
162 if not os
.path
.exists(self
.testDir
):
163 os
.mkdir(self
.testDir
)
165 self
.cleanOutDir(self
.testDir
)
168 self
.RemoveFileOrDir(self
.testDir
)
170 os
.environ
['PATH'] = self
.savedEnvPath
171 sys
.path
= self
.savedSysPath