package autotest.moblab; import autotest.common.ui.TabView; import autotest.moblab.rpc.MoblabRpcCallbacks; import autotest.moblab.rpc.MoblabRpcCallbacks.RunSuiteCallback; import autotest.moblab.rpc.MoblabRpcHelper; import autotest.moblab.rpc.ConnectedBoard; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import java.util.Arrays; import java.util.List; import java.util.HashMap; /** * Implement a tab to make a very easy way to run the most common moblab suites. */ public class SuiteRunnerView extends TabView { private VerticalPanel suiteRunnerMainPanel; private ListBox boardSelector; private ListBox buildSelector; private ListBox suiteSelector; private ListBox rwFirmwareSelector; private ListBox roFirmwareSelector; private ListBox poolSelector; private Button actionButton; private TextArea suiteArgsTextArea; private HorizontalPanel thirdOptionalLine; private TextBox bugIdTextBox; private HorizontalPanel fourthOptionalLine; private TextBox partIdTextBox; private HorizontalPanel fifthOptionalLine; private TextArea testArgsTextArea; private HorizontalPanel sixthOptionalLine; private static String TEST_ARGS_PLACEHOLDER = "line delimited test arguments\nexample:\nmyarg=myval\nmyarg2=myval2"; private HashMap modelBoardMap; private static List suiteNames = Arrays.asList( "au_fsi", "bvt-cq", "bvt-inline", "bvt-tast-cq", "camera-usb-qual", "check_setup_cts_N", "check_setup_storage_qual", "cts_N", "cts_P", "gts", "hardware_memoryqual", "hardware_storagequal", "hardware_storagequal_quick", "power_idle", "power_loadtest", "power_loadtest_1hour", "power_loadtest_fast", "power_measurement_wrapper", "power_check", "wifi_matfunc", "wifi_perf" ); private static String TEST_LIST_PLACEHOLDER = "arm.CtsAnimationTestCases, x86.CtsDeqpTestCases"; @Override public String getElementId() { return "suite_run"; } @Override public void refresh() { super.refresh(); boardSelector.clear(); buildSelector.clear(); suiteSelector.clear(); rwFirmwareSelector.clear(); roFirmwareSelector.clear(); poolSelector.clear(); suiteArgsTextArea.setText(""); bugIdTextBox.setText(""); partIdTextBox.setText(""); buildSelector.addItem("Select the build"); suiteSelector.addItem("Select the suite"); poolSelector.addItem("Select the pool"); rwFirmwareSelector.addItem("Select the RW Firmware (Faft only) (Optional)"); roFirmwareSelector.addItem("Select the RO Firmware (Faft only) (Optional)"); for (String suite : suiteNames) { suiteSelector.addItem(suite); } loadBoards(); loadPools(); addWidget(suiteRunnerMainPanel, "view_suite_run"); }; @Override public void initialize() { super.initialize(); boardSelector = new ListBox(); buildSelector = new ListBox(); suiteSelector = new ListBox(); rwFirmwareSelector = new ListBox(); roFirmwareSelector = new ListBox(); poolSelector = new ListBox(); suiteArgsTextArea = new TextArea(); suiteArgsTextArea.getElement().setPropertyString("placeholder", TEST_LIST_PLACEHOLDER); bugIdTextBox = new TextBox(); partIdTextBox = new TextBox(); testArgsTextArea = new TextArea(); testArgsTextArea.getElement().setPropertyString("placeholder", TEST_ARGS_PLACEHOLDER); boardSelector.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { boardSelected(); } }); boardSelector.setStyleName("run_suite_selector"); buildSelector.setEnabled(false); buildSelector.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { buildSelected(); } }); buildSelector.setStyleName("run_suite_selector"); suiteSelector.setEnabled(false); suiteSelector.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { suiteSelected(); } }); suiteSelector.setStyleName("run_suite_selector"); rwFirmwareSelector.setEnabled(false); rwFirmwareSelector.setStyleName("run_suite_selector"); roFirmwareSelector.setEnabled(false); roFirmwareSelector.setStyleName("run_suite_selector"); poolSelector.setEnabled(false); poolSelector.setStyleName("run_suite_selector"); suiteArgsTextArea.setStyleName("run_suite_test_args"); testArgsTextArea.setStyleName("run_suite_test_args"); bugIdTextBox.setStyleName("run_suite_avl_args"); partIdTextBox.setStyleName("run_suite_avl_args"); HorizontalPanel firstLine = createHorizontalLineItem("Select board:", boardSelector); HorizontalPanel secondLine = createHorizontalLineItem("Select build:", buildSelector); HorizontalPanel thirdLine = createHorizontalLineItem("Select suite:", suiteSelector); thirdOptionalLine = createHorizontalLineItem("Only run specified tests (Optional):", suiteArgsTextArea); thirdOptionalLine.setVisible(false); fourthOptionalLine = createHorizontalLineItem("AVL process bug ID:", bugIdTextBox); fourthOptionalLine.setVisible(false); fifthOptionalLine = createHorizontalLineItem("AVL part number:", partIdTextBox); fifthOptionalLine.setVisible(false); sixthOptionalLine = createHorizontalLineItem("Test args:", testArgsTextArea); sixthOptionalLine.setVisible(false); HorizontalPanel fourthLine = createHorizontalLineItem("RW Firmware (Optional):", rwFirmwareSelector); HorizontalPanel fifthLine = createHorizontalLineItem("RO Firmware (Optional):", roFirmwareSelector); HorizontalPanel sixthLine = createHorizontalLineItem("Pool (Optional):", poolSelector); actionButton = new Button("Run Suite", new ClickHandler() { public void onClick(ClickEvent event) { int boardSelection = boardSelector.getSelectedIndex(); int buildSelection = buildSelector.getSelectedIndex(); int suiteSelection = suiteSelector.getSelectedIndex(); int poolSelection = poolSelector.getSelectedIndex(); int rwFirmwareSelection = rwFirmwareSelector.getSelectedIndex(); int roFirmwareSelection = roFirmwareSelector.getSelectedIndex(); if (boardSelection != 0 && buildSelection != 0 && suiteSelection != 0) { String poolLabel = new String(); if (poolSelection != 0) { poolLabel = poolSelector.getItemText(poolSelection); } String rwFirmware = new String(); if (rwFirmwareSelection != 0) { rwFirmware = rwFirmwareSelector.getItemText(rwFirmwareSelection); } String roFirmware = new String(); if (roFirmwareSelection != 0) { roFirmware = roFirmwareSelector.getItemText(roFirmwareSelection); } runSuite(getSelectedBoard(), boardSelector.getItemText(boardSelection), buildSelector.getItemText(buildSelection), suiteSelector.getItemText(suiteSelection), poolLabel, rwFirmware, roFirmware, suiteArgsTextArea.getText(), testArgsTextArea.getText(), bugIdTextBox.getText(), partIdTextBox.getText()); } else { Window.alert("You have to select a valid board, build and suite."); } }}); actionButton.setEnabled(false); actionButton.setStyleName("run_suite_button"); HorizontalPanel seventhLine = createHorizontalLineItem("", actionButton); suiteRunnerMainPanel = new VerticalPanel(); suiteRunnerMainPanel.add(firstLine); suiteRunnerMainPanel.add(secondLine); suiteRunnerMainPanel.add(thirdLine); suiteRunnerMainPanel.add(thirdOptionalLine); suiteRunnerMainPanel.add(fourthOptionalLine); suiteRunnerMainPanel.add(fifthOptionalLine); suiteRunnerMainPanel.add(sixthOptionalLine); suiteRunnerMainPanel.add(fourthLine); suiteRunnerMainPanel.add(fifthLine); suiteRunnerMainPanel.add(sixthLine); suiteRunnerMainPanel.add(seventhLine); } private HorizontalPanel createHorizontalLineItem(String label, Widget item) { HorizontalPanel panel = new HorizontalPanel(); panel.add(contstructLabel(label)); panel.add(item); return panel; } private Label contstructLabel(String labelName) { Label label = new Label(labelName); label.setStyleName("run_suite_label"); return label; } private void suiteSelected() { int selectedIndex = suiteSelector.getSelectedIndex(); if (selectedIndex != 0) { actionButton.setEnabled(true); } // Account for their being an extra item in the drop down int listIndex = selectedIndex - 1; if (listIndex == suiteNames.indexOf("faft_setup") || listIndex == suiteNames.indexOf("faft_bios") || listIndex == suiteNames.indexOf("faft_ec")) { loadFirmwareBuilds(getSelectedBoard()); } else { rwFirmwareSelector.setEnabled(false); roFirmwareSelector.setEnabled(false); rwFirmwareSelector.setSelectedIndex(0); roFirmwareSelector.setSelectedIndex(0); } if (listIndex == suiteNames.indexOf("gts") || listIndex == suiteNames.indexOf("cts_N") || listIndex == suiteNames.indexOf("cts_P")) { thirdOptionalLine.setVisible(true); fourthOptionalLine.setVisible(false); fifthOptionalLine.setVisible(false); sixthOptionalLine.setVisible(false); } else if (isAvlSuite(suiteNames.get(listIndex))) { thirdOptionalLine.setVisible(false); fourthOptionalLine.setVisible(true); fifthOptionalLine.setVisible(true); sixthOptionalLine.setVisible(false); } else if(listIndex == suiteNames.indexOf("power_measurement_wrapper") || listIndex == suiteNames.indexOf("wifi_matfunc") || listIndex == suiteNames.indexOf("wifi_perf")) { thirdOptionalLine.setVisible(false); fourthOptionalLine.setVisible(false); fifthOptionalLine.setVisible(false); sixthOptionalLine.setVisible(true); } else { suiteArgsTextArea.setText(""); thirdOptionalLine.setVisible(false); fourthOptionalLine.setVisible(false); fifthOptionalLine.setVisible(false); sixthOptionalLine.setVisible(false); } } private void buildSelected() { int selectedIndex = buildSelector.getSelectedIndex(); if (selectedIndex != 0) { suiteSelector.setEnabled(true); } } private void boardSelected() { suiteSelector.setEnabled(false); actionButton.setEnabled(false); String selectedBoard = getSelectedBoard(); if (selectedBoard != null) { loadBuilds(selectedBoard); } } private String getSelectedBoard() { int selectedIndex = boardSelector.getSelectedIndex(); if (selectedIndex != 0) { String model = boardSelector.getItemText(selectedIndex); return modelBoardMap.get(model); } else { return null; } } /** * Call an RPC to get the boards that are connected to the moblab and populate them in the * dropdown. */ private void loadBoards() { boardSelector.setEnabled(false); boardSelector.clear(); boardSelector.addItem("Select the board"); MoblabRpcHelper.fetchConnectedBoards(new MoblabRpcCallbacks.FetchConnectedBoardsCallback() { @Override public void onFetchConnectedBoardsSubmitted( List connectedBoards) { modelBoardMap = new HashMap(); for (ConnectedBoard connectedBoard : connectedBoards) { // remember the board that goes with this model modelBoardMap.put( connectedBoard.getModel(), connectedBoard.getBoard()); boardSelector.addItem(connectedBoard.getModel()); } boardSelector.setEnabled(true); } }); } /** * Call an RPC to get the pools that are configured on the devices connected to the moblab. * and fill in the . */ private void loadPools() { poolSelector.setEnabled(false); poolSelector.clear(); poolSelector.addItem("Select a pool"); MoblabRpcHelper.fetchConnectedPools(new MoblabRpcCallbacks.FetchConnectedPoolsCallback() { @Override public void onFetchConnectedPoolsSubmitted(List connectedPools) { for (String connectedPool : connectedPools) { poolSelector.addItem(connectedPool); } poolSelector.setEnabled(true); } }); } /** * Make a RPC to get the most recent builds available for the specified board and populate them * in the dropdown. * @param selectedBoard */ private void loadBuilds(String selectedBoard) { buildSelector.setEnabled(false); buildSelector.clear(); buildSelector.addItem("Select the build"); MoblabRpcHelper.fetchBuildsForBoard(selectedBoard, new MoblabRpcCallbacks.FetchBuildsForBoardCallback() { @Override public void onFetchBuildsForBoardCallbackSubmitted(List boards) { for (String board : boards) { buildSelector.addItem(board); } buildSelector.setEnabled(true); } }); } /** * Make a RPC to get the most recent firmware available for the specified board and populate them * in the dropdowns. * @param selectedBoard */ private void loadFirmwareBuilds(String selectedBoard) { rwFirmwareSelector.setEnabled(false); roFirmwareSelector.setEnabled(false); rwFirmwareSelector.clear(); roFirmwareSelector.clear(); rwFirmwareSelector.addItem("Select the RW Firmware (Faft only) (Optional)"); roFirmwareSelector.addItem("Select the RO Firmware (Faft only) (Optional)"); MoblabRpcHelper.fetchFirmwareForBoard(selectedBoard, new MoblabRpcCallbacks.FetchFirmwareForBoardCallback() { @Override public void onFetchFirmwareForBoardCallbackSubmitted(List firmwareBuilds) { for (String firmware : firmwareBuilds) { rwFirmwareSelector.addItem(firmware); roFirmwareSelector.addItem(firmware); } rwFirmwareSelector.setEnabled(true); roFirmwareSelector.setEnabled(true); } }); } private boolean isAvlSuite(String suite) { return Arrays.asList("hardware_storagequal", "hardware_storagequal_quick", "hardware_memoryqual").contains(suite); } /** * For the selection option of board, build, suite and pool make a RPC call that will instruct * AFE to run the suite selected. * @param board, a string that specified a device connected to the moblab. * @param model, a string that specifies a device model connected to moblab. * @param build, a string that is a valid build for the specified board available in GCS. * @param suite, a string that specifies the name of a suite selected to run. * @param pool, an optional name of a pool to run the suite in. * @param rwFirmware, an optional firmware to use for some qual tests. * @param roFirmware, an optional firmware to use for some qual tests. * @param suiteArgs, optional params to pass to the suite. * @param testArgs, optional params to pass to tests in the suite. * @param bugId, an optional param indicates the bugnizer ticket for * memory/hardware avl process. Required for AVL suites. * @param partId, an optional param identifies the component involved for * memory/hardware avl process. Required for AVL suites. */ private void runSuite(String board, String model, String build, String suite, String pool, String rwFirmware, String roFirmware, String suiteArgs, String testArgs, String bugId, String partId) { String realPoolLabel = pool; if (pool != null && !pool.isEmpty()) { realPoolLabel = pool.trim(); } // partId, bugId required for avl suites if (isAvlSuite(suite)) { if ((bugId == null || bugId.isEmpty()) || (partId == null || partId.isEmpty())) { Window.alert("Part ID and Bug ID are required for suite " + suite); return; } // bug id is an integer id if (!bugId.matches("\\d+")) { Window.alert("Bug ID must be numeric"); return; } } MoblabRpcHelper.runSuite(board, model, build, suite, realPoolLabel, rwFirmware, roFirmware, suiteArgs, testArgs, bugId, partId, new RunSuiteCallback() { @Override public void onRunSuiteComplete() { Window.Location.assign("/afe"); } }); }; }