2016-01-15 14:55:33 +01:00
|
|
|
# Copyright (C) 2016 The Qt Company Ltd.
|
2022-08-19 15:59:36 +02:00
|
|
|
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2013-05-15 13:17:33 +02:00
|
|
|
|
2013-01-18 16:31:48 +01:00
|
|
|
def handleDebuggerWarnings(config, isMsvcBuild=False):
|
|
|
|
if isMsvcBuild:
|
2012-01-31 15:49:59 +01:00
|
|
|
try:
|
2013-05-27 16:34:17 +02:00
|
|
|
popup = waitForObject("{name='msgLabel' text?='<html><head/><body>*' type='QLabel' visible='1' window=':Dialog_Debugger::Internal::SymbolPathsDialog'}", 10000)
|
2013-05-28 13:43:05 +02:00
|
|
|
symServerNotConfiged = ("<html><head/><body><p>The debugger is not configured to use the public "
|
|
|
|
"Microsoft Symbol Server.<br/>"
|
|
|
|
"This is recommended for retrieval of the symbols of the operating system libraries.</p>"
|
|
|
|
"<p><span style=\" font-style:italic;\">Note:</span> It is recommended, that if you use the Microsoft Symbol Server, "
|
|
|
|
"to also use a local symbol cache.<br/>"
|
|
|
|
"A fast internet connection is required for this to work smoothly,<br/>"
|
|
|
|
"and a delay might occur when connecting for the first time and caching the symbols.</p>"
|
|
|
|
"<p>What would you like to set up?</p></body></html>")
|
2012-01-31 15:49:59 +01:00
|
|
|
if popup.text == symServerNotConfiged:
|
|
|
|
test.log("Creator warned about the debugger not being configured to use the public Microsoft Symbol Server.")
|
|
|
|
else:
|
|
|
|
test.warning("Creator showed an unexpected warning: " + str(popup.text))
|
2013-05-27 16:34:17 +02:00
|
|
|
clickButton(waitForObject("{text='Cancel' type='QPushButton' unnamed='1' visible='1' window=':Dialog_Debugger::Internal::SymbolPathsDialog'}", 10000))
|
2012-01-31 15:49:59 +01:00
|
|
|
except LookupError:
|
|
|
|
pass # No warning. Fine.
|
2022-03-18 13:08:28 +01:00
|
|
|
isReleaseConfig = "Release" in config and not "with Debug Information" in config
|
|
|
|
if isReleaseConfig and (isMsvcBuild or platform.system() == "Linux"):
|
2013-10-25 10:45:42 +02:00
|
|
|
msgBox = "{type='QMessageBox' unnamed='1' visible='1' windowTitle='Warning'}"
|
|
|
|
message = waitForObject("{name='qt_msgbox_label' type='QLabel' visible='1' window=%s}" % msgBox)
|
2013-06-20 13:26:01 +02:00
|
|
|
messageText = str(message.text)
|
|
|
|
test.verify(messageText.startswith('This does not seem to be a "Debug" build.\nSetting breakpoints by file name and line number may fail.'),
|
|
|
|
"Got warning: %s" % messageText)
|
2013-10-25 10:45:42 +02:00
|
|
|
clickButton("{text='OK' type='QPushButton' unnamed='1' visible='1' window=%s}" % msgBox)
|
2012-01-31 15:49:59 +01:00
|
|
|
|
|
|
|
def takeDebuggerLog():
|
2020-06-24 19:01:48 +02:00
|
|
|
invokeMenuItem("View", "Views", "Global Debugger Log")
|
2018-10-02 10:34:33 +02:00
|
|
|
debuggerLogWindow = waitForObject("{container=':DebugModeWidget.Debugger Log_QDockWidget' "
|
|
|
|
"type='Debugger::Internal::DebuggerPane' unnamed='1' visible='1'}")
|
2012-01-31 15:49:59 +01:00
|
|
|
debuggerLog = str(debuggerLogWindow.plainText)
|
2019-07-24 15:12:16 +02:00
|
|
|
mouseClick(debuggerLogWindow)
|
2013-02-20 19:49:32 +01:00
|
|
|
invokeContextMenuItem(debuggerLogWindow, "Clear Contents")
|
2012-01-31 15:49:59 +01:00
|
|
|
waitFor("str(debuggerLogWindow.plainText)==''", 5000)
|
2020-06-24 19:01:48 +02:00
|
|
|
invokeMenuItem("View", "Views", "Global Debugger Log")
|
2012-01-31 15:49:59 +01:00
|
|
|
return debuggerLog
|
2012-03-26 14:13:39 +02:00
|
|
|
|
|
|
|
# function to set breakpoints for the current project
|
2012-05-03 11:47:35 +02:00
|
|
|
# on the given file,line pairs inside the given list of dicts
|
2012-03-26 14:13:39 +02:00
|
|
|
# the lines are treated as regular expression
|
2021-04-21 20:43:09 +02:00
|
|
|
# returns None on error or a list of dictionaries each containing full path and line number of a
|
|
|
|
# single breakpoint
|
|
|
|
# If you passed in the breakpoints in the right order, you can use the return value as input to
|
|
|
|
# doSimpleDebugging()
|
2012-03-26 14:13:39 +02:00
|
|
|
def setBreakpointsForCurrentProject(filesAndLines):
|
|
|
|
switchViewTo(ViewConstants.DEBUG)
|
|
|
|
removeOldBreakpoints()
|
2012-05-03 11:47:35 +02:00
|
|
|
if not filesAndLines or not isinstance(filesAndLines, (list,tuple)):
|
|
|
|
test.fatal("This function only takes a non-empty list/tuple holding dicts.")
|
2021-04-21 20:43:09 +02:00
|
|
|
return None
|
2018-08-02 13:45:34 +02:00
|
|
|
waitForObject("{type='Utils::NavigationTreeView' unnamed='1' visible='1' "
|
|
|
|
"window=':Qt Creator_Core::Internal::MainWindow'}")
|
2021-04-21 20:43:09 +02:00
|
|
|
breakPointList = []
|
2012-05-03 11:47:35 +02:00
|
|
|
for current in filesAndLines:
|
|
|
|
for curFile,curLine in current.iteritems():
|
2013-01-31 13:33:11 +01:00
|
|
|
if not openDocument(curFile):
|
2021-04-21 20:43:09 +02:00
|
|
|
return None
|
2014-06-04 09:44:20 +02:00
|
|
|
editor = getEditorForFileSuffix(curFile, True)
|
2012-05-03 11:47:35 +02:00
|
|
|
if not placeCursorToLine(editor, curLine, True):
|
2021-04-21 20:43:09 +02:00
|
|
|
return None
|
2022-03-15 13:22:50 +01:00
|
|
|
invokeMenuItem("Debug", "Enable or Disable Breakpoint")
|
2021-04-21 20:43:09 +02:00
|
|
|
filePath = str(waitForObjectExists(":Qt Creator_FilenameQComboBox").toolTip)
|
2021-08-18 16:00:55 +02:00
|
|
|
breakPointList.append({filePath:lineNumberWithCursor(editor)})
|
2013-01-31 13:33:11 +01:00
|
|
|
test.log('Set breakpoint in %s' % curFile, curLine)
|
2012-05-04 17:15:29 +02:00
|
|
|
try:
|
2012-05-07 19:57:20 +02:00
|
|
|
breakPointTreeView = waitForObject(":Breakpoints_Debugger::Internal::BreakTreeView")
|
2012-05-04 17:15:29 +02:00
|
|
|
waitFor("breakPointTreeView.model().rowCount() == len(filesAndLines)", 2000)
|
|
|
|
except:
|
|
|
|
test.fatal("UI seems to have changed - check manually and fix this script.")
|
2021-04-21 20:43:09 +02:00
|
|
|
return None
|
2012-03-26 14:13:39 +02:00
|
|
|
test.compare(breakPointTreeView.model().rowCount(), len(filesAndLines),
|
|
|
|
'Expected %d set break points, found %d listed' %
|
|
|
|
(len(filesAndLines), breakPointTreeView.model().rowCount()))
|
2021-04-21 20:43:09 +02:00
|
|
|
return breakPointList
|
2012-03-26 14:13:39 +02:00
|
|
|
|
|
|
|
# helper that removes all breakpoints - assumes that it's getting called
|
|
|
|
# being already on Debug view and Breakpoints widget is not disabled
|
|
|
|
def removeOldBreakpoints():
|
|
|
|
test.log("Removing old breakpoints if there are any")
|
|
|
|
try:
|
2012-05-07 19:57:20 +02:00
|
|
|
breakPointTreeView = waitForObject(":Breakpoints_Debugger::Internal::BreakTreeView")
|
2012-03-26 14:13:39 +02:00
|
|
|
model = breakPointTreeView.model()
|
|
|
|
if model.rowCount()==0:
|
|
|
|
test.log("No breakpoints found...")
|
|
|
|
else:
|
|
|
|
test.log("Found %d breakpoints - removing them" % model.rowCount())
|
2012-10-25 12:59:03 +02:00
|
|
|
for currentIndex in dumpIndices(model):
|
2012-03-26 14:13:39 +02:00
|
|
|
rect = breakPointTreeView.visualRect(currentIndex)
|
|
|
|
mouseClick(breakPointTreeView, rect.x+5, rect.y+5, 0, Qt.LeftButton)
|
|
|
|
type(breakPointTreeView, "<Delete>")
|
2012-05-04 17:15:29 +02:00
|
|
|
except:
|
|
|
|
test.fatal("UI seems to have changed - check manually and fix this script.")
|
|
|
|
return False
|
2016-08-03 07:18:31 +02:00
|
|
|
waitFor("model.rowCount() == 0", 1000)
|
2012-03-26 14:13:39 +02:00
|
|
|
return test.compare(model.rowCount(), 0, "Check if all breakpoints have been removed.")
|
|
|
|
|
|
|
|
# function to do simple debugging of the current (configured) project
|
2018-08-02 11:26:43 +02:00
|
|
|
# param currentKit specifies the ID of the kit to use (see class Targets)
|
2013-01-18 16:31:48 +01:00
|
|
|
# param currentConfigName is the name of the configuration that should be used
|
2012-03-26 14:13:39 +02:00
|
|
|
# param expectedBPOrder holds a list of dicts where the dicts contain always
|
|
|
|
# only 1 key:value pair - the key is the name of the file, the value is
|
|
|
|
# line number where the debugger should stop
|
2021-04-21 20:43:09 +02:00
|
|
|
# This can be the return value of setBreakpointsForCurrentProject() if you
|
|
|
|
# passed the breakpoints into that function in the right order
|
2021-04-21 14:44:03 +02:00
|
|
|
def doSimpleDebugging(currentKit, currentConfigName, expectedBPOrder=[], enableQml=True):
|
2018-09-24 09:39:59 +02:00
|
|
|
expectedLabelTexts = ['Stopped\.', 'Stopped at breakpoint \d+ in thread \d+\.']
|
2012-03-26 14:13:39 +02:00
|
|
|
if len(expectedBPOrder) == 0:
|
|
|
|
expectedLabelTexts.append("Running\.")
|
2014-02-28 14:20:46 +01:00
|
|
|
switchViewTo(ViewConstants.PROJECTS)
|
2018-08-02 11:26:43 +02:00
|
|
|
switchToBuildOrRunSettingsFor(currentKit, ProjectSettings.RUN)
|
2021-08-10 11:29:02 +02:00
|
|
|
ensureChecked(waitForObject("{container=':Qt Creator_Core::Internal::MainWindow' text='Enable QML' "
|
2014-02-28 14:20:46 +01:00
|
|
|
"type='QCheckBox' unnamed='1' visible='1'}"), enableQml)
|
|
|
|
switchViewTo(ViewConstants.EDIT)
|
2018-08-02 11:26:43 +02:00
|
|
|
if not __startDebugger__(currentKit, currentConfigName):
|
2012-03-26 14:13:39 +02:00
|
|
|
return False
|
|
|
|
statusLabel = findObject(":Debugger Toolbar.StatusText_Utils::StatusLabel")
|
2021-04-21 14:44:03 +02:00
|
|
|
test.log("Continuing debugging %d times..." % len(expectedBPOrder))
|
|
|
|
for expectedBP in expectedBPOrder:
|
2012-03-26 14:13:39 +02:00
|
|
|
if waitFor("regexVerify(str(statusLabel.text), expectedLabelTexts)", 20000):
|
2021-04-21 14:44:03 +02:00
|
|
|
verifyBreakPoint(expectedBP)
|
2012-03-26 14:13:39 +02:00
|
|
|
else:
|
|
|
|
test.fail('%s' % str(statusLabel.text))
|
2016-04-07 12:31:32 +02:00
|
|
|
try:
|
|
|
|
contDbg = waitForObject(":*Qt Creator.Continue_Core::Internal::FancyToolButton", 3000)
|
|
|
|
test.log("Continuing...")
|
|
|
|
clickButton(contDbg)
|
|
|
|
except LookupError:
|
|
|
|
test.fail("Debugger did not stop at breakpoint")
|
2012-03-26 14:13:39 +02:00
|
|
|
waitFor("str(statusLabel.text) == 'Running.'", 5000)
|
|
|
|
timedOut = not waitFor("str(statusLabel.text) in ['Running.', 'Debugger finished.']", 30000)
|
|
|
|
if timedOut:
|
|
|
|
test.log("Waiting for 'Running.' / 'Debugger finished.' timed out.",
|
|
|
|
"Debugger is in state: '%s'..." % statusLabel.text)
|
|
|
|
if str(statusLabel.text) == 'Running.':
|
|
|
|
test.log("Debugger is still running... Will be stopped.")
|
|
|
|
return __stopDebugger__()
|
|
|
|
elif str(statusLabel.text) == 'Debugger finished.':
|
|
|
|
test.log("Debugger has finished.")
|
|
|
|
return __logDebugResult__()
|
|
|
|
else:
|
|
|
|
test.log("Trying to stop debugger...")
|
|
|
|
try:
|
|
|
|
return __stopDebugger__()
|
|
|
|
except:
|
|
|
|
# if stopping failed - debugger had already stopped
|
|
|
|
return True
|
|
|
|
|
2018-08-02 11:26:43 +02:00
|
|
|
# param currentKit specifies the ID of the kit to use (see class Targets)
|
|
|
|
def isMsvcConfig(currentKit):
|
2022-09-15 19:41:53 +02:00
|
|
|
if platform.system() not in ('Microsoft' 'Windows'):
|
|
|
|
return False
|
2013-01-18 16:31:48 +01:00
|
|
|
switchViewTo(ViewConstants.PROJECTS)
|
2018-08-02 11:26:43 +02:00
|
|
|
switchToBuildOrRunSettingsFor(currentKit, ProjectSettings.BUILD)
|
2022-03-15 15:34:22 +01:00
|
|
|
|
|
|
|
waitForObject(":Projects.ProjectNavigationTreeView")
|
|
|
|
bAndRIndex = getQModelIndexStr("text='Build & Run'", ":Projects.ProjectNavigationTreeView")
|
|
|
|
wantedKitName = Targets.getStringForTarget(currentKit)
|
|
|
|
wantedKitIndexString = getQModelIndexStr("text='%s'" % wantedKitName, bAndRIndex)
|
|
|
|
if not test.verify(__kitIsActivated__(findObject(wantedKitIndexString)),
|
|
|
|
"Verifying target '%s' is enabled." % wantedKitName):
|
|
|
|
raise Exception("Kit '%s' is not activated in the project." % wantedKitName)
|
|
|
|
index = waitForObject(wantedKitIndexString)
|
|
|
|
toolTip = str(index.data(Qt.ToolTipRole).toString())
|
2022-09-15 19:41:53 +02:00
|
|
|
compilerPattern = re.compile('<dt style="font-weight:bold">Compiler:</dt><dd>(?P<compiler>.+)'
|
|
|
|
'</dd><dt style="font-weight:bold">Environment:')
|
2022-03-15 15:34:22 +01:00
|
|
|
match = compilerPattern.search(toolTip)
|
|
|
|
if match is None:
|
|
|
|
test.warning("UI seems to have changed - failed to check for compiler.")
|
|
|
|
return False
|
|
|
|
|
|
|
|
compiler = str(match.group("compiler"))
|
|
|
|
isMsvc = compiler.startswith("MSVC") or compiler.startswith("Microsoft Visual C")
|
2013-01-18 16:31:48 +01:00
|
|
|
switchViewTo(ViewConstants.EDIT)
|
|
|
|
return isMsvc
|
|
|
|
|
2018-08-02 11:26:43 +02:00
|
|
|
# param currentKit specifies the ID of the kit to use (see class Targets)
|
2013-01-18 16:31:48 +01:00
|
|
|
# param config is the name of the configuration that should be used
|
2018-08-02 11:26:43 +02:00
|
|
|
def __startDebugger__(currentKit, config):
|
|
|
|
isMsvcBuild = isMsvcConfig(currentKit)
|
2012-03-26 14:13:39 +02:00
|
|
|
clickButton(waitForObject(":*Qt Creator.Start Debugging_Core::Internal::FancyToolButton"))
|
2013-01-18 16:31:48 +01:00
|
|
|
handleDebuggerWarnings(config, isMsvcBuild)
|
2012-03-26 14:13:39 +02:00
|
|
|
try:
|
2013-08-19 18:04:16 +02:00
|
|
|
mBox = waitForObject(":Failed to start application_QMessageBox", 5000)
|
2012-03-26 14:13:39 +02:00
|
|
|
mBoxText = mBox.text
|
|
|
|
mBoxIText = mBox.informativeText
|
|
|
|
clickButton(":DebugModeWidget.OK_QPushButton")
|
|
|
|
test.fail("Debugger hasn't started... QMessageBox appeared!")
|
|
|
|
test.log("QMessageBox content: '%s'" % mBoxText,
|
|
|
|
"'%s'" % mBoxIText)
|
|
|
|
return False
|
|
|
|
except:
|
|
|
|
pass
|
2013-08-19 18:04:16 +02:00
|
|
|
if not test.verify(waitFor("object.exists(':Debugger Toolbar.Continue_QToolButton')", 60000),
|
|
|
|
"Verify start of debugger"):
|
2012-03-26 14:13:39 +02:00
|
|
|
if "MSVC" in config:
|
|
|
|
debuggerLog = takeDebuggerLog()
|
|
|
|
if "lib\qtcreatorcdbext64\qtcreatorcdbext.dll cannot be found." in debuggerLog:
|
|
|
|
test.fatal("qtcreatorcdbext.dll is missing in lib\qtcreatorcdbext64")
|
|
|
|
else:
|
|
|
|
test.fatal("Debugger log did not behave as expected. Please check manually.")
|
|
|
|
logApplicationOutput()
|
|
|
|
return False
|
|
|
|
try:
|
|
|
|
waitForObject(":*Qt Creator.Interrupt_Core::Internal::FancyToolButton", 3000)
|
|
|
|
test.passes("'Interrupt' (debugger) button visible.")
|
|
|
|
except:
|
|
|
|
try:
|
|
|
|
waitForObject(":*Qt Creator.Continue_Core::Internal::FancyToolButton", 3000)
|
|
|
|
test.passes("'Continue' (debugger) button visible.")
|
|
|
|
except:
|
|
|
|
test.fatal("Neither 'Interrupt' nor 'Continue' button visible (Debugger).")
|
|
|
|
return True
|
|
|
|
|
|
|
|
def __stopDebugger__():
|
|
|
|
clickButton(waitForObject(":Debugger Toolbar.Exit Debugger_QToolButton"))
|
2012-09-05 16:49:35 +02:00
|
|
|
ensureChecked(":Qt Creator_AppOutput_Core::Internal::OutputPaneToggleButton")
|
2012-11-02 19:34:38 +01:00
|
|
|
output = waitForObject("{type='Core::OutputWindow' visible='1' windowTitle='Application Output Window'}")
|
2012-03-26 14:13:39 +02:00
|
|
|
waitFor("'Debugging has finished' in str(output.plainText)", 20000)
|
|
|
|
return __logDebugResult__()
|
|
|
|
|
|
|
|
def __logDebugResult__():
|
|
|
|
try:
|
|
|
|
result = waitForObject(":*Qt Creator.Start Debugging_Core::Internal::FancyToolButton")
|
|
|
|
test.passes("'Start Debugging' button visible.")
|
|
|
|
except:
|
|
|
|
test.fail("'Start Debugging' button is not visible.")
|
|
|
|
result = None
|
|
|
|
if result:
|
|
|
|
test.passes("Debugger stopped.. Qt Creator is back at normal state.")
|
|
|
|
else:
|
|
|
|
test.fail("Debugger seems to have not stopped...")
|
|
|
|
logApplicationOutput()
|
|
|
|
return result
|
|
|
|
|
|
|
|
def verifyBreakPoint(bpToVerify):
|
|
|
|
if isinstance(bpToVerify, dict):
|
|
|
|
fileName = bpToVerify.keys()[0]
|
|
|
|
editor = getEditorForFileSuffix(fileName)
|
2013-03-08 10:54:46 +01:00
|
|
|
if editor:
|
2013-03-08 10:49:14 +01:00
|
|
|
test.compare(waitForObject(":DebugModeWidget_QComboBox").toolTip, fileName,
|
|
|
|
"Verify that the right file is opened")
|
2021-04-21 20:43:09 +02:00
|
|
|
line = lineNumberWithCursor(editor)
|
2013-03-08 10:54:46 +01:00
|
|
|
windowTitle = str(waitForObject(":Qt Creator_Core::Internal::MainWindow").windowTitle)
|
2017-08-29 17:48:37 +02:00
|
|
|
test.verify(windowTitle.startswith(os.path.basename(fileName) + " "),
|
2013-03-08 10:54:46 +01:00
|
|
|
"Verify that Creator's window title changed according to current file")
|
|
|
|
return test.compare(line, bpToVerify.values()[0],
|
|
|
|
"Compare hit breakpoint to expected line number in %s" % fileName)
|
2012-03-26 14:13:39 +02:00
|
|
|
else:
|
|
|
|
test.fatal("Expected a dict for bpToVerify - got '%s'" % className(bpToVerify))
|
|
|
|
return False
|
2018-04-10 22:10:33 +02:00
|
|
|
|
|
|
|
# helper to check whether win firewall is running or not
|
|
|
|
# this doesn't check for other firewalls!
|
|
|
|
def __isWinFirewallRunning__():
|
|
|
|
if hasattr(__isWinFirewallRunning__, "fireWallState"):
|
|
|
|
return __isWinFirewallRunning__.fireWallState
|
2019-05-02 18:16:47 +02:00
|
|
|
if platform.system() not in ('Microsoft' 'Windows'):
|
2018-04-10 22:10:33 +02:00
|
|
|
__isWinFirewallRunning__.fireWallState = False
|
|
|
|
return False
|
|
|
|
result = getOutputFromCmdline(["netsh", "firewall", "show", "state"])
|
|
|
|
for line in result.splitlines():
|
|
|
|
if "Operational mode" in line:
|
|
|
|
__isWinFirewallRunning__.fireWallState = not "Disable" in line
|
|
|
|
return __isWinFirewallRunning__.fireWallState
|
|
|
|
return None
|
|
|
|
|
|
|
|
# helper that can modify the win firewall to allow a program to communicate through it or delete it
|
|
|
|
# param addToFW defines whether to add (True) or delete (False) this program to/from the firewall
|
|
|
|
def __configureFW__(workingDir, projectName, isReleaseBuild, addToFW=True):
|
|
|
|
if isReleaseBuild == None:
|
|
|
|
if projectName[-4:] == ".exe":
|
|
|
|
projectName = projectName[:-4]
|
|
|
|
path = "%s%s%s" % (workingDir, os.sep, projectName)
|
|
|
|
elif isReleaseBuild:
|
|
|
|
path = "%s%s%s%srelease%s%s" % (workingDir, os.sep, projectName, os.sep, os.sep, projectName)
|
|
|
|
else:
|
|
|
|
path = "%s%s%s%sdebug%s%s" % (workingDir, os.sep, projectName, os.sep, os.sep, projectName)
|
|
|
|
if addToFW:
|
|
|
|
mode = "add"
|
|
|
|
enable = "ENABLE"
|
|
|
|
else:
|
|
|
|
mode = "delete"
|
|
|
|
enable = ""
|
|
|
|
projectName = ""
|
|
|
|
# Needs admin privileges on Windows 7
|
|
|
|
# Using the deprecated "netsh firewall" because the newer
|
|
|
|
# "netsh advfirewall" would need admin privileges on Windows Vista, too.
|
|
|
|
return subprocess.call(["netsh", "firewall", mode, "allowedprogram",
|
|
|
|
"%s.exe" % path, projectName, enable])
|
|
|
|
|
|
|
|
# function to add a program to allow communication through the win firewall
|
|
|
|
# param workingDir this directory is the parent of the project folder
|
|
|
|
# param projectName this is the name of the project (the folder inside workingDir as well as the name for the executable)
|
|
|
|
# param isReleaseBuild should currently always be set to True (will later add debug build testing)
|
|
|
|
def allowAppThroughWinFW(workingDir, projectName, isReleaseBuild=True):
|
|
|
|
if not __isWinFirewallRunning__():
|
|
|
|
return
|
|
|
|
# WinFirewall seems to run - hopefully no other
|
|
|
|
result = __configureFW__(workingDir, projectName, isReleaseBuild)
|
|
|
|
if result == 0:
|
|
|
|
test.log("Added %s to firewall" % projectName)
|
|
|
|
else:
|
|
|
|
test.fatal("Could not add %s as allowed program to win firewall" % projectName)
|
|
|
|
|
|
|
|
# function to delete a (former added) program from the win firewall
|
|
|
|
# param workingDir this directory is the parent of the project folder
|
|
|
|
# param projectName this is the name of the project (the folder inside workingDir as well as the name for the executable)
|
|
|
|
# param isReleaseBuild should currently always be set to True (will later add debug build testing)
|
|
|
|
def deleteAppFromWinFW(workingDir, projectName, isReleaseBuild=True):
|
|
|
|
if not __isWinFirewallRunning__():
|
|
|
|
return
|
|
|
|
# WinFirewall seems to run - hopefully no other
|
|
|
|
result = __configureFW__(workingDir, projectName, isReleaseBuild, False)
|
|
|
|
if result == 0:
|
|
|
|
test.log("Deleted %s from firewall" % projectName)
|
|
|
|
else:
|
|
|
|
test.warning("Could not delete %s as allowed program from win firewall" % (projectName))
|