1package autotest.moblab;
2
3import autotest.common.ui.TabView;
4import autotest.moblab.rpc.MoblabRpcCallbacks;
5import autotest.moblab.rpc.MoblabRpcCallbacks.RunSuiteCallback;
6import autotest.moblab.rpc.MoblabRpcHelper;
7import com.google.gwt.event.dom.client.ChangeEvent;
8import com.google.gwt.event.dom.client.ChangeHandler;
9import com.google.gwt.event.dom.client.ClickEvent;
10import com.google.gwt.event.dom.client.ClickHandler;
11import com.google.gwt.user.client.Window;
12import com.google.gwt.user.client.ui.Button;
13import com.google.gwt.user.client.ui.HasVerticalAlignment;
14import com.google.gwt.user.client.ui.HorizontalPanel;
15import com.google.gwt.user.client.ui.Label;
16import com.google.gwt.user.client.ui.ListBox;
17import com.google.gwt.user.client.ui.SimplePanel;
18import com.google.gwt.user.client.ui.TextArea;
19import com.google.gwt.user.client.ui.VerticalPanel;
20import com.google.gwt.user.client.ui.Widget;
21import java.util.Arrays;
22import java.util.List;
23
24
25/**
26 * Implement a tab to make a very easy way to run the most common moblab suites.
27 */
28public 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