Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
alecs_myu
erp5
Commits
0a1a952f
Commit
0a1a952f
authored
Jun 29, 2017
by
Jérome Perrin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
tests: remove old way of running functional tests
parent
ae59d7cd
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
459 deletions
+0
-459
product/ERP5Type/tests/runFunctionalTest.py
product/ERP5Type/tests/runFunctionalTest.py
+0
-370
product/ERP5Type/tests/sendMail.py
product/ERP5Type/tests/sendMail.py
+0
-89
No files found.
product/ERP5Type/tests/runFunctionalTest.py
deleted
100644 → 0
View file @
ae59d7cd
#!/usr/bin/env python2.7
import
os
import
re
import
signal
import
sys
import
shutil
import
getopt
from
time
import
sleep
import
urllib2
from
subprocess
import
Popen
,
PIPE
from
sendMail
import
sendMail
import
atexit
print
"DEPRECATION WARNING: This command 'runFunctionalTest' is Deprecated, "
+
\
"you should use ERP5TypeFunctionalTestCase and runUnitTest instead."
+
\
"You can take a look at testFunctionalCore.py"
__doc__
=
"""%(program)s: Zelenium functional test runner for the ERP5 Project
usage: %(program)s [options]
Options:
-h, --help this help screen
--email_to_address=STRING send results to this address by email (defaults to
erp5-report@erp5.org)
--smtp_host=hostname specify SMTP server
-s, --stdout print the results on stdout instead of sending
results by email (unless email_to_address is also
passed explicitly)
-d, --debug run firefox on current DISPLAY instead of on Xvfb
--host the hostname of this ERP5 instance
--port the port of this ERP5 instance
--portal_name the ID of the ERP5 site
URLs will start with:
http://${host}:${port}/${portal_name}/
--run_only=STRING run only specified test suite (should be only one)
--email_subject the email subject to be sent
--xvfb_display=STRING Define a xvfb display to be used.
Notes:
* You need to prepare first test environment by using following command:
./runUnitTest.py --save prepareFunctionalTest.py
"""
tests_framework_home
=
os
.
path
.
dirname
(
os
.
path
.
abspath
(
__file__
))
# handle 'system global' instance
if
tests_framework_home
.
startswith
(
'/usr/lib'
):
real_instance_home
=
'/var/lib/erp5'
else
:
real_instance_home
=
os
.
path
.
sep
.
join
(
tests_framework_home
.
split
(
os
.
path
.
sep
)[:
-
3
])
instance_home
=
os
.
path
.
join
(
real_instance_home
,
'unit_test'
)
bt5_dir_list
=
','
.
join
([
os
.
path
.
join
(
instance_home
,
'Products/ERP5/bootstrap'
),
os
.
path
.
join
(
instance_home
,
'bt5'
)])
class
FunctionalTestRunner
:
"""
Used to run Functional tests
"""
def
__init__
(
self
,
instance_home
):
self
.
instance_home
=
instance_home
self
.
xvfb_fbdir
=
instance_home
self
.
send_mail
=
0
self
.
stdout
=
0
self
.
debug
=
0
self
.
email_to_address
=
'erp5-report@erp5.org'
self
.
smtp_host
=
''
self
.
host
=
'localhost'
self
.
port
=
8080
self
.
user
=
'ERP5TypeTestCase'
self
.
password
=
''
self
.
portal_name
=
'erp5_portal'
self
.
run_only
=
''
self
.
email_subject
=
'ERP5'
self
.
xvfb_display
=
'123'
self
.
profile_dir
=
os
.
path
.
join
(
instance_home
,
'profile'
)
def
usage
(
self
,
stream
,
msg
=
None
):
if
msg
:
print
>>
stream
,
msg
print
>>
stream
program
=
os
.
path
.
basename
(
sys
.
argv
[
0
])
print
>>
stream
,
__doc__
%
{
"program"
:
program
}
def
parseArgs
(
self
,
arguments
=
None
):
if
arguments
is
None
:
arguments
=
sys
.
argv
[
1
:]
try
:
opts
,
args
=
getopt
.
getopt
(
arguments
,
"hsd"
,
[
"help"
,
"stdout"
,
"debug"
,
"email_to_address="
,
"host="
,
"port="
,
"portal_name="
,
"run_only="
,
"user="
,
"password="
,
"alarms="
,
"email_subject="
,
"smtp_host="
,
"xvfb_display="
]
)
except
getopt
.
GetoptError
,
msg
:
self
.
usage
(
sys
.
stderr
,
msg
)
sys
.
exit
(
2
)
for
opt
,
arg
in
opts
:
if
opt
in
(
"-s"
,
"--stdout"
):
self
.
stdout
=
1
elif
opt
in
(
"-d"
,
"--debug"
):
self
.
debug
=
1
elif
opt
==
'--email_to_address'
:
self
.
email_to_address
=
arg
self
.
send_mail
=
1
elif
opt
==
'--smtp_host'
:
self
.
smtp_host
=
arg
elif
opt
in
(
'-h'
,
'--help'
):
self
.
usage
(
sys
.
stdout
)
sys
.
exit
()
elif
opt
==
"--host"
:
self
.
host
=
arg
elif
opt
==
"--port"
:
self
.
port
=
int
(
arg
)
elif
opt
==
"--portal_name"
:
self
.
portal_name
=
arg
elif
opt
==
"--run_only"
:
self
.
run_only
=
arg
elif
opt
==
"--user"
:
user
=
arg
elif
opt
==
"--password"
:
password
=
arg
elif
opt
==
"--email_subject"
:
self
.
email_subject
=
arg
elif
opt
==
"--xvfb_display"
:
self
.
xvfb_display
=
arg
if
not
self
.
stdout
:
self
.
send_mail
=
1
self
.
portal_url
=
"http://%s:%d/%s"
%
(
self
.
host
,
self
.
port
,
self
.
portal_name
)
def
openUrl
(
self
,
url
):
# Send Accept-Charset headers to activate the UnicodeConflictResolver
# (imitating firefox 3.5.9 here)
headers
=
{
'Accept-Charset'
:
'ISO-8859-1,utf-8;q=0.7,*;q=0.7'
}
request
=
urllib2
.
Request
(
url
,
headers
=
headers
)
# Try to use long timeout, this is needed when there is many
# activities runing
try
:
f
=
urllib2
.
urlopen
(
request
,
timeout
=
3600
*
4
)
except
TypeError
:
f
=
urllib2
.
urlopen
(
request
)
file_content
=
f
.
read
()
f
.
close
()
return
file_content
def
main
(
self
):
self
.
setUp
()
self
.
launchFuntionalTest
()
def
launchFuntionalTest
(
self
):
status
=
self
.
getStatus
()
xvfb_pid
=
None
firefox_pid
=
None
try
:
if
not
self
.
debug
:
xvfb_pid
=
self
.
runXvfb
(
self
.
xvfb_display
)
firefox_pid
=
self
.
runFirefox
(
self
.
xvfb_display
)
while
True
:
sleep
(
10
)
cur_status
=
self
.
getStatus
()
if
status
!=
cur_status
:
break
finally
:
if
xvfb_pid
:
os
.
kill
(
xvfb_pid
,
signal
.
SIGTERM
)
if
firefox_pid
:
os
.
kill
(
firefox_pid
,
signal
.
SIGTERM
)
def
startZope
(
self
):
os
.
environ
[
'erp5_save_data_fs'
]
=
"1"
os
.
system
(
'%s/bin/zopectl start'
%
self
.
instance_home
)
sleep
(
2
)
# ad hoc
def
stopZope
(
self
):
os
.
system
(
'%s/bin/zopectl stop'
%
self
.
instance_home
)
def
runXvfb
(
self
,
xvfb_display
):
pid
=
os
.
spawnlp
(
os
.
P_NOWAIT
,
'Xvfb'
,
'Xvfb'
,
'-fbdir'
,
'%s'
%
self
.
xvfb_fbdir
,
':%s'
%
xvfb_display
)
display
=
os
.
environ
.
get
(
'DISPLAY'
)
if
display
:
auth
=
Popen
([
'xauth'
,
'list'
,
display
],
stdout
=
PIPE
).
communicate
()[
0
]
if
auth
:
(
displayname
,
protocolname
,
hexkey
)
=
auth
.
split
()
Popen
([
'xauth'
,
'add'
,
'localhost/unix:%s'
%
xvfb_display
,
protocolname
,
hexkey
])
print
'Xvfb : %d'
%
pid
print
'Take screenshots using xwud -in %s/Xvfb_screen0'
%
self
.
xvfb_fbdir
return
pid
def
getPrefJs
(
self
,
host
,
port
):
prefs_js
=
"""
// Don't ask if we want to switch default browsers
user_pref("browser.shell.checkDefaultBrowser", false);
// Disable pop-up blocking
user_pref("browser.allowpopups", true);
user_pref("dom.disable_open_during_load", false);
// Configure us as the local proxy
//user_pref("network.proxy.type", 2);
// Disable security warnings
user_pref("security.warn_submit_insecure", false);
user_pref("security.warn_submit_insecure.show_once", false);
user_pref("security.warn_entering_secure", false);
user_pref("security.warn_entering_secure.show_once", false);
user_pref("security.warn_entering_weak", false);
user_pref("security.warn_entering_weak.show_once", false);
user_pref("security.warn_leaving_secure", false);
user_pref("security.warn_leaving_secure.show_once", false);
user_pref("security.warn_viewing_mixed", false);
user_pref("security.warn_viewing_mixed.show_once", false);
// Disable "do you want to remember this password?"
user_pref("signon.rememberSignons", false);
// increase the timeout before warning of unresponsive script
user_pref("dom.max_script_run_time", 120);
// this is required to upload files
user_pref("capability.principal.codebase.p1.granted", "UniversalFileRead");
user_pref("signed.applets.codebase_principal_support", true);
user_pref("capability.principal.codebase.p1.id", "http://%s");
user_pref("capability.principal.codebase.p1.subjectName", "");"""
%
\
'%s:%s'
%
(
host
,
port
)
return
prefs_js
def
prepareFirefox
(
self
,
prefs_js
=
''
):
os
.
system
(
"rm -rf %s"
%
self
.
profile_dir
)
os
.
mkdir
(
self
.
profile_dir
)
pref_file
=
open
(
os
.
path
.
join
(
self
.
profile_dir
,
'prefs.js'
),
'w'
)
pref_file
.
write
(
prefs_js
)
pref_file
.
close
()
def
runFirefox
(
self
,
xvfb_display
):
prefs_js
=
self
.
getPrefJs
(
self
.
host
,
self
.
port
)
self
.
prepareFirefox
(
prefs_js
)
if
self
.
debug
:
try
:
shutil
.
copy2
(
os
.
path
.
expanduser
(
'~/.Xauthority'
),
'%s/.Xauthority'
%
self
.
profile_dir
)
except
IOError
:
pass
else
:
os
.
environ
[
'DISPLAY'
]
=
':%s'
%
xvfb_display
os
.
environ
[
'MOZ_NO_REMOTE'
]
=
'1'
os
.
environ
[
'HOME'
]
=
self
.
profile_dir
os
.
environ
[
'LC_ALL'
]
=
'C'
# check if old zelenium or new zelenium
try
:
urllib2
.
urlopen
(
"%s/portal_tests/core/scripts/selenium-version.js"
%
self
.
portal_url
)
except
urllib2
.
HTTPError
:
# Zelenium 0.8
url_string
=
"%s/portal_tests/?auto=true&__ac_name=%s&__ac_password=%s"
%
(
self
.
portal_url
,
self
.
user
,
self
.
password
)
else
:
# Zelenium 0.8+ or later
url_string
=
"%s/portal_tests/core/TestRunner.html?test=../test_suite_html&auto=on&resultsUrl=%s/portal_tests/postResults&__ac_name=%s&__ac_password=%s"
%
(
self
.
portal_url
,
self
.
portal_url
,
self
.
user
,
self
.
password
)
if
self
.
run_only
:
url_string
=
url_string
.
replace
(
'/portal_tests/'
,
'/portal_tests/%s/'
%
self
.
run_only
,
1
)
pid
=
os
.
spawnlp
(
os
.
P_NOWAIT
,
"firefox"
,
"firefox"
,
"-no-remote"
,
"-profile"
,
self
.
profile_dir
,
url_string
)
os
.
environ
[
'MOZ_NO_REMOTE'
]
=
'0'
print
'firefox : %d'
%
pid
return
pid
def
getStatus
(
self
):
try
:
status
=
self
.
openUrl
(
'%s/portal_tests/TestTool_getResults'
%
(
self
.
portal_url
))
except
urllib2
.
HTTPError
,
e
:
if
e
.
msg
==
"No Content"
:
status
=
""
else
:
raise
return
status
def
setPreference
(
self
):
conversion_server_url
=
os
.
environ
.
get
(
'conversion_server_url'
,
''
)
conversion_server_hostname
=
os
.
environ
.
get
(
'conversion_server_hostname'
,
'localhost'
)
conversion_server_port
=
os
.
environ
.
get
(
'conversion_server_port'
,
'8008'
)
urllib2
.
urlopen
(
'%s/Zuite_setPreference?__ac_name='
'%s&__ac_password=%s&working_copy_list=%s'
'&conversion_server_url=%s'
%
(
self
.
portal_url
,
self
.
user
,
self
.
password
,
bt5_dir_list
,
conversion_server_url
,))
def
unsubscribeFromTimerService
(
self
):
urllib2
.
urlopen
(
'%s/portal_activities/?unsubscribe:method='
'&__ac_name=%s&__ac_password=%s'
%
(
self
.
portal_url
,
self
.
user
,
self
.
password
))
def
setUp
(
self
):
self
.
setPreference
()
self
.
unsubscribeFromTimerService
()
def
getSvnRevision
(
self
):
"""Get svn revision used."""
import
pysvn
return
pysvn
.
Client
().
info
(
os
.
path
.
dirname
(
__file__
)).
revision
.
number
def
sendResult
(
self
):
file_content
=
self
.
openUrl
(
'%s/portal_tests/TestTool_getResults'
%
self
.
portal_url
)
passes_re
=
re
.
compile
(
'<th[^>]*>Tests passed</th>
\
n
\
s*<
t
d[^>]*>([^<]*)'
)
failures_re
=
re
.
compile
(
'<th[^>]*>Tests failed</th>
\
n
\
s*<
t
d[^>]*>([^<]*)'
)
image_re
=
re
.
compile
(
'<img[^>]*?>'
)
error_title_re
=
re
.
compile
(
'(?:error.gif.*?>|title status_failed"><td[^>]*>)([^>]*?)</td></tr>'
,
re
.
S
)
result_re
=
re
.
compile
(
'<div style="padding-top: 10px;">
\
s*<p>
\
s*'
'<img.*?</div>
\
s.*?</di
v
>
\
s*
'
, re.S)
error_result_re = re.compile('
.
*
(
?
:
error
.
gif
|
title
status_failed
).
*
', re.S)
passes = passes_re.search(file_content).group(1)
failures = failures_re.search(file_content).group(1)
error_titles = [re.compile('
\
s
+
').sub('
', x).strip()
for x in error_title_re.findall(file_content)]
revision = self.getSvnRevision()
subject = "%s r%s: Functional Tests, %s Passes, %s Failures"
\
% (self.email_subject, revision, passes, failures)
summary = """
Test Summary
Tests passed: %4s
Tests failed: %4s
Following tests failed:
%s""" % (passes, failures, "
\
n
".join(error_titles))
detail = ''
for e in result_re.findall(file_content):
if error_result_re.match(e):
detail += e
detail = image_re.sub('', detail)
if detail:
detail = '''<html>
<head>
<style type="text/css">tr.status_failed { background-color:red };</style>
</head>
<body>%s</body>
</html>''' % detail
status = (not failures)
if self.send_mail:
sendMail(subject=subject,
body=summary,
status=status,
attachments=[detail],
from_mail='
nobody
@
svn
.
erp5
.
org
',
to_mail=[self.email_to_address],
smtp_host=self.smtp_host)
if self.stdout:
print '
-
' * 79
print subject
print '
-
' * 79
print summary
print '
-
' * 79
print detail
return int(failures)
if __name__ == "__main__":
test_runner = FunctionalTestRunner(instance_home)
test_runner.parseArgs()
test_runner.startZope()
atexit.register(test_runner.stopZope)
test_runner.main()
sys.exit(test_runner.sendResult())
product/ERP5Type/tests/sendMail.py
deleted
100644 → 0
View file @
ae59d7cd
##############################################################################
#
# Copyright (c) 2007 Nexedi SARL and Contributors. All Rights Reserved.
# Kazuhiko <kazuhiko@nexedi.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
"""Send a mail with attachments.
"""
import
smtplib
import
re
from
email.mime.text
import
MIMEText
from
email.mime.multipart
import
MIMEMultipart
from
email.message
import
Message
def
sendMail
(
subject
,
body
,
attachments
=
[],
status
=
False
,
from_mail
=
'nobody@erp5.org'
,
to_mail
=
[
'erp5-report@erp5.org'
],
smtp_host
=
''
):
if
attachments
:
msg
=
MIMEMultipart
()
else
:
msg
=
Message
()
msg
[
'Subject'
]
=
subject
msg
[
'From'
]
=
from_mail
msg
[
'To'
]
=
', '
.
join
(
to_mail
)
msg
[
'X-ERP5-Tests'
]
=
'ERP5'
if
status
:
msg
[
'X-ERP5-Tests-Status'
]
=
'OK'
# Guarantees the message ends in a newline
msg
.
preamble
=
subject
msg
.
epilogue
=
''
if
attachments
:
mime_text
=
MIMEText
(
body
)
mime_text
.
add_header
(
'Content-Disposition'
,
'attachment'
,
filename
=
'body'
)
msg
.
attach
(
mime_text
)
html_re
=
re
.
compile
(
'<html>'
,
re
.
I
)
for
item
in
attachments
:
mime_text
=
MIMEText
(
item
)
if
html_re
.
match
(
item
):
mime_text
.
set_type
(
'text/html'
)
mime_text
.
add_header
(
'Content-Disposition'
,
'attachment'
,
filename
=
'attachment.html'
)
else
:
mime_text
.
add_header
(
'Content-Disposition'
,
'attachment'
,
filename
=
'attachment.txt'
)
msg
.
attach
(
mime_text
)
else
:
msg
.
set_payload
(
body
)
# Send the email via SMTP server.
if
smtp_host
:
s
=
smtplib
.
SMTP
(
smtp_host
)
else
:
s
=
smtplib
.
SMTP
()
s
.
connect
()
s
.
sendmail
(
from_mail
,
to_mail
,
msg
.
as_string
())
s
.
close
()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment