blob: 82b58023ade0bc641a46d567053024755efbe5f1 [file] [log] [blame]
Devin Lime1346f42018-05-15 15:41:36 -07001#!groovy
Jeremy Ronquillo6fbfdd52019-07-09 13:49:34 -07002// Copyright 2019 Open Networking Foundation (ONF)
Devin Limf5175192018-05-14 19:13:22 -07003//
4// Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
5// the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
6// or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
7//
8// TestON is free software: you can redistribute it and/or modify
9// it under the terms of the GNU General Public License as published by
10// the Free Software Foundation, either version 2 of the License, or
11// (at your option) any later version.
12//
13// TestON is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with TestON. If not, see <http://www.gnu.org/licenses/>.
20
Jeremy Ronquillo6fbfdd52019-07-09 13:49:34 -070021// This is the Jenkins script for master-trigger
Devin Limf5175192018-05-14 19:13:22 -070022
Jeremy Ronquillo336110a2019-07-11 14:20:40 -070023import groovy.time.TimeCategory
24import groovy.time.TimeDuration
25
Devin Limf5175192018-05-14 19:13:22 -070026// set the functions of the dependencies.
Jeremy Ronquillo336110a2019-07-11 14:20:40 -070027graphs = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsGraphs.groovy' )
Devin Limb734ea52018-05-14 14:13:05 -070028fileRelated = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsPathAndFiles.groovy' )
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -070029test_list = evaluate readTrusted( 'TestON/JenkinsFile/dependencies/JenkinsTestONTests.groovy' )
Devin Lim2edfcec2018-05-09 17:16:21 -070030
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -070031INITIALIZATION_TIMEOUT_MINUTES = 10 // timeout init() function if it takes too long.
32
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070033onos_tag = null
34manually_run = null
35now = null
36today = null
37onos_branches = null
38day = null
39post_result = null
40branchesParam = null
41isFabric = null
42testsParam = null
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -070043simulateDay = null
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -070044pipelineTimeOut = null
Jeremy Ronquillo4fd82442019-05-21 20:56:58 -070045
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070046dayMap = [:]
47fullDayMap = [:]
Jeremy Ronquilloa37920b2019-05-23 14:34:25 -070048all_testcases = [:]
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070049runTest = [:]
50selectedTests = [:]
51graphPaths = [:]
Devin Lim2edfcec2018-05-09 17:16:21 -070052
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070053main()
Devin Limf5175192018-05-14 19:13:22 -070054
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070055def main() {
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -070056 timeout( time: INITIALIZATION_TIMEOUT_MINUTES, unit: "MINUTES" ){
57 init()
58 }
Jeremy Ronquillo194e2a72019-08-09 12:36:09 -070059 if ( selectedTests == [:] && manually_run ){
60 echo "No valid tests provided. Check if the provided test(s) is/are in test.json, and try again.\n\nProvided Tests:\n" + testsParam
61 throw new Exception( "No valid tests provided. Check if the provided test(s) is/are in test.json, and try again." )
62 }
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -070063 timeout( time: pipelineTimeOut, unit: "MINUTES" ){
64 runTests()
65 generateGraphs()
66 }
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070067}
68
69// **************
70// Initialization
71// **************
72
73// initialize file scope vars
74def init(){
75 // get the name of the job.
76 jobName = env.JOB_NAME
77
78 // set the versions of the onos
79 fileRelated.init()
80 test_list.init()
81 readParams()
82
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070083 // list of the tests to be run will be saved in each choices.
84 day = ""
85
86 initDates()
87 onos_branches = getONOSBranches()
88 selectedTests = getONOSTests()
Jeremy Ronquilloa5aa7c12019-06-04 10:26:36 -070089
Jeremy Ronquillod98c2a12019-06-07 15:13:29 -070090 initGraphPaths()
91
Jeremy Ronquilloa5aa7c12019-06-04 10:26:36 -070092 echo "selectedTests: " + selectedTests
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -070093 echo "onos_branches: " + onos_branches
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -070094}
95
96def readParams(){
97 // get post result from the params for manually run.
98 post_result = params.PostResult
99 manually_run = params.manual_run
100 onos_tag = params.ONOSTag
101 branchesParam = params.branches
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700102 isOldFlow = true // hardcoding to true since we are always using oldFlow.
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700103 testsParam = params.Tests
104 isFabric = params.isFabric
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -0700105 simulateDay = params.simulate_day
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -0700106 pipelineTimeOut = params.TimeOut.toInteger()
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700107}
Devin Lim2edfcec2018-05-09 17:16:21 -0700108
109// Set tests based on day of week
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700110def initDates(){
111 echo "-> initDates()"
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700112 now = getCurrentTime()
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700113 dayMap = [ ( Calendar.MONDAY ) : "mon",
114 ( Calendar.TUESDAY ) : "tue",
115 ( Calendar.WEDNESDAY ) : "wed",
116 ( Calendar.THURSDAY ) : "thu",
117 ( Calendar.FRIDAY ) : "fri",
118 ( Calendar.SATURDAY ) : "sat",
119 ( Calendar.SUNDAY ) : "sun" ]
120 fullDayMap = [ ( Calendar.MONDAY ) : "Monday",
121 ( Calendar.TUESDAY ) : "Tuesday",
122 ( Calendar.WEDNESDAY ) : "Wednesday",
123 ( Calendar.THURSDAY ) : "Thursday",
124 ( Calendar.FRIDAY ) : "Friday",
125 ( Calendar.SATURDAY ) : "Saturday",
126 ( Calendar.SUNDAY ) : "Sunday" ]
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -0700127 if ( simulateDay == "" ){
128 today = now[ Calendar.DAY_OF_WEEK ]
129 day = dayMap[ today ]
130 print now.toString()
131 } else {
132 day = simulateDay
133 }
Jon Hall6af749d2018-05-29 12:59:47 -0700134}
Jeremy Ronquilloa37920b2019-05-23 14:34:25 -0700135
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700136def getCurrentTime(){
137 // get time of the PST zone.
138
139 TimeZone.setDefault( TimeZone.getTimeZone( 'PST' ) )
140 return new Date()
141}
142
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700143// gets ONOS branches from params or string parameter
144def getONOSBranches(){
145 echo "-> getONOSBranches()"
146 if ( manually_run ){
147 return branchesParam.tokenize( "\n;, " )
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700148 } else {
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -0700149 return test_list.getBranchesFromDay( day )
Devin Lim2edfcec2018-05-09 17:16:21 -0700150 }
151}
Devin Limf5175192018-05-14 19:13:22 -0700152
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700153def getONOSTests(){
154 echo "-> getONOSTests()"
155 if ( manually_run ){
156 return test_list.getTestsFromStringList( testsParam.tokenize( "\n;, " ) )
157 } else {
Jeremy Ronquillo3c2f10d2019-06-10 16:54:46 -0700158
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700159 return test_list.getTestsFromDay( day )
Jeremy Ronquilloa37920b2019-05-23 14:34:25 -0700160 }
Devin Lim2edfcec2018-05-09 17:16:21 -0700161}
Devin Limf5175192018-05-14 19:13:22 -0700162
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700163// init paths for the files and directories.
164def initGraphPaths(){
Jeremy Ronquillo1e5d7f22019-07-17 14:18:42 -0700165 graphPaths.put( "histogramMultiple", fileRelated.rScriptPaths[ "scripts" ][ "histogramMultiple" ] )
166 graphPaths.put( "pieMultiple", fileRelated.rScriptPaths[ "scripts" ][ "pieMultiple" ] )
167 graphPaths.put( "saveDirectory", fileRelated.workspaces[ "VM" ] )
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700168}
Jeremy Ronquillo64eeeb12019-05-13 11:19:46 -0700169
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700170// **********************
171// Determine Tests to Run
172// **********************
173
174def printTestsToRun( runList ){
175 if ( manually_run ){
176 println "Tests to be run manually:"
177 } else {
178 if ( isFabric ){
179 postToSlackSR()
Devin Lim2edfcec2018-05-09 17:16:21 -0700180 }
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700181 if ( today == Calendar.MONDAY ){
182 postToSlackTestsToRun()
183 }
184 println "Defaulting to " + day + " tests:"
Devin Lim2edfcec2018-05-09 17:16:21 -0700185 }
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700186 for ( list in runList ){
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700187 echo "" + list
188 }
Devin Lim2edfcec2018-05-09 17:16:21 -0700189}
Devin Limf5175192018-05-14 19:13:22 -0700190
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700191def postToSlackSR(){
192 // If it is automated running, it will post the beginning message to the channel.
193 slackSend( channel: 'sr-failures', color: '#03CD9F',
194 message: ":sparkles:" * 16 + "\n" +
195 "Starting tests on : " + now.toString() +
196 "\n" + ":sparkles:" * 16 )
197}
198
199def postToSlackTestsToRun(){
200 slackSend( color: '#FFD988',
201 message: "Tests to be run this weekdays : \n" +
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700202 printDaysForTest() )
203}
204
205def printDaysForTest(){
206 // Print the days for what test has.
207 AllTheTests = test_list.getAllTests()
208
209 result = ""
210 for ( String test in AllTheTests.keySet() ){
211 result += test + ": ["
212 test_schedule = AllTheTests[ test ][ "schedules" ]
213 for ( String sch_dict in test_schedule ){
214 for ( String day in test_list.convertScheduleKeyToDays( sch_dict[ "branch" ] ) ){
215 result += day + " "
216 }
217 }
218 result += "]\n"
219 }
220 return result
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700221}
222
223// *********
224// Run Tests
225// *********
226
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700227def tagCheck( onos_tag, onos_branch ){
228 // check the tag for onos if it is not empty
229
230 result = "git checkout "
231 if ( onos_tag == "" ){
232 //create new local branch
233 result += onos_branch
234 }
235 else {
236 //checkout the tag
237 result += onos_tag
238 }
239 return result
240}
241
242def preSetup( onos_branch, test_branch, onos_tag, isManual ){
243 // pre setup part which will clean up and checkout to corresponding branch.
244
245 result = ""
246 if ( !isManual ){
247 result = '''echo -e "\n##### Set TestON Branch #####"
248 echo "TestON Branch is set on: ''' + test_branch + '''"
249 cd ~/OnosSystemTest/
250 git checkout HEAD~1 # Make sure you aren't pn a branch
251 git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
252 git branch -D ''' + test_branch + ''' # just in case there are local changes. This will normally result in a branch not found error
253 git clean -df # clean any local files
254 git fetch --all # update all caches from remotes
255 git reset --hard origin/''' + test_branch + ''' # force local index to match remote branch
256 git clean -df # clean any local files
257 git checkout ''' + test_branch + ''' #create new local branch
258 git branch
259 git log -1 --decorate
260 echo -e "\n##### Set ONOS Branch #####"
261 echo "ONOS Branch is set on: ''' + onos_branch + '''"
262 echo -e "\n #### check karaf version ######"
263 env |grep karaf
264 cd ~/onos
265 git checkout HEAD~1 # Make sure you aren't pn a branch
266 git branch | grep -v "detached from" | xargs git branch -d # delete all local branches merged with remote
267 git branch -D ''' + onos_branch + ''' # just incase there are local changes. This will normally result in a branch not found error
268 git clean -df # clean any local files
269 git fetch --all # update all caches from remotes
270 git reset --hard origin/''' + onos_branch + ''' # force local index to match remote branch
271 git clean -df # clean any local files
272 rm -rf buck-out
273 rm -rf bazel-*
274 ''' + tagCheck( onos_tag, onos_branch ) + '''
275 git branch
276 git log -1 --decorate
277 echo -e "\n##### set jvm heap size to 8G #####"
278 echo ${ONOSJAVAOPTS}
279 inserted_line="export JAVA_OPTS=\"\${ONOSJAVAOPTS}\""
280 sed -i "s/bash/bash\\n$inserted_line/" ~/onos/tools/package/bin/onos-service
281 echo "##### Check onos-service setting..... #####"
282 cat ~/onos/tools/package/bin/onos-service
283 export JAVA_HOME=/usr/lib/jvm/java-8-oracle'''
284 } else {
285 result = '''echo "Since this is a manual run, we'll use the current ONOS and TestON branch:"
286 echo "ONOS branch:"
287 cd ~/OnosSystemTest/
288 git branch
289 echo "TestON branch:"
290 cd ~/TestON/
291 git branch'''
292 }
293 return result
294}
295
296def postSetup( onos_branch, test_branch, onos_tag, isManual ){
297 // setup that will build ONOS
298
299 result = ""
300 if ( !isManual ){
301 result = '''echo -e "Installing bazel"
302 cd ~
303 rm -rf ci-management
304 git clone https://gerrit.onosproject.org/ci-management
305 cd ci-management/jjb/onos/
306 export GERRIT_BRANCH="''' + onos_branch + '''"
307 chmod +x install-bazel.sh
308 ./install-bazel.sh
309 '''
310 } else {
311 result = '''echo -e "Since this is a manual run, we will not install Bazel."'''
312 }
313 return result
314}
315
316def generateKey(){
317 // generate cluster-key of the onos
318
319 try {
320 sh script: '''
321 #!/bin/bash -l
322 set +e
323 . ~/.bashrc
324 env
325 onos-push-bits-through-proxy
326 onos-gen-cluster-key -f
327 ''', label: "Generate Cluster Key", returnStdout: false
328 } catch ( all ){
329 }
330}
331
332// Initialize the environment Setup for the onos and OnosSystemTest
333def envSetup( onos_branch, test_branch, onos_tag, jobOn, manuallyRun, nodeLabel ){
334 // to setup the environment using the bash script
335 stage( "Environment Setup: " + onos_branch + "-" + nodeLabel + "-" + jobOn ) {
336 // after env: ''' + borrow_mn( jobOn ) + '''
337 sh script: '''#!/bin/bash -l
338 set +e
339 . ~/.bashrc
340 env
341 ''' + preSetup( onos_branch, test_branch, onos_tag, manuallyRun ), label: "Repo Setup", returnStdout: false
342 sh script: postSetup( onos_branch, test_branch, onos_tag, manuallyRun ), label: "Install Bazel", returnStdout: false
343 generateKey()
344 }
345}
346
347// export Environment properties.
348def exportEnvProperty( onos_branch, test_branch, jobOn, wiki, tests, postResult, manually_run, onosTag, isOldFlow, nodeLabel ){
349 // export environment properties to the machine.
350
351 filePath = "/var/jenkins/TestONOS-" + jobOn + "-" + onos_branch + ".property"
352
353 stage( "Property Export: " + onos_branch + "-" + nodeLabel + "-" + jobOn ) {
354 sh script: '''
355 echo "ONOSBranch=''' + onos_branch + '''" > ''' + filePath + '''
356 echo "TestONBranch=''' + test_branch + '''" >> ''' + filePath + '''
357 echo "ONOSTag=''' + onosTag + '''" >> ''' + filePath + '''
358 echo "WikiPrefix=''' + wiki + '''" >> ''' + filePath + '''
359 echo "ONOSJAVAOPTS=''' + env.ONOSJAVAOPTS + '''" >> ''' + filePath + '''
360 echo "Tests=''' + tests + '''" >> ''' + filePath + '''
361 echo "postResult=''' + postResult + '''" >> ''' + filePath + '''
362 echo "manualRun=''' + manually_run + '''" >> ''' + filePath + '''
363 echo "isOldFlow=''' + isOldFlow + '''" >> ''' + filePath + '''
364 ''', label: "Exporting Property File: " + filePath
365 }
366}
367
368def trigger( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag ){
369 // triggering function that will setup the environment and determine which pipeline to trigger
370
371 println "Job name: " + jobOn + "-pipeline-" + ( manuallyRun ? "manually" : branch )
372 def wiki = branch
373 def onos_branch = test_list.addPrefixToBranch( branch )
374 def test_branch = test_list.addPrefixToBranch( branch )
375 assignedNode = null
376 node( label: nodeLabel ) {
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700377 envSetup( onos_branch, test_branch, onosTag, jobOn, manuallyRun, nodeLabel )
378 exportEnvProperty( onos_branch, test_branch, jobOn, wiki, tests, post_result, manuallyRun, onosTag, isOldFlow, nodeLabel )
379 assignedNode = env.NODE_NAME
380 }
381
382 jobToRun = jobOn + "-pipeline-" + ( manuallyRun ? "manually" : wiki )
383 build job: jobToRun, propagate: false, parameters: [ [ $class: 'StringParameterValue', name: 'Category', value: jobOn ],
384 [ $class: 'StringParameterValue', name: 'Branch', value: branch ],
385 [ $class: 'StringParameterValue', name: 'TestStation', value: assignedNode ],
Jeremy Ronquillo6da78cf2019-07-29 11:47:19 -0700386 [ $class: 'StringParameterValue', name: 'NodeLabel', value: nodeLabel ],
387 [ $class: 'StringParameterValue', name: 'TimeOut', value: pipelineTimeOut.toString() ] ]
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700388}
389
390def trigger_pipeline( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag ){
391 // nodeLabel : nodeLabel from tests.json
392 // jobOn : "SCPF" or "USECASE" or "FUNC" or "HA"
393 // this will return the function by wrapping them up with return{} to prevent them to be
394 // executed once this function is called to assign to specific variable.
395 return {
396 trigger( branch, tests, nodeLabel, jobOn, manuallyRun, onosTag )
397 }
398}
399
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700400def generateRunList(){
401 runList = [:]
Jeremy Ronquilloedb663b2019-06-26 14:09:38 -0700402 validSchedules = test_list.getValidSchedules( day )
403 echo "validSchedules: " + validSchedules
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700404 for ( branch in onos_branches ){
Jeremy Ronquilloa5aa7c12019-06-04 10:26:36 -0700405 runBranch = []
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700406 nodeLabels = test_list.getAllNodeLabels( branch, selectedTests )
407 for ( nodeLabel in nodeLabels ){
408 selectedNodeLabelTests = test_list.getTestsFromNodeLabel( nodeLabel, branch, selectedTests )
409 selectedNodeLabelCategories = test_list.getAllTestCategories( selectedNodeLabelTests )
410 for ( category in selectedNodeLabelCategories ){
Jeremy Ronquilloa5aa7c12019-06-04 10:26:36 -0700411 selectedNodeLabelCategoryTests = test_list.getTestsFromCategory( category, selectedNodeLabelTests )
Jeremy Ronquilloedb663b2019-06-26 14:09:38 -0700412
413 filteredList = [:]
414 for ( key in selectedNodeLabelCategoryTests.keySet() ){
415 for ( sch in selectedNodeLabelCategoryTests[ key ][ "schedules" ] ){
Jeremy Ronquillobd26bdb2019-07-08 16:15:45 -0700416 if ( validSchedules.contains( sch[ "day" ] ) && sch[ "branch" ] == test_list.convertBranchToBranchCode( branch ) || manually_run ){
Jeremy Ronquilloedb663b2019-06-26 14:09:38 -0700417 filteredList.put( key, selectedNodeLabelCategoryTests[ key ] )
418 break
419 }
420 }
421 }
422
423 echo "=========================================="
424 echo "BRANCH: " + branch
425 echo "CATEGORY: " + category
426 echo "TESTS: " + filteredList
427 if ( filteredList != [:] ){
428 exeTestList = test_list.getTestListAsString( filteredList )
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700429 runList.put( branch + "-" + nodeLabel + "-" + category, trigger_pipeline( branch, exeTestList, nodeLabel, category, manually_run, onos_tag ) )
Jeremy Ronquilloedb663b2019-06-26 14:09:38 -0700430 }
431
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700432 }
Jeremy Ronquilloa37920b2019-05-23 14:34:25 -0700433 }
Devin Lim2edfcec2018-05-09 17:16:21 -0700434 }
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700435 return runList
Devin Lim2edfcec2018-05-09 17:16:21 -0700436}
Devin Limf5175192018-05-14 19:13:22 -0700437
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700438def runTests(){
439 runList = generateRunList()
440 printTestsToRun( runList )
441 parallel runList
Devin Lim2edfcec2018-05-09 17:16:21 -0700442}
Devin Limf5175192018-05-14 19:13:22 -0700443
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700444// ***************
445// Generate Graphs
446// ***************
Devin Lim2edfcec2018-05-09 17:16:21 -0700447
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700448def generateGraphs(){
449 // If it is automated running, it will generate the stats graph on VM.
450 if ( !manually_run ){
451 for ( String b in onos_branches ){
Jeremy Ronquillo336110a2019-07-11 14:20:40 -0700452 graphs.generateStatGraph( "TestStation-VMs",
Jeremy Ronquillo21c29fc2019-06-05 11:15:24 -0700453 test_list.addPrefixToBranch( b ),
Jeremy Ronquillo96e2bd32019-05-28 15:40:18 -0700454 graphPaths[ "histogramMultiple" ],
455 graphPaths[ "pieMultiple" ],
Jeremy Ronquillocfec28a2019-08-08 11:29:04 -0700456 graphPaths[ "saveDirectory" ],
457 "VM" )
Jeremy Ronquilloa37920b2019-05-23 14:34:25 -0700458 }
Devin Lim2edfcec2018-05-09 17:16:21 -0700459 }
Devin Lim2edfcec2018-05-09 17:16:21 -0700460}