1 package autotest.moblab; 2 3 import autotest.common.ui.TabView; 4 import autotest.moblab.rpc.MoblabRpcCallbacks; 5 import autotest.moblab.rpc.MoblabRpcCallbacks.RunSuiteCallback; 6 import autotest.moblab.rpc.MoblabRpcHelper; 7 import com.google.gwt.event.dom.client.ChangeEvent; 8 import com.google.gwt.event.dom.client.ChangeHandler; 9 import com.google.gwt.event.dom.client.ClickEvent; 10 import com.google.gwt.event.dom.client.ClickHandler; 11 import com.google.gwt.user.client.Window; 12 import com.google.gwt.user.client.ui.Button; 13 import com.google.gwt.user.client.ui.HasVerticalAlignment; 14 import com.google.gwt.user.client.ui.HorizontalPanel; 15 import com.google.gwt.user.client.ui.Label; 16 import com.google.gwt.user.client.ui.ListBox; 17 import com.google.gwt.user.client.ui.SimplePanel; 18 import com.google.gwt.user.client.ui.TextArea; 19 import com.google.gwt.user.client.ui.VerticalPanel; 20 import com.google.gwt.user.client.ui.Widget; 21 import java.util.Arrays; 22 import java.util.List; 23 24 25 /** 26 * Implement a tab to make a very easy way to run the most common moblab suites. 27 */ 28 public class SuiteRunnerView extends TabView { 29 30 private VerticalPanel suiteRunnerMainPanel; 31 private ListBox boardSelector; 32 private ListBox buildSelector; 33 private ListBox suiteSelector; 34 private ListBox rwFirmwareSelector; 35 private ListBox roFirmwareSelector; 36 private ListBox poolSelector; 37 private Button actionButton; 38 private TextArea suiteArgsTextArea; 39 private HorizontalPanel thirdOptionalLine; 40 41 private static List<String> suiteNames = Arrays.asList("bvt-cq", "bvt-inline", 42 "cts", "cts_N", "gts", "hardware_storagequal", "hardware_memoryqual", 43 "faft_setup", "faft_ec", "faft_bios"); 44 45 private static String TEST_LIST_PLACEHOLDER = "arm.CtsAnimationTestCases, x86.CtsDeqpTestCases"; 46 47 @Override 48 public String getElementId() { 49 return "suite_run"; 50 } 51 52 @Override 53 public void refresh() { 54 super.refresh(); 55 boardSelector.clear(); 56 buildSelector.clear(); 57 suiteSelector.clear(); 58 rwFirmwareSelector.clear(); 59 roFirmwareSelector.clear(); 60 poolSelector.clear(); 61 suiteArgsTextArea.setText(""); 62 63 buildSelector.addItem("Select the build"); 64 suiteSelector.addItem("Select the suite"); 65 poolSelector.addItem("Select the pool"); 66 67 rwFirmwareSelector.addItem("Select the RW Firmware (Faft only) (Optional)"); 68 roFirmwareSelector.addItem("Select the RO Firmware (Faft only) (Optional)"); 69 70 for (String suite : suiteNames) { 71 suiteSelector.addItem(suite); 72 } 73 74 loadBoards(); 75 loadPools(); 76 addWidget(suiteRunnerMainPanel, "view_suite_run"); 77 }; 78 79 @Override 80 public void initialize() { 81 super.initialize(); 82 83 boardSelector = new ListBox(); 84 buildSelector = new ListBox(); 85 suiteSelector = new ListBox(); 86 rwFirmwareSelector = new ListBox(); 87 roFirmwareSelector = new ListBox(); 88 poolSelector = new ListBox(); 89 suiteArgsTextArea = new TextArea(); 90 suiteArgsTextArea.getElement().setPropertyString("placeholder", TEST_LIST_PLACEHOLDER); 91 92 boardSelector.addChangeHandler(new ChangeHandler() { 93 @Override 94 public void onChange(ChangeEvent event) { 95 boardSelected(); 96 } 97 }); 98 boardSelector.setStyleName("run_suite_selector"); 99 100 buildSelector.setEnabled(false); 101 buildSelector.addChangeHandler(new ChangeHandler() { 102 @Override 103 public void onChange(ChangeEvent event) { 104 buildSelected(); 105 } 106 }); 107 buildSelector.setStyleName("run_suite_selector"); 108 109 suiteSelector.setEnabled(false); 110 suiteSelector.addChangeHandler(new ChangeHandler() { 111 @Override 112 public void onChange(ChangeEvent event) { 113 suiteSelected(); 114 } 115 }); 116 suiteSelector.setStyleName("run_suite_selector"); 117 118 rwFirmwareSelector.setEnabled(false); 119 rwFirmwareSelector.setStyleName("run_suite_selector"); 120 roFirmwareSelector.setEnabled(false); 121 roFirmwareSelector.setStyleName("run_suite_selector"); 122 poolSelector.setEnabled(false); 123 poolSelector.setStyleName("run_suite_selector"); 124 125 suiteArgsTextArea.setStyleName("run_suite_test_args"); 126 127 HorizontalPanel firstLine = createHorizontalLineItem("Select board:", boardSelector); 128 HorizontalPanel secondLine = createHorizontalLineItem("Select build:", buildSelector); 129 HorizontalPanel thirdLine = createHorizontalLineItem("Select suite:", suiteSelector); 130 thirdOptionalLine = createHorizontalLineItem("Only run specified tests (Optional):", 131 suiteArgsTextArea); 132 thirdOptionalLine.setVisible(false); 133 HorizontalPanel fourthLine = createHorizontalLineItem("RW Firmware (Optional):", rwFirmwareSelector); 134 HorizontalPanel fifthLine = createHorizontalLineItem("RO Firmware (Optional):", roFirmwareSelector); 135 HorizontalPanel sixthLine = createHorizontalLineItem("Pool (Optional):", poolSelector); 136 137 actionButton = new Button("Run Suite", new ClickHandler() { 138 public void onClick(ClickEvent event) { 139 int boardSelection = boardSelector.getSelectedIndex(); 140 int buildSelection = buildSelector.getSelectedIndex(); 141 int suiteSelection = suiteSelector.getSelectedIndex(); 142 int poolSelection = poolSelector.getSelectedIndex(); 143 int rwFirmwareSelection = rwFirmwareSelector.getSelectedIndex(); 144 int roFirmwareSelection = roFirmwareSelector.getSelectedIndex(); 145 if (boardSelection != 0 && buildSelection != 0 && suiteSelection != 0) { 146 String poolLabel = new String(); 147 if (poolSelection != 0) { 148 poolLabel = poolSelector.getItemText(poolSelection); 149 } 150 String rwFirmware = new String(); 151 if (rwFirmwareSelection != 0) { 152 rwFirmware = rwFirmwareSelector.getItemText(rwFirmwareSelection); 153 } 154 String roFirmware = new String(); 155 if (roFirmwareSelection != 0) { 156 roFirmware = roFirmwareSelector.getItemText(roFirmwareSelection); 157 } 158 runSuite(boardSelector.getItemText(boardSelection), 159 buildSelector.getItemText(buildSelection), 160 suiteSelector.getItemText(suiteSelection), 161 poolLabel, 162 rwFirmware, 163 roFirmware, 164 suiteArgsTextArea.getText()); 165 } else { 166 Window.alert("You have to select a valid board, build and suite."); 167 } 168 }}); 169 170 actionButton.setEnabled(false); 171 actionButton.setStyleName("run_suite_button"); 172 HorizontalPanel seventhLine = createHorizontalLineItem("", actionButton); 173 174 suiteRunnerMainPanel = new VerticalPanel(); 175 176 suiteRunnerMainPanel.add(firstLine); 177 suiteRunnerMainPanel.add(secondLine); 178 suiteRunnerMainPanel.add(thirdLine); 179 suiteRunnerMainPanel.add(thirdOptionalLine); 180 suiteRunnerMainPanel.add(fourthLine); 181 suiteRunnerMainPanel.add(fifthLine); 182 suiteRunnerMainPanel.add(sixthLine); 183 suiteRunnerMainPanel.add(seventhLine); 184 } 185 186 private HorizontalPanel createHorizontalLineItem(String label, Widget item) { 187 HorizontalPanel panel = new HorizontalPanel(); 188 panel.add(contstructLabel(label)); 189 panel.add(item); 190 return panel; 191 } 192 193 private Label contstructLabel(String labelName) { 194 Label label = new Label(labelName); 195 label.setStyleName("run_suite_label"); 196 return label; 197 } 198 199 private void suiteSelected() { 200 int selectedIndex = suiteSelector.getSelectedIndex(); 201 if (selectedIndex != 0) { 202 actionButton.setEnabled(true); 203 } 204 // Account for their being an extra item in the drop down 205 int listIndex = selectedIndex - 1; 206 if (listIndex == suiteNames.indexOf("faft_setup") || 207 listIndex == suiteNames.indexOf("faft_bios") || 208 listIndex == suiteNames.indexOf("faft_ec")) { 209 loadFirmwareBuilds(boardSelector.getItemText(boardSelector.getSelectedIndex())); 210 } else { 211 rwFirmwareSelector.setEnabled(false); 212 roFirmwareSelector.setEnabled(false); 213 rwFirmwareSelector.setSelectedIndex(0); 214 roFirmwareSelector.setSelectedIndex(0); 215 } 216 217 if (listIndex == suiteNames.indexOf("gts") || 218 listIndex == suiteNames.indexOf("cts") || 219 listIndex == suiteNames.indexOf("cts_N")) { 220 thirdOptionalLine.setVisible(true); 221 } else { 222 suiteArgsTextArea.setText(""); 223 thirdOptionalLine.setVisible(false); 224 } 225 } 226 227 private void buildSelected() { 228 int selectedIndex = buildSelector.getSelectedIndex(); 229 if (selectedIndex != 0) { 230 suiteSelector.setEnabled(true); 231 } 232 } 233 234 private void boardSelected() { 235 suiteSelector.setEnabled(false); 236 actionButton.setEnabled(false); 237 int selectedIndex = boardSelector.getSelectedIndex(); 238 // Ignore if user select the instruction label. 239 if (selectedIndex != 0) { 240 loadBuilds(boardSelector.getItemText(boardSelector.getSelectedIndex())); 241 } 242 } 243 244 /** 245 * Call an RPC to get the boards that are connected to the moblab and populate them in the 246 * dropdown. 247 */ 248 private void loadBoards() { 249 boardSelector.setEnabled(false); 250 boardSelector.clear(); 251 boardSelector.addItem("Select the board"); 252 MoblabRpcHelper.fetchConnectedBoards(new MoblabRpcCallbacks.FetchConnectedBoardsCallback() { 253 @Override 254 public void onFetchConnectedBoardsSubmitted(List<String> connectedBoards) { 255 for (String connectedBoard : connectedBoards) { 256 boardSelector.addItem(connectedBoard); 257 } 258 boardSelector.setEnabled(true); 259 } 260 }); 261 } 262 263 /** 264 * Call an RPC to get the pools that are configured on the devices connected to the moblab. 265 * and fill in the . 266 */ 267 private void loadPools() { 268 poolSelector.setEnabled(false); 269 poolSelector.clear(); 270 poolSelector.addItem("Select a pool"); 271 MoblabRpcHelper.fetchConnectedPools(new MoblabRpcCallbacks.FetchConnectedPoolsCallback() { 272 @Override 273 public void onFetchConnectedPoolsSubmitted(List<String> connectedPools) { 274 for (String connectedPool : connectedPools) { 275 poolSelector.addItem(connectedPool); 276 } 277 poolSelector.setEnabled(true); 278 } 279 }); 280 } 281 282 283 /** 284 * Make a RPC to get the most recent builds available for the specified board and populate them 285 * in the dropdown. 286 * @param selectedBoard 287 */ 288 private void loadBuilds(String selectedBoard) { 289 buildSelector.setEnabled(false); 290 buildSelector.clear(); 291 buildSelector.addItem("Select the build"); 292 MoblabRpcHelper.fetchBuildsForBoard(selectedBoard, 293 new MoblabRpcCallbacks.FetchBuildsForBoardCallback() { 294 @Override 295 public void onFetchBuildsForBoardCallbackSubmitted(List<String> boards) { 296 for (String board : boards) { 297 buildSelector.addItem(board); 298 } 299 buildSelector.setEnabled(true); 300 } 301 }); 302 } 303 304 305 /** 306 * Make a RPC to get the most recent firmware available for the specified board and populate them 307 * in the dropdowns. 308 * @param selectedBoard 309 */ 310 private void loadFirmwareBuilds(String selectedBoard) { 311 rwFirmwareSelector.setEnabled(false); 312 roFirmwareSelector.setEnabled(false); 313 rwFirmwareSelector.clear(); 314 roFirmwareSelector.clear(); 315 rwFirmwareSelector.addItem("Select the RW Firmware (Faft only) (Optional)"); 316 roFirmwareSelector.addItem("Select the RO Firmware (Faft only) (Optional)"); 317 MoblabRpcHelper.fetchFirmwareForBoard(selectedBoard, 318 new MoblabRpcCallbacks.FetchFirmwareForBoardCallback() { 319 @Override 320 public void onFetchFirmwareForBoardCallbackSubmitted(List<String> firmwareBuilds) { 321 for (String firmware : firmwareBuilds) { 322 rwFirmwareSelector.addItem(firmware); 323 roFirmwareSelector.addItem(firmware); 324 } 325 rwFirmwareSelector.setEnabled(true); 326 roFirmwareSelector.setEnabled(true); 327 } 328 }); 329 } 330 331 332 /** 333 * For the selection option of board, build, suite and pool make a RPC call that will instruct 334 * AFE to run the suite selected. 335 * @param board, a string that specified a device connected to the moblab. 336 * @param build, a string that is a valid build for the specified board available in GCS. 337 * @param suite, a string that specifies the name of a suite selected to run. 338 * @param pool, an optional name of a pool to run the suite in. 339 * @param rwFirmware, an optional firmware to use for some qual tests. 340 * @param roFirmware, an optional firmware to use for some qual tests. 341 * @param suiteArgs, optional params to pass to the suite. 342 */ 343 private void runSuite(String board, String build, String suite, String pool, String rwFirmware, 344 String roFirmware, String suiteArgs) { 345 String realPoolLabel = pool; 346 if (pool != null && !pool.isEmpty()) { 347 realPoolLabel = pool.trim(); 348 } 349 MoblabRpcHelper.runSuite(board, build, suite, realPoolLabel, rwFirmware, roFirmware, 350 suiteArgs, new RunSuiteCallback() { 351 @Override 352 public void onRunSuiteComplete() { 353 Window.Location.assign("/afe"); 354 } 355 }); 356 }; 357 358 } 359