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
Carlos Ramos Carreño
erp5
Commits
e43da477
Commit
e43da477
authored
Mar 28, 2023
by
Lu Xu
👀
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
erp5_test_result: rework slapos agent distributor
parent
83dbd0d3
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
538 additions
and
232 deletions
+538
-232
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ProjectUnitTestDistributor.py
...omponents/document.erp5.ERP5ProjectUnitTestDistributor.py
+6
-4
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ScalabilityDistributor.py
...al_components/document.erp5.ERP5ScalabilityDistributor.py
+1
-1
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.py
...portal_components/document.erp5.SlapOSAgentDistributor.py
+91
-15
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.xml
...ortal_components/document.erp5.SlapOSAgentDistributor.xml
+3
-1
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
...eets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
+34
-0
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
..._sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
+38
-0
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/software_type_property.xml
.../SlapOSSoftwareReleaseUnitTest/software_type_property.xml
+38
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
...s/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
+3
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_filter_kw.xml
...esult/SlapOSSoftwareReleaseUnitTest_view/my_filter_kw.xml
+54
-61
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
...t_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
+184
-0
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_software_type.xml
...t/SlapOSSoftwareReleaseUnitTest_view/my_software_type.xml
+3
-26
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
...lt/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
+1
-1
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_view/my_duration.xml
...kins/erp5_test_result/TestResultLine_view/my_duration.xml
+14
-53
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_statTestResultLineList.py
...ins/erp5_test_result/TestResult_statTestResultLineList.py
+1
-2
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_view.xml
...ateItem/portal_skins/erp5_test_result/TestResult_view.xml
+0
-2
bt5/erp5_test_result/TestTemplateItem/portal_components/test.erp5.testTaskDistribution.py
...eItem/portal_components/test.erp5.testTaskDistribution.py
+63
-63
bt5/erp5_test_result/ToolComponentTemplateItem/portal_components/tool.erp5.TaskDistributionTool.py
...eItem/portal_components/tool.erp5.TaskDistributionTool.py
+3
-2
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_result_workflow/script_TestResult_fail.py
...l_workflow/test_result_workflow/script_TestResult_fail.py
+1
-1
No files found.
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ProjectUnitTestDistributor.py
View file @
e43da477
...
@@ -28,7 +28,7 @@ from Products.ERP5Type.XMLObject import XMLObject
...
@@ -28,7 +28,7 @@ from Products.ERP5Type.XMLObject import XMLObject
from
DateTime
import
DateTime
from
DateTime
import
DateTime
import
json
import
json
import
random
import
random
from
zLOG
import
LOG
,
DEBUG
,
ERROR
from
zLOG
import
LOG
,
DEBUG
,
ERROR
,
INFO
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type
import
Permissions
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
...
@@ -271,7 +271,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
...
@@ -271,7 +271,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
if
test_node
.
getValidationState
()
!=
'validated'
:
if
test_node
.
getValidationState
()
!=
'validated'
:
try
:
try
:
test_node
.
validate
()
test_node
.
validate
()
except
Exception
as
e
:
except
Exception
,
e
:
LOG
(
'Test Node Validate'
,
ERROR
,
'%s'
%
e
)
LOG
(
'Test Node Validate'
,
ERROR
,
'%s'
%
e
)
if
test_node
is
None
:
if
test_node
is
None
:
test_node
=
test_node_module
.
newContent
(
portal_type
=
"Test Node"
,
title
=
title
,
computer_guid
=
computer_guid
,
test_node
=
test_node_module
.
newContent
(
portal_type
=
"Test Node"
,
title
=
title
,
computer_guid
=
computer_guid
,
...
@@ -384,7 +384,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
...
@@ -384,7 +384,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
for
x
in
to_delete_key_list
:
for
x
in
to_delete_key_list
:
config
.
pop
(
x
)
config
.
pop
(
x
)
config_list
.
append
(
config
)
config_list
.
append
(
config
)
LOG
(
'ERP5ProjectUnitTestDistributor.startTestSuite, config_list'
,
DEBUG
,
config_list
)
LOG
(
'ERP5ProjectUnitTestDistributor.startTestSuite, config_list'
,
INFO
,
config_list
)
if
batch_mode
:
if
batch_mode
:
return
config_list
return
config_list
return
json
.
dumps
(
config_list
)
return
json
.
dumps
(
config_list
)
...
@@ -395,12 +395,13 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
...
@@ -395,12 +395,13 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
"""
"""
Here this is only a proxy to the task distribution tool
Here this is only a proxy to the task distribution tool
"""
"""
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult'
,
DEBUG
,
(
node_title
,
test_title
))
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult'
,
INFO
,
(
node_title
,
test_title
))
portal
=
self
.
getPortalObject
()
portal
=
self
.
getPortalObject
()
if
node_title
:
if
node_title
:
test_node
=
self
.
_getTestNodeFromTitle
(
node_title
)
test_node
=
self
.
_getTestNodeFromTitle
(
node_title
)
test_node
.
setPingDate
()
test_node
.
setPingDate
()
test_suite
=
self
.
_getTestSuiteFromTitle
(
test_title
)
test_suite
=
self
.
_getTestSuiteFromTitle
(
test_title
)
LOG
(
'ERP5ProjectUnitTestDistributor.createTestResult 2'
,
INFO
,
(
test_suite
))
if
test_suite
is
not
None
:
if
test_suite
is
not
None
:
if
not
allow_restart
and
test_suite
.
isEnabled
():
if
not
allow_restart
and
test_suite
.
isEnabled
():
# in case if allow_restart is not enforced by client and test_node
# in case if allow_restart is not enforced by client and test_node
...
@@ -430,6 +431,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
...
@@ -430,6 +431,7 @@ class ERP5ProjectUnitTestDistributor(XMLObject):
return
test_node
return
test_node
def
_getTestSuiteFromTitle
(
self
,
suite_title
):
def
_getTestSuiteFromTitle
(
self
,
suite_title
):
LOG
(
'ERP5ProjectUnitTestDistributor._getTestSuiteFromTitle'
,
INFO
,
(
suite_title
,
self
.
_getTestSuiteModule
()))
test_suite_list
=
self
.
_getTestSuiteModule
().
searchFolder
(
test_suite_list
=
self
.
_getTestSuiteModule
().
searchFolder
(
portal_type
=
'Test Suite'
,
portal_type
=
'Test Suite'
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
suite_title
),
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
suite_title
),
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.ERP5ScalabilityDistributor.py
View file @
e43da477
...
@@ -128,7 +128,7 @@ class ERP5ScalabilityDistributor(ERP5ProjectUnitTestDistributor, object):
...
@@ -128,7 +128,7 @@ class ERP5ScalabilityDistributor(ERP5ProjectUnitTestDistributor, object):
if
test_node
.
getValidationState
()
!=
'validated'
:
if
test_node
.
getValidationState
()
!=
'validated'
:
try
:
try
:
test_node
.
validate
()
test_node
.
validate
()
except
Exception
as
e
:
except
Exception
,
e
:
LOG
(
'Test Node Validate'
,
ERROR
,
'%s'
%
e
)
LOG
(
'Test Node Validate'
,
ERROR
,
'%s'
%
e
)
return
test_node
return
test_node
return
None
return
None
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.py
View file @
e43da477
...
@@ -26,7 +26,9 @@
...
@@ -26,7 +26,9 @@
##############################################################################
##############################################################################
from
erp5.component.document.ERP5ProjectUnitTestDistributor
import
ERP5ProjectUnitTestDistributor
from
erp5.component.document.ERP5ProjectUnitTestDistributor
import
ERP5ProjectUnitTestDistributor
from
DateTime
import
DateTime
from
zLOG
import
LOG
,
DEBUG
,
ERROR
,
INFO
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
from
AccessControl
import
ClassSecurityInfo
from
AccessControl
import
ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type
import
Permissions
import
json
import
json
...
@@ -65,41 +67,115 @@ class SlapOSAgentDistributor(ERP5ProjectUnitTestDistributor):
...
@@ -65,41 +67,115 @@ class SlapOSAgentDistributor(ERP5ProjectUnitTestDistributor):
"""
"""
return
'SlapOSAgentTest'
return
'SlapOSAgentTest'
security
.
declarePublic
(
"createTestResult"
)
def
createTestResult
(
self
,
name
,
revision
,
test_name_list
,
allow_restart
,
test_title
=
None
,
node_title
=
None
,
project_title
=
None
):
"""
Here this is only a proxy to the task distribution tool
"""
LOG
(
'SlapOSAgentDistributor.createTestResult'
,
INFO
,
(
node_title
,
test_title
,
revision
))
portal
=
self
.
getPortalObject
()
if
node_title
:
test_node
=
self
.
_getTestNodeFromTitle
(
node_title
)
test_node
.
setPingDate
()
test_suite
=
self
.
_getTestSuiteFromTitle
(
test_title
)
LOG
(
'SlapOSAgentDistributor.createTestResult 2'
,
INFO
,
(
test_suite
))
if
test_suite
is
not
None
:
if
not
allow_restart
and
test_suite
.
isEnabled
():
# in case if allow_restart is not enforced by client and test_node
# periodicity is enabled control the restartability based on test_suite
# periodicity
current_date
=
DateTime
()
alarm_date
=
test_suite
.
getAlarmDate
()
if
alarm_date
is
None
or
alarm_date
<=
current_date
:
allow_restart
=
True
test_suite
.
setAlarmDate
(
test_suite
.
getNextPeriodicalDate
(
current_date
,
alarm_date
))
#test_suite.setPingDate()
return
portal
.
portal_task_distribution
.
createTestResult
(
name
,
revision
,
test_name_list
,
allow_restart
,
test_title
=
test_title
,
node_title
=
node_title
,
project_title
=
project_title
)
def
_getTestNodeFromTitle
(
self
,
node_title
):
test_node_list
=
self
.
_getTestNodeModule
().
searchFolder
(
portal_type
=
"Test Node"
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
node_title
),
limit
=
2
)
assert
len
(
test_node_list
)
==
1
,
"We found %i test nodes for %s"
%
(
len
(
test_node_list
),
node_title
)
test_node
=
test_node_list
[
0
].
getObject
()
return
test_node
def
_getTestSuiteFromTitle
(
self
,
suite_title
):
LOG
(
'SlapOSAgentDistributor._getTestSuiteFromTitle'
,
INFO
,
(
suite_title
,
self
.
_getTestSuiteModule
()))
test_suite_list
=
self
.
_getTestSuiteModule
().
searchFolder
(
portal_type
=
'SlapOS Agent Test Suite'
,
title
=
SimpleQuery
(
comparison_operator
=
'='
,
title
=
suite_title
),
validation_state
=
'validated'
,
limit
=
2
)
assert
len
(
test_suite_list
)
<=
1
,
"We found %i test suite for %s"
%
(
len
(
test_suite_list
),
suite_title
)
test_suite
=
None
if
len
(
test_suite_list
):
test_suite
=
test_suite_list
[
0
].
getObject
()
return
test_suite
security
.
declarePublic
(
"generateConfiguration"
)
security
.
declarePublic
(
"generateConfiguration"
)
def
generateConfiguration
(
self
,
test_suite_title
,
batch_mode
=
0
):
def
generateConfiguration
(
self
,
test_suite_title
,
batch_mode
=
0
):
"""
"""
generateConfiguration :
this is just a proxy to an external method
generateConfiguration :
not used for slapos agent
"""
"""
test_suite_module
=
self
.
_getTestSuiteModule
(
)
return
json
.
dumps
({
"configuration_list"
:
[{}]}
)
security
.
declarePublic
(
"getServiceList"
)
def
getServiceList
(
self
,
test_suite_title
):
"""
getServiceList : return a dict containing the list of services to request to slapos master before running the test
"""
LOG
(
'[SlapOSAgentDistributor] getServiceList'
,
INFO
,
test_suite_title
)
test_suite_module
=
self
.
_getTestSuiteModule
()
test_suite_list
=
test_suite_module
.
searchFolder
(
test_suite_list
=
test_suite_module
.
searchFolder
(
title
=
test_suite_title
,
title
=
test_suite_title
,
validation_state
=
"validated"
,
validation_state
=
"validated"
,
specialise_uid
=
self
.
getUid
())
specialise_uid
=
self
.
getUid
())
service_list
=
{}
if
len
(
test_suite_list
)
==
0
:
if
len
(
test_suite_list
)
==
0
:
return
json
.
dumps
({})
error_message
=
'Error getting test suite information. Bad test suite title? '
LOG
(
'[SlapOSAgentDistributor] getServiceList'
,
ERROR
,
error_message
)
return
json
.
dumps
({
'error_message'
:
error_message
})
generated_configuration
=
{}
for
unit_test
in
test_suite_list
[
0
].
searchFolder
(
for
unit_test
in
test_suite_list
[
0
].
searchFolder
(
portal_type
=
"SlapOS Software Release Unit Test"
):
portal_type
=
"SlapOS Software Release Unit Test"
):
generated_configuration
[
unit_test
.
getTitle
()]
=
{
LOG
(
'[SlapOSAgentDistributor] getServiceList, unit_test: '
,
INFO
,
unit_test
.
getTitle
())
service_list
[
unit_test
.
getTitle
()]
=
{
"title"
:
unit_test
.
getTitle
(),
"title"
:
unit_test
.
getTitle
(),
"url"
:
unit_test
.
getUrlString
(),
"url"
:
unit_test
.
getUrlString
(),
"group"
:
unit_test
.
getGroupReference
(
"default"
)}
"group"
:
unit_test
.
getGroupReference
(
"default"
),
"shared"
:
unit_test
.
getShared
(),
if
unit_test
.
getTextContent
()
is
not
None
:
"software_type"
:
unit_test
.
getSoftwareType
(),
generated_configuration
[
unit_test
.
getTitle
()][
'request_kw'
]
=
unit_test
.
getTextContent
()
"partition_parameter_kw"
:
unit_test
.
getTextContent
(),
"filter_kw"
:
unit_test
.
getFilterKw
()
}
if
unit_test
.
getSupplyComputer
()
is
not
None
:
if
unit_test
.
getSupplyComputer
()
is
not
None
:
generated_configuration
[
unit_test
.
getTitle
()][
'supply_computer'
]
=
unit_test
.
getSupplyComputer
()
service_list
[
unit_test
.
getTitle
()][
'supply_computer'
]
=
unit_test
.
getSupplyComputer
()
return
json
.
dumps
(
generated_configuration
)
LOG
(
'[SlapOSAgentDistributor] getServiceList, final service_list: '
,
INFO
,
service_list
)
return
json
.
dumps
(
service_list
)
def
_getSortedNodeTestSuiteToRun
(
self
,
test_node
):
"""
Returned ordered list of test suites of a test node.
For now do nothing
"""
test_suite_list
=
test_node
.
getAggregateValueList
()
return
test_suite_list
...
...
bt5/erp5_test_result/DocumentTemplateItem/portal_components/document.erp5.SlapOSAgentDistributor.xml
View file @
e43da477
...
@@ -39,7 +39,9 @@
...
@@ -39,7 +39,9 @@
<item>
<item>
<key>
<string>
text_content_warning_message
</string>
</key>
<key>
<string>
text_content_warning_message
</string>
</key>
<value>
<value>
<tuple/>
<tuple>
<string>
W: 30, 0: Unused DEBUG imported from zLOG (unused-import)
</string>
</tuple>
</value>
</value>
</item>
</item>
<item>
<item>
...
...
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/filter_kw_property.xml
0 → 100644
View file @
e43da477
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Standard Property"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
elementary_type/text
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<none/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
filter_kw_property
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Standard Property
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/shared_property.xml
0 → 100644
View file @
e43da477
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Standard Property"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
elementary_type/boolean
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
Is it shared instance
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
shared_property
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Standard Property
</string>
</value>
</item>
<item>
<key>
<string>
property_default
</string>
</key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/PropertySheetTemplateItem/portal_property_sheets/SlapOSSoftwareReleaseUnitTest/software_type_property.xml
0 → 100644
View file @
e43da477
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Standard Property"
module=
"erp5.portal_type"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
categories
</string>
</key>
<value>
<tuple>
<string>
elementary_type/text
</string>
</tuple>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string>
software_type used for the service
</string>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
software_type_property
</string>
</value>
</item>
<item>
<key>
<string>
portal_type
</string>
</key>
<value>
<string>
Standard Property
</string>
</value>
</item>
<item>
<key>
<string>
property_default
</string>
</key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view.xml
View file @
e43da477
...
@@ -104,6 +104,9 @@
...
@@ -104,6 +104,9 @@
<string>
my_url_string
</string>
<string>
my_url_string
</string>
<string>
my_supply_computer
</string>
<string>
my_supply_computer
</string>
<string>
my_group_reference
</string>
<string>
my_group_reference
</string>
<string>
my_software_type
</string>
<string>
my_shared
</string>
<string>
my_filter_kw
</string>
</list>
</list>
</value>
</value>
</item>
</item>
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
TestResult_view/your_real_duration
.xml
→
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
SlapOSSoftwareReleaseUnitTest_view/my_filter_kw
.xml
View file @
e43da477
...
@@ -2,13 +2,13 @@
...
@@ -2,13 +2,13 @@
<ZopeData>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<pickle>
<global
name=
"
String
Field"
module=
"Products.Formulator.StandardFields"
/>
<global
name=
"
TextArea
Field"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
</pickle>
<pickle>
<pickle>
<dictionary>
<dictionary>
<item>
<item>
<key>
<string>
id
</string>
</key>
<key>
<string>
id
</string>
</key>
<value>
<string>
your_real_duration
</string>
</value>
<value>
<string>
my_filter_kw
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
message_values
</string>
</key>
<key>
<string>
message_values
</string>
</key>
...
@@ -18,13 +18,21 @@
...
@@ -18,13 +18,21 @@
<key>
<string>
external_validator_failed
</string>
</key>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
</item>
<item>
<key>
<string>
line_too_long
</string>
</key>
<value>
<string>
A line was too long.
</string>
</value>
</item>
<item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Input is required but no input given.
</string>
</value>
<value>
<string>
Input is required but no input given.
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
too_long
</string>
</key>
<key>
<string>
too_long
</string>
</key>
<value>
<string>
Too much input was given.
</string>
</value>
<value>
<string>
You entered too many characters.
</string>
</value>
</item>
<item>
<key>
<string>
too_many_lines
</string>
</key>
<value>
<string>
You entered too many lines.
</string>
</value>
</item>
</item>
</dictionary>
</dictionary>
</value>
</value>
...
@@ -50,39 +58,39 @@
...
@@ -50,39 +58,39 @@
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
display_width
</string>
</key>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
e
ditable
</string>
</key>
<key>
<string>
e
xternal_validator
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
e
nabled
</string>
</key>
<key>
<string>
e
xtra
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
external_validator
</string>
</key>
<key>
<string>
height
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
extra
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
hidden
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_type
</string>
</key>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
...
@@ -94,15 +102,15 @@
...
@@ -94,15 +102,15 @@
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
truncat
e
</string>
</key>
<key>
<string>
unicod
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
unicod
e
</string>
</key>
<key>
<string>
whitespace_preserv
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
w
hitespace_preserve
</string>
</key>
<key>
<string>
w
idth
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
</dictionary>
</dictionary>
...
@@ -122,48 +130,46 @@
...
@@ -122,48 +130,46 @@
</item>
</item>
<item>
<item>
<key>
<string>
default
</string>
</key>
<key>
<string>
default
</string>
</key>
<value>
<value>
<string></string>
</value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
description
</string>
</key>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
display_width
</string>
</key>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
e
ditable
</string>
</key>
<key>
<string>
e
xternal_validator
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
e
nabled
</string>
</key>
<key>
<string>
e
xtra
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
external_validator
</string>
</key>
<key>
<string>
height
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
extra
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
hidden
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_type
</string>
</key>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
...
@@ -175,15 +181,15 @@
...
@@ -175,15 +181,15 @@
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
truncat
e
</string>
</key>
<key>
<string>
unicod
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
unicod
e
</string>
</key>
<key>
<string>
whitespace_preserv
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
w
hitespace_preserve
</string>
</key>
<key>
<string>
w
idth
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
</dictionary>
</dictionary>
...
@@ -207,19 +213,11 @@
...
@@ -207,19 +213,11 @@
</item>
</item>
<item>
<item>
<key>
<string>
description
</string>
</key>
<key>
<string>
description
</string>
</key>
<value>
<string>
Difference between end date and start date
</string>
</value>
</item>
<item>
<key>
<string>
display_maxwidth
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
display_width
</string>
</key>
<value>
<int>
20
</int>
</value>
</item>
<item>
<item>
<key>
<string>
editable
</string>
</key>
<key>
<string>
editable
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
1
</int>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
enabled
</string>
</key>
<key>
<string>
enabled
</string>
</key>
...
@@ -233,16 +231,24 @@
...
@@ -233,16 +231,24 @@
<key>
<string>
extra
</string>
</key>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
height
</string>
</key>
<value>
<int>
5
</int>
</value>
</item>
<item>
<item>
<key>
<string>
hidden
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
0
</int>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_type
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string>
text
</string>
</value>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
max_linelength
</string>
</key>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_l
ength
</string>
</key>
<key>
<string>
max_l
ines
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
...
@@ -251,11 +257,7 @@
...
@@ -251,11 +257,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
<value>
<string>
filter_kw (json format)
</string>
</value>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
unicode
</string>
</key>
<key>
<string>
unicode
</string>
</key>
...
@@ -263,7 +265,11 @@
...
@@ -263,7 +265,11 @@
</item>
</item>
<item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
width
</string>
</key>
<value>
<int>
40
</int>
</value>
</item>
</item>
</dictionary>
</dictionary>
</value>
</value>
...
@@ -271,17 +277,4 @@
...
@@ -271,17 +277,4 @@
</dictionary>
</dictionary>
</pickle>
</pickle>
</record>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: context.getStopDate().asdatetime() - context.getStartDate().asdatetime() if context.hasStopDate() else \'\'
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_shared.xml
0 → 100644
View file @
e43da477
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"CheckBoxField"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
my_shared
</string>
</value>
</item>
<item>
<key>
<string>
message_values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
external_validator_failed
</string>
</key>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
This field is mandatory.
</string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
overrides
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
tales
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key>
<string>
values
</string>
</key>
<value>
<dictionary>
<item>
<key>
<string>
alternate_name
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
css_class
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
default
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
description
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
editable
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
enabled
</string>
</key>
<value>
<int>
1
</int>
</value>
</item>
<item>
<key>
<string>
external_validator
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
extra
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
hidden
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
required
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string>
Shared
</string>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
TestResult_view/listbox_duration
.xml
→
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/
SlapOSSoftwareReleaseUnitTest_view/my_software_type
.xml
View file @
e43da477
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
<dictionary>
<dictionary>
<item>
<item>
<key>
<string>
id
</string>
</key>
<key>
<string>
id
</string>
</key>
<value>
<string>
listbox_duration
</string>
</value>
<value>
<string>
my_software_type
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
message_values
</string>
</key>
<key>
<string>
message_values
</string>
</key>
...
@@ -77,10 +77,6 @@
...
@@ -77,10 +77,6 @@
<key>
<string>
hidden
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
...
@@ -122,9 +118,7 @@
...
@@ -122,9 +118,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
default
</string>
</key>
<key>
<string>
default
</string>
</key>
<value>
<value>
<string></string>
</value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
description
</string>
</key>
<key>
<string>
description
</string>
</key>
...
@@ -158,10 +152,6 @@
...
@@ -158,10 +152,6 @@
<key>
<string>
hidden
</string>
</key>
<key>
<string>
hidden
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
input_type
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
max_length
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
...
@@ -251,7 +241,7 @@
...
@@ -251,7 +241,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
<value>
<string>
Software Type
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
truncate
</string>
</key>
<key>
<string>
truncate
</string>
</key>
...
@@ -271,17 +261,4 @@
...
@@ -271,17 +261,4 @@
</dictionary>
</dictionary>
</pickle>
</pickle>
</record>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: modules[\'datetime\'].timedelta(seconds=cell.getProperty(\'duration\'))
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/SlapOSSoftwareReleaseUnitTest_view/my_text_content.xml
View file @
e43da477
...
@@ -257,7 +257,7 @@
...
@@ -257,7 +257,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string>
Request KW
(json format)
</string>
</value>
<value>
<string>
partition_parameter_kw
(json format)
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
unicode
</string>
</key>
<key>
<string>
unicode
</string>
</key>
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResultLine_view/my_duration.xml
View file @
e43da477
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
<ZopeData>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<pickle>
<global
name=
"
String
Field"
module=
"Products.Formulator.StandardFields"
/>
<global
name=
"
Float
Field"
module=
"Products.Formulator.StandardFields"
/>
</pickle>
</pickle>
<pickle>
<pickle>
<dictionary>
<dictionary>
...
@@ -19,12 +19,12 @@
...
@@ -19,12 +19,12 @@
<value>
<string>
The input failed the external validator.
</string>
</value>
<value>
<string>
The input failed the external validator.
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
required_not_found
</string>
</key>
<key>
<string>
not_float
</string>
</key>
<value>
<string>
Input is required but no input given
.
</string>
</value>
<value>
<string>
You did not enter a floating point number
.
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
too_long
</string>
</key>
<key>
<string>
required_not_found
</string>
</key>
<value>
<string>
Too much input was
given.
</string>
</value>
<value>
<string>
Input is required but no input
given.
</string>
</value>
</item>
</item>
</dictionary>
</dictionary>
</value>
</value>
...
@@ -78,11 +78,11 @@
...
@@ -78,11 +78,11 @@
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
precision
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
...
@@ -93,14 +93,6 @@
...
@@ -93,14 +93,6 @@
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
...
@@ -122,9 +114,7 @@
...
@@ -122,9 +114,7 @@
</item>
</item>
<item>
<item>
<key>
<string>
default
</string>
</key>
<key>
<string>
default
</string>
</key>
<value>
<value>
<string></string>
</value>
<persistent>
<string
encoding=
"base64"
>
AAAAAAAAAAI=
</string>
</persistent>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
description
</string>
</key>
<key>
<string>
description
</string>
</key>
...
@@ -159,11 +149,11 @@
...
@@ -159,11 +149,11 @@
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
precision
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<item>
...
@@ -174,14 +164,6 @@
...
@@ -174,14 +164,6 @@
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
</item>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<string></string>
</value>
<value>
<string></string>
</value>
...
@@ -238,12 +220,12 @@
...
@@ -238,12 +220,12 @@
<value>
<int>
0
</int>
</value>
<value>
<int>
0
</int>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
input_
typ
e
</string>
</key>
<key>
<string>
input_
styl
e
</string>
</key>
<value>
<string>
text
</string>
</value>
<value>
<string>
-1 234.5
</string>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
max_length
</string>
</key>
<key>
<string>
precision
</string>
</key>
<value>
<
string></string
>
</value>
<value>
<
int>
3
</int
>
</value>
</item>
</item>
<item>
<item>
<key>
<string>
required
</string>
</key>
<key>
<string>
required
</string>
</key>
...
@@ -253,14 +235,6 @@
...
@@ -253,14 +235,6 @@
<key>
<string>
title
</string>
</key>
<key>
<string>
title
</string>
</key>
<value>
<string>
Duration
</string>
</value>
<value>
<string>
Duration
</string>
</value>
</item>
</item>
<item>
<key>
<string>
truncate
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<key>
<string>
unicode
</string>
</key>
<value>
<int>
0
</int>
</value>
</item>
<item>
<item>
<key>
<string>
whitespace_preserve
</string>
</key>
<key>
<string>
whitespace_preserve
</string>
</key>
<value>
<int>
0
</int>
</value>
<value>
<int>
0
</int>
</value>
...
@@ -271,17 +245,4 @@
...
@@ -271,17 +245,4 @@
</dictionary>
</dictionary>
</pickle>
</pickle>
</record>
</record>
<record
id=
"2"
aka=
"AAAAAAAAAAI="
>
<pickle>
<global
name=
"TALESMethod"
module=
"Products.Formulator.TALESField"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_text
</string>
</key>
<value>
<string>
python: modules[\'datetime\'].timedelta(seconds=context.getProperty(\'duration\'))
</string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
</ZopeData>
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_statTestResultLineList.py
View file @
e43da477
import
datetime
from
Products.PythonScripts.standard
import
Object
from
Products.PythonScripts.standard
import
Object
return
[
Object
(
duration
=
datetime
.
timedelta
(
seconds
=
context
.
getProperty
(
'duration'
,
0
)),
return
[
Object
(
duration
=
int
(
context
.
getProperty
(
'duration'
,
0
)),
all_tests
=
context
.
getProperty
(
'all_tests'
),
all_tests
=
context
.
getProperty
(
'all_tests'
),
errors
=
context
.
getProperty
(
'errors'
),
errors
=
context
.
getProperty
(
'errors'
),
failures
=
context
.
getProperty
(
'failures'
),
failures
=
context
.
getProperty
(
'failures'
),
...
...
bt5/erp5_test_result/SkinTemplateItem/portal_skins/erp5_test_result/TestResult_view.xml
View file @
e43da477
...
@@ -87,7 +87,6 @@
...
@@ -87,7 +87,6 @@
<list>
<list>
<string>
listbox_string_index
</string>
<string>
listbox_string_index
</string>
<string>
listbox_start_date
</string>
<string>
listbox_start_date
</string>
<string>
listbox_duration
</string>
</list>
</list>
</value>
</value>
</item>
</item>
...
@@ -100,7 +99,6 @@
...
@@ -100,7 +99,6 @@
<string>
my_id
</string>
<string>
my_id
</string>
<string>
my_start_date
</string>
<string>
my_start_date
</string>
<string>
my_stop_date
</string>
<string>
my_stop_date
</string>
<string>
your_real_duration
</string>
</list>
</list>
</value>
</value>
</item>
</item>
...
...
bt5/erp5_test_result/TestTemplateItem/portal_components/test.erp5.testTaskDistribution.py
View file @
e43da477
from
Products.ERP5Type.Core.Workflow
import
ValidationFailed
from
Products.ERP5Type.Core.Workflow
import
ValidationFailed
from
Products.ERP5Type.tests.ERP5TypeTestCase
import
ERP5TypeTestCase
from
Products.ERP5Type.tests.ERP5TypeTestCase
import
ERP5TypeTestCase
import
json
import
json
from
time
import
sleep
from
time
import
sleep
from
DateTime
import
DateTime
from
DateTime
import
DateTime
import
responses
import
responses
...
@@ -75,7 +75,7 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
...
@@ -75,7 +75,7 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
original_class
=
self
.
distributor
.
__class__
original_class
=
self
.
distributor
.
__class__
original_scalability_class
=
self
.
scalability_distributor
.
__class__
original_scalability_class
=
self
.
scalability_distributor
.
__class__
original_performance_class
=
self
.
performance_distributor
.
__class__
original_performance_class
=
self
.
performance_distributor
.
__class__
original_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
original_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
original_class
.
_getTestSuiteModule
=
self
.
_original_getTestSuiteModule
original_class
.
_getTestSuiteModule
=
self
.
_original_getTestSuiteModule
original_scalability_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
original_scalability_class
.
_getTestNodeModule
=
self
.
_original_getTestNodeModule
...
@@ -164,9 +164,9 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
...
@@ -164,9 +164,9 @@ class TaskDistributionTestCase(ERP5TypeTestCase):
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"started"
)
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"started"
)
self
.
tic
()
self
.
tic
()
if
stop_count
==
2
:
if
stop_count
==
2
:
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"stopped"
)
self
.
assertEqual
s
(
test_result
.
getSimulationState
(),
"stopped"
)
else
:
else
:
self
.
assertEqual
(
test_result
.
getSimulationState
(),
"started"
)
self
.
assertEqual
s
(
test_result
.
getSimulationState
(),
"started"
)
def
_cleanupTestResult
(
self
):
def
_cleanupTestResult
(
self
):
self
.
tic
()
self
.
tic
()
...
@@ -209,16 +209,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -209,16 +209,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
def
test_02_createTestSuite
(
self
):
def
test_02_createTestSuite
(
self
):
# Test Test Suite
# Test Test Suite
test_suite
=
self
.
_createTestSuite
()[
0
]
test_suite
=
self
.
_createTestSuite
()[
0
]
self
.
assertEqual
(
test_suite
.
getPortalType
(),
"Test Suite"
)
self
.
assertEqual
s
(
test_suite
.
getPortalType
(),
"Test Suite"
)
self
.
assertEqual
(
test_suite
.
getSpecialise
(),
self
.
distributor
.
getRelativeUrl
())
self
.
assertEqual
s
(
test_suite
.
getSpecialise
(),
self
.
distributor
.
getRelativeUrl
())
# Test Scalability Test Suite
# Test Scalability Test Suite
scalability_test_suite
=
self
.
_createTestSuite
(
scalability_test_suite
=
self
.
_createTestSuite
(
portal_type
=
"Scalability Test Suite"
,
portal_type
=
"Scalability Test Suite"
,
specialise_value
=
self
.
scalability_distributor
specialise_value
=
self
.
scalability_distributor
)[
0
]
)[
0
]
self
.
assertEqual
(
scalability_test_suite
.
getPortalType
(),
self
.
assertEqual
s
(
scalability_test_suite
.
getPortalType
(),
"Scalability Test Suite"
)
"Scalability Test Suite"
)
self
.
assertEqual
(
scalability_test_suite
.
getSpecialise
(),
self
.
assertEqual
s
(
scalability_test_suite
.
getSpecialise
(),
self
.
scalability_distributor
.
getRelativeUrl
())
self
.
scalability_distributor
.
getRelativeUrl
())
def
test_02b_checkConsistencyOnTestSuite
(
self
):
def
test_02b_checkConsistencyOnTestSuite
(
self
):
...
@@ -338,7 +338,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -338,7 +338,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
title
=
"COMP42-Node1"
))
title
=
"COMP42-Node1"
))
return
[
"%s"
%
x
[
"test_suite_title"
]
for
x
in
config_list
]
return
[
"%s"
%
x
[
"test_suite_title"
]
for
x
in
config_list
]
# By default we have random order between test suites
# By default we have random order between test suites
self
.
assertEqual
(
set
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
]),
self
.
assertEqual
s
(
set
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
]),
set
(
getTestSuiteList
()))
set
(
getTestSuiteList
()))
# Check that if test suite 1 and test suite 2 are recently processed,
# Check that if test suite 1 and test suite 2 are recently processed,
...
@@ -349,19 +349,19 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -349,19 +349,19 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
processTest
(
"test suite 2"
,
"r0=b"
)
self
.
processTest
(
"test suite 2"
,
"r0=b"
)
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 3"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 3"
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
)
# after test suite 3, we now have to process test suite 1
# after test suite 3, we now have to process test suite 1
# since it is the oldest one
# since it is the oldest one
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 1"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 1"
)
self
.
processTest
(
"test suite 1"
,
"r0=c"
)
self
.
processTest
(
"test suite 1"
,
"r0=c"
)
# after test suite 1, we now have to process test suite 2
# after test suite 1, we now have to process test suite 2
# since it is the oldest one
# since it is the oldest one
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
self
.
assertEqual
(
getTestSuiteList
()[
0
],
"test suite 2"
)
self
.
assertEqual
s
(
getTestSuiteList
()[
0
],
"test suite 2"
)
self
.
processTest
(
"test suite 2"
,
"r0=d"
)
self
.
processTest
(
"test suite 2"
,
"r0=d"
)
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
...
@@ -370,20 +370,20 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -370,20 +370,20 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
# we should then have by order 3, 2, 1
# we should then have by order 3, 2, 1
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
,
"test suite 1"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
,
"test suite 1"
],
getTestSuiteList
())
getTestSuiteList
())
# now launch all test of test 3, even if they are not finished yet
# now launch all test of test 3, even if they are not finished yet
self
.
processTest
(
"test suite 3"
,
"r0=f"
,
stop_count
=
1
)
self
.
processTest
(
"test suite 3"
,
"r0=f"
,
stop_count
=
1
)
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
self
.
assertEqual
([
"test suite 2"
,
"test suite 1"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 1"
,
"test suite 3"
],
getTestSuiteList
())
getTestSuiteList
())
# now launch partially tests of suite 2, it must have priority over
# now launch partially tests of suite 2, it must have priority over
# test 3, even if test 3 is older because all tests of test 3 are ongoing
# test 3, even if test 3 is older because all tests of test 3 are ongoing
self
.
processTest
(
"test suite 2"
,
"r0=g"
,
start_count
=
1
,
stop_count
=
0
)
self
.
processTest
(
"test suite 2"
,
"r0=g"
,
start_count
=
1
,
stop_count
=
0
)
self
.
tic
()
self
.
tic
()
sleep
(
1
)
sleep
(
1
)
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
())
getTestSuiteList
())
def
test_04c_startTestSuiteOrderWithManyTestNodes
(
self
):
def
test_04c_startTestSuiteOrderWithManyTestNodes
(
self
):
...
@@ -435,9 +435,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -435,9 +435,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
pinDateTime
(
now
+
2.0
/
86400
)
self
.
pinDateTime
(
now
+
2.0
/
86400
)
self
.
processTest
(
"test suite 3"
,
"r0=a"
,
node_title
=
"COMP1-Node1"
)
self
.
processTest
(
"test suite 3"
,
"r0=a"
,
node_title
=
"COMP1-Node1"
)
# so by default, when no test is running, older test suite is given first
# so by default, when no test is running, older test suite is given first
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
getTestSuiteList
(
"COMP0-Node1"
))
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
# Start some work
# Start some work
self
.
pinDateTime
(
now
+
3.0
/
86400
)
self
.
pinDateTime
(
now
+
3.0
/
86400
)
...
@@ -445,9 +445,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -445,9 +445,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP1-Node1 : test suite 2
# COMP1-Node1 : test suite 2
# suite 1 is now the newest, it is checked last, test suite 3 has priority on test suite 2
# suite 1 is now the newest, it is checked last, test suite 3 has priority on test suite 2
# since no test is running for it
# since no test is running for it
self
.
assertEqual
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP0-Node1"
))
getTestSuiteList
(
"COMP0-Node1"
))
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
# Now let's say test suite 3 is starting too
# Now let's say test suite 3 is starting too
self
.
pinDateTime
(
now
+
4.0
/
86400
)
self
.
pinDateTime
(
now
+
4.0
/
86400
)
...
@@ -456,7 +456,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -456,7 +456,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP6-Node1 : test suite 3
# COMP6-Node1 : test suite 3
# test suite 3 still should have the priority other test suite 2, because it
# test suite 3 still should have the priority other test suite 2, because it
# has higher priority
# has higher priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
# another test node working on test suite 3
# another test node working on test suite 3
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP7-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP7-Node1"
,
start_count
=
0
,
stop_count
=
0
)
...
@@ -465,9 +465,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -465,9 +465,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# COMP7-Node1 : test suite 3
# Now we have 2 testnodes for test suite 3, and only 1 for test suite 2, time to give
# Now we have 2 testnodes for test suite 3, and only 1 for test suite 2, time to give
# more priority to test suite 2
# more priority to test suite 2
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
getTestSuiteList
(
"COMP0-Node1"
))
# so now a testnode working on test suite 2
# so now a testnode working on test suite 2
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP2-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP2-Node1"
,
start_count
=
0
,
stop_count
=
0
)
...
@@ -477,7 +477,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -477,7 +477,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# COMP7-Node1 : test suite 3
# Now we have 2 testnodes for test suite 3, and 2 for test suite 2, time to give
# Now we have 2 testnodes for test suite 3, and 2 for test suite 2, time to give
# more priority to test suite 3
# more priority to test suite 3
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP8-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP8-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
# COMP1-Node1 : test suite 2
...
@@ -487,7 +487,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -487,7 +487,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP8-Node1 : test suite 3
# COMP8-Node1 : test suite 3
# Now we have 3 testnodes for test suite 3, and 2 for test suite 2, test suite 3 still
# Now we have 3 testnodes for test suite 3, and 2 for test suite 2, test suite 3 still
# need priority due to higher priority
# need priority due to higher priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP9-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP9-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
# COMP1-Node1 : test suite 2
...
@@ -498,9 +498,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -498,9 +498,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP9-Node1 : test suite 3
# COMP9-Node1 : test suite 3
# Now we have 4 testnodes for test suite 3, and 2 for test suite 2, test suite 2 will
# Now we have 4 testnodes for test suite 3, and 2 for test suite 2, test suite 2 will
# have again priority
# have again priority
self
.
assertEqual
([
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 2"
,
"test suite 3"
],
getTestSuiteList
(
"COMP0-Node1"
))
getTestSuiteList
(
"COMP0-Node1"
))
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP3-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 2"
,
"r0=b"
,
node_title
=
"COMP3-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
# COMP1-Node1 : test suite 2
...
@@ -512,7 +512,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -512,7 +512,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP9-Node1 : test suite 3
# COMP9-Node1 : test suite 3
# Now we have 4 testnodes for test suite 3, and 3 for test suite 2, test suite 3 will
# Now we have 4 testnodes for test suite 3, and 3 for test suite 2, test suite 3 will
# have again priority
# have again priority
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP4-Node1"
,
start_count
=
0
,
stop_count
=
0
)
self
.
processTest
(
"test suite 3"
,
"r0=b"
,
node_title
=
"COMP4-Node1"
,
start_count
=
0
,
stop_count
=
0
)
# COMP1-Node1 : test suite 2
# COMP1-Node1 : test suite 2
...
@@ -523,9 +523,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -523,9 +523,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# COMP7-Node1 : test suite 3
# COMP7-Node1 : test suite 3
# COMP8-Node1 : test suite 3
# COMP8-Node1 : test suite 3
# COMP9-Node1 : test suite 3
# COMP9-Node1 : test suite 3
self
.
assertEqual
([
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP5-Node1"
))
getTestSuiteList
(
"COMP5-Node1"
))
self
.
assertEqual
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
self
.
assertEqual
s
([
"test suite 1"
,
"test suite 3"
,
"test suite 2"
],
getTestSuiteList
(
"COMP0-Node1"
))
getTestSuiteList
(
"COMP0-Node1"
))
finally
:
finally
:
self
.
unpinDateTime
()
self
.
unpinDateTime
()
...
@@ -654,7 +654,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -654,7 +654,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tic
()
self
.
tic
()
next_test_result_path
,
_
=
self
.
_createTestResult
(
next_test_result_path
,
_
=
self
.
_createTestResult
(
test_list
=
[
'testFoo'
,
'testBar'
],
revision
=
"r0=a,r1=b"
)
test_list
=
[
'testFoo'
,
'testBar'
],
revision
=
"r0=a,r1=b"
)
self
.
assertNotEqual
(
next_test_result_path
,
test_result_path
)
self
.
assertNotEqual
s
(
next_test_result_path
,
test_result_path
)
line_url
,
test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
line_url
,
test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
next_line_url
,
next_test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
next_line_url
,
next_test
=
self
.
tool
.
startUnitTest
(
next_test_result_path
)
self
.
assertEqual
([
'testFoo'
,
'testBar'
],
[
test
,
next_test
])
self
.
assertEqual
([
'testFoo'
,
'testBar'
],
[
test
,
next_test
])
...
@@ -861,7 +861,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -861,7 +861,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
Is this really useful and used ?
Is this really useful and used ?
"""
"""
self
.
_checkCreateTestResultAndAllowRestart
()
self
.
_checkCreateTestResultAndAllowRestart
()
def
test_09b_checkCreateTestResultAndAllowRestartWithTic
(
self
):
def
test_09b_checkCreateTestResultAndAllowRestartWithTic
(
self
):
"""
"""
...
@@ -881,15 +881,15 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -881,15 +881,15 @@ class TestTaskDistribution(TaskDistributionTestCase):
"""
"""
test_suite
,
=
self
.
_createTestSuite
(
cluster_configuration
=
None
)
# pylint: disable=unbalanced-tuple-unpacking
test_suite
,
=
self
.
_createTestSuite
(
cluster_configuration
=
None
)
# pylint: disable=unbalanced-tuple-unpacking
self
.
tic
()
self
.
tic
()
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
test_suite
.
setClusterConfiguration
(
"{'foo': 3}"
)
test_suite
.
setClusterConfiguration
(
"{'foo': 3}"
)
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
test_suite
.
setClusterConfiguration
(
'{"foo": 3}'
)
test_suite
.
setClusterConfiguration
(
'{"foo": 3}'
)
self
.
assertEqual
(
'{"configuration_list": [{"foo": 3}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{"foo": 3}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
# make sure generateConfiguration does not fail if test suite is invalidated
# make sure generateConfiguration does not fail if test suite is invalidated
test_suite
.
invalidate
()
test_suite
.
invalidate
()
self
.
tic
()
self
.
tic
()
self
.
assertEqual
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
self
.
assertEqual
s
(
'{"configuration_list": [{}]}'
,
self
.
distributor
.
generateConfiguration
(
test_suite
.
getTitle
()))
def
_checkTestSuiteAggregateList
(
self
,
*
args
):
def
_checkTestSuiteAggregateList
(
self
,
*
args
):
self
.
tic
()
self
.
tic
()
...
@@ -916,7 +916,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -916,7 +916,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
check
=
self
.
_checkTestSuiteAggregateList
check
=
self
.
_checkTestSuiteAggregateList
check
([
test_node_one
,
[
"one"
]],
check
([
test_node_one
,
[
"one"
]],
[
test_node_two
,
[
"two"
]])
[
test_node_two
,
[
"two"
]])
# first test suite is invalidated, so it should be removed from nodes,
# first test suite is invalidated, so it should be removed from nodes,
# but this should not change assignment of second test suite
# but this should not change assignment of second test suite
test_suite_one
.
invalidate
()
test_suite_one
.
invalidate
()
check
([
test_node_one
,
[]],
check
([
test_node_one
,
[]],
...
@@ -1042,7 +1042,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1042,7 +1042,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
tool
.
TestTaskDistribution
.
setMaxTestSuite
(
10
)
self
.
tool
.
TestTaskDistribution
.
setMaxTestSuite
(
10
)
self
.
_callOptimizeAlarm
()
self
.
_callOptimizeAlarm
()
self
.
assertEqual
(
5
,
len
(
set
(
test_node
.
getAggregateList
())))
self
.
assertEqual
(
5
,
len
(
set
(
test_node
.
getAggregateList
())))
self
.
assertEqual
(
set
(
test_node
.
getAggregateList
()),
self
.
assertEqual
(
set
(
test_node
.
getAggregateList
()),
set
([
x
.
getRelativeUrl
()
for
x
in
test_suite_list
]))
set
([
x
.
getRelativeUrl
()
for
x
in
test_suite_list
]))
def
test_12_checkCloudPerformanceOptimizationIsStable
(
self
):
def
test_12_checkCloudPerformanceOptimizationIsStable
(
self
):
...
@@ -1062,7 +1062,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1062,7 +1062,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
check
=
self
.
_checkTestSuiteAggregateList
check
=
self
.
_checkTestSuiteAggregateList
check
([
test_node_one
,
[
"one"
,
"two"
]],
check
([
test_node_one
,
[
"one"
,
"two"
]],
[
test_node_two
,
[
"one"
,
"two"
]])
[
test_node_two
,
[
"one"
,
"two"
]])
# first test suite is invalidated, so it should be removed from nodes,
# first test suite is invalidated, so it should be removed from nodes,
# but this should not change assignment of second test suite
# but this should not change assignment of second test suite
test_suite_one
.
invalidate
()
test_suite_one
.
invalidate
()
check
([
test_node_one
,
[
"two"
]],
check
([
test_node_one
,
[
"two"
]],
...
@@ -1130,7 +1130,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1130,7 +1130,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
Check test node subscription.
Check test node subscription.
"""
"""
test_node_module
=
self
.
test_node_module
test_node_module
=
self
.
test_node_module
# Generate informations for nodes to subscribe
# Generate informations for nodes to subscribe
nodes
=
dict
([(
"COMP%d-Scalability-Node_test14"
%
i
,
"COMP-%d"
%
i
)
for
i
in
range
(
0
,
5
)])
nodes
=
dict
([(
"COMP%d-Scalability-Node_test14"
%
i
,
"COMP-%d"
%
i
)
for
i
in
range
(
0
,
5
)])
# Subscribe nodes
# Subscribe nodes
...
@@ -1143,7 +1143,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1143,7 +1143,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
test_node_titles
=
[
x
.
getTitle
()
for
x
in
test_nodes
]
test_node_titles
=
[
x
.
getTitle
()
for
x
in
test_nodes
]
# Check subscription
# Check subscription
for
node_title
in
nodes
.
keys
():
for
node_title
in
nodes
.
keys
():
self
.
assert
In
(
node_title
,
test_node_titles
)
self
.
assert
True
(
node_title
in
test_node_titles
)
# Check ping date
# Check ping date
# TODO..
# TODO..
...
@@ -1153,7 +1153,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1153,7 +1153,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
- Check the master election
- Check the master election
"""
"""
test_node_module
=
self
.
test_node_module
test_node_module
=
self
.
test_node_module
## 1 (check election, classic)
## 1 (check election, classic)
# Subscribe nodes
# Subscribe nodes
self
.
scalability_distributor
.
subscribeNode
(
"COMP1-Scalability-Node1"
,
computer_guid
=
"COMP-1"
)
self
.
scalability_distributor
.
subscribeNode
(
"COMP1-Scalability-Node1"
,
computer_guid
=
"COMP-1"
)
...
@@ -1175,13 +1175,13 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1175,13 +1175,13 @@ class TestTaskDistribution(TaskDistributionTestCase):
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
# -Others test node must not be the matser
self
.
assertEqual
(
3
,
len
(
slave_test_node_list
))
self
.
assertEqual
s
(
3
,
len
(
slave_test_node_list
))
# Get the current master test node
# Get the current master test node
current_master_test_node_1
=
master_test_node_list
[
0
]
current_master_test_node_1
=
master_test_node_list
[
0
]
## 2 (check election, with adding new nodes)
## 2 (check election, with adding new nodes)
# Add new nodes
# Add new nodes
self
.
scalability_distributor
.
subscribeNode
(
"COMP5-Scalability-Node5"
,
computer_guid
=
"COMP-5"
)
self
.
scalability_distributor
.
subscribeNode
(
"COMP5-Scalability-Node5"
,
computer_guid
=
"COMP-5"
)
...
@@ -1190,14 +1190,14 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1190,14 +1190,14 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Check test node election
# Check test node election
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
# -Others test node must not be the matser
self
.
assertEqual
(
5
,
len
(
slave_test_node_list
))
self
.
assertEqual
s
(
5
,
len
(
slave_test_node_list
))
# Get the current master test node
# Get the current master test node
current_master_test_node_2
=
master_test_node_list
[
0
]
current_master_test_node_2
=
master_test_node_list
[
0
]
# Master test node while he is alive
# Master test node while he is alive
self
.
assertEqual
(
current_master_test_node_1
.
getTitle
(),
self
.
assertEqual
s
(
current_master_test_node_1
.
getTitle
(),
current_master_test_node_2
.
getTitle
())
current_master_test_node_2
.
getTitle
())
## 3 (check election, with master deletion)
## 3 (check election, with master deletion)
...
@@ -1206,16 +1206,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1206,16 +1206,16 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Check test node election
# Check test node election
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
master_test_node_list
,
slave_test_node_list
=
getMasterAndSlaveNodeList
()
# -Only one master must be elected
# -Only one master must be elected
self
.
assertEqual
(
1
,
len
(
master_test_node_list
))
self
.
assertEqual
s
(
1
,
len
(
master_test_node_list
))
# -Others test node must not be the matser
# -Others test node must not be the matser
self
.
assertEqual
(
4
,
len
(
slave_test_node_list
))
self
.
assertEqual
s
(
4
,
len
(
slave_test_node_list
))
# Get the current master test node
# Get the current master test node
current_master_test_node_3
=
master_test_node_list
[
0
]
current_master_test_node_3
=
master_test_node_list
[
0
]
# Master test node must be an other test node than previously
# Master test node must be an other test node than previously
self
.
assertNotEqual
(
current_master_test_node_2
.
getTitle
(),
self
.
assertNotEqual
s
(
current_master_test_node_2
.
getTitle
(),
current_master_test_node_3
.
getTitle
())
current_master_test_node_3
.
getTitle
())
def
test_16_startTestSuiteERP5ScalabilityDistributor
(
self
):
def
test_16_startTestSuiteERP5ScalabilityDistributor
(
self
):
"""
"""
...
@@ -1231,12 +1231,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1231,12 +1231,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
self
.
scalability_distributor
.
subscribeNode
(
"COMP4-Scalability-Node4"
,
computer_guid
=
"COMP-4"
)
self
.
scalability_distributor
.
subscribeNode
(
"COMP4-Scalability-Node4"
,
computer_guid
=
"COMP-4"
)
# Create test suite
# Create test suite
self
.
_createTestSuite
(
quantity
=
1
,
priority
=
1
,
reference_correction
=
0
,
self
.
_createTestSuite
(
quantity
=
1
,
priority
=
1
,
reference_correction
=
0
,
specialise_value
=
self
.
scalability_distributor
,
portal_type
=
"Scalability Test Suite"
)
specialise_value
=
self
.
scalability_distributor
,
portal_type
=
"Scalability Test Suite"
)
self
.
tic
()
self
.
tic
()
self
.
_callOptimizeAlarm
()
self
.
_callOptimizeAlarm
()
# Get current master test node
# Get current master test node
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
\
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
\
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
"validated"
)]
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
"validated"
)]
current_master_test_node
=
master_test_nodes
[
0
]
current_master_test_node
=
master_test_nodes
[
0
]
self
.
tic
()
self
.
tic
()
# Each node run startTestSuite
# Each node run startTestSuite
...
@@ -1255,12 +1255,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1255,12 +1255,12 @@ class TestTaskDistribution(TaskDistributionTestCase):
title
=
"COMP4-Scalability-Node4"
))
title
=
"COMP4-Scalability-Node4"
))
}
}
# Check if master has got a non empty configuration
# Check if master has got a non empty configuration
self
.
assertNotEqual
(
config_nodes
[
current_master_test_node
.
getTitle
()],
[])
self
.
assertNotEqual
s
(
config_nodes
[
current_master_test_node
.
getTitle
()],
[])
# -Delete master test node suite from dict
# -Delete master test node suite from dict
del
config_nodes
[
current_master_test_node
.
getTitle
()]
del
config_nodes
[
current_master_test_node
.
getTitle
()]
# Check if slave test node have got empty list
# Check if slave test node have got empty list
for
suite
in
config_nodes
.
values
():
for
suite
in
config_nodes
.
values
():
self
.
assertEqual
(
suite
,
[])
self
.
assertEqual
s
(
suite
,
[])
def
test_16A_startTestSuiteERP5ScalabilityDistributorWithRunningTestResult
(
self
):
def
test_16A_startTestSuiteERP5ScalabilityDistributorWithRunningTestResult
(
self
):
# Subscribe nodes
# Subscribe nodes
...
@@ -1277,7 +1277,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1277,7 +1277,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
test_result
.
start
()
test_result
.
start
()
self
.
tic
()
self
.
tic
()
configuration
=
self
.
scalability_distributor
.
startTestSuite
(
title
=
"COMP1-Scalability-Node1"
)
configuration
=
self
.
scalability_distributor
.
startTestSuite
(
title
=
"COMP1-Scalability-Node1"
)
self
.
assertNotEqual
(
configuration
,
[])
self
.
assertNotEqual
s
(
configuration
,
[])
def
test_17_isMasterTestnodeERP5ScalabilityDistributor
(
self
):
def
test_17_isMasterTestnodeERP5ScalabilityDistributor
(
self
):
...
@@ -1296,7 +1296,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1296,7 +1296,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
# Optimize configuration
# Optimize configuration
self
.
scalability_distributor
.
optimizeConfiguration
()
self
.
scalability_distributor
.
optimizeConfiguration
()
self
.
tic
()
self
.
tic
()
# Get test nodes
# Get test nodes
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
master_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
'validated'
)]
if
(
x
.
getMaster
()
==
True
and
x
.
getValidationState
()
==
'validated'
)]
slave_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
slave_test_nodes
=
[
x
for
x
in
test_node_module
.
searchFolder
()
...
@@ -1330,7 +1330,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1330,7 +1330,7 @@ class TestTaskDistribution(TaskDistributionTestCase):
partition_dict
+=
' "instance-count": {{ count }},
\
n
'
partition_dict
+=
' "instance-count": {{ count }},
\
n
'
partition_dict
+=
' "family": "%s",
\
n
'
%
family_name
partition_dict
+=
' "family": "%s",
\
n
'
%
family_name
partition_dict
+=
' "computer_guid": "%s"
\
n
'
%
node_list
[
j
][
0
]
partition_dict
+=
' "computer_guid": "%s"
\
n
'
%
node_list
[
j
][
0
]
partition_dict
+=
'}'
partition_dict
+=
'}'
if
j
!=
i
-
1
:
if
j
!=
i
-
1
:
partition_dict
+=
',
\
n
'
partition_dict
+=
',
\
n
'
else
:
else
:
...
@@ -1363,9 +1363,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
...
@@ -1363,9 +1363,9 @@ class TestTaskDistribution(TaskDistributionTestCase):
# break
# break
# # Get configuration list generated from test suite
# # Get configuration list generated from test suite
## configuration_list = self.scalability_distributor.generateConfiguration(test_suite_title)
## configuration_list = self.scalability_distributor.generateConfiguration(test_suite_title)
#
#
# # logs
# # logs
## log(configuration_list)
## log(configuration_list)
def
test_19_testMultiDistributor
(
self
):
def
test_19_testMultiDistributor
(
self
):
pass
pass
...
...
bt5/erp5_test_result/ToolComponentTemplateItem/portal_components/tool.erp5.TaskDistributionTool.py
View file @
e43da477
...
@@ -31,7 +31,7 @@ from AccessControl import ClassSecurityInfo
...
@@ -31,7 +31,7 @@ from AccessControl import ClassSecurityInfo
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type
import
Permissions
from
Products.ERP5Type.Tool.BaseTool
import
BaseTool
from
Products.ERP5Type.Tool.BaseTool
import
BaseTool
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
,
NegatedQuery
from
Products.ZSQLCatalog.SQLCatalog
import
SimpleQuery
,
NegatedQuery
from
zLOG
import
LOG
,
DEBUG
from
zLOG
import
LOG
,
DEBUG
,
INFO
from
xmlrpclib
import
Binary
from
xmlrpclib
import
Binary
class
TaskDistributionTool
(
BaseTool
):
class
TaskDistributionTool
(
BaseTool
):
...
@@ -89,7 +89,7 @@ class TaskDistributionTool(BaseTool):
...
@@ -89,7 +89,7 @@ class TaskDistributionTool(BaseTool):
-> (test_result_path, revision) or None if already completed
-> (test_result_path, revision) or None if already completed
"""
"""
LOG
(
'
createTestResult'
,
DEBUG
,
(
name
,
revision
,
test_title
,
project_title
))
LOG
(
'
tool.erp5.TaskDistributionTool.createTestResult'
,
INFO
,
(
name
,
revision
,
test_title
,
project_title
))
portal
=
self
.
getPortalObject
()
portal
=
self
.
getPortalObject
()
if
test_title
is
None
:
if
test_title
is
None
:
test_title
=
name
test_title
=
name
...
@@ -215,6 +215,7 @@ class TaskDistributionTool(BaseTool):
...
@@ -215,6 +215,7 @@ class TaskDistributionTool(BaseTool):
# following 2 functions only call 'newContent' on test_result
# following 2 functions only call 'newContent' on test_result
createTestResultLineList
(
test_result
,
test_name_list
)
createTestResultLineList
(
test_result
,
test_name_list
)
createNode
(
test_result
,
node_title
)
createNode
(
test_result
,
node_title
)
LOG
(
'createTestResult RESULT'
,
INFO
,
(
test_result
.
getRelativeUrl
(),
revision
))
return
test_result
.
getRelativeUrl
(),
revision
return
test_result
.
getRelativeUrl
(),
revision
security
.
declarePublic
(
'startUnitTest'
)
security
.
declarePublic
(
'startUnitTest'
)
...
...
bt5/erp5_test_result/WorkflowTemplateItem/portal_workflow/test_result_workflow/script_TestResult_fail.py
View file @
e43da477
...
@@ -15,4 +15,4 @@ if test_result.getPortalType() == 'Test Result Node':
...
@@ -15,4 +15,4 @@ if test_result.getPortalType() == 'Test Result Node':
edit_kw
[
key
]
=
key_value
edit_kw
[
key
]
=
key_value
test_result
.
edit
(
**
edit_kw
)
test_result
.
edit
(
**
edit_kw
)
else
:
else
:
cont
ainer
.
script_
TestResult_complete
(
sci
)
cont
ext
.
TestResult_complete
(
sci
)
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