Home | History | Annotate | Download | only in xmlgenerator
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.cts.xmlgenerator;
     17 
     18 import java.io.InputStream;
     19 import java.util.Collection;
     20 import java.util.HashMap;
     21 import java.util.Map;
     22 import java.util.Scanner;
     23 
     24 /**
     25  * Parser of test lists that are in the format of:
     26  *
     27  * suite:android.holo.cts
     28  * case:HoloTest
     29  * test:testHolo
     30  * test:testHoloDialog[:timeout_value]
     31  */
     32 class TestListParser {
     33 
     34     public Collection<TestSuite> parse(InputStream input) {
     35         Map<String, TestSuite> suiteMap = new HashMap<String, TestSuite>();
     36         TestSuite currentSuite = null;
     37         TestCase currentCase = null;
     38         Scanner scanner = null;
     39         try {
     40             scanner = new Scanner(input);
     41             while(scanner.hasNextLine()) {
     42                 String line = scanner.nextLine();
     43                 String[] tokens = line.split(":");
     44                 if (tokens.length < 2) {
     45                     continue;
     46                 }
     47 
     48                 String key = tokens[0];
     49                 String value = tokens[1];
     50                 if ("suite".equals(key)) {
     51                     currentSuite = handleSuite(suiteMap, value);
     52                 } else if ("case".equals(key)) {
     53                     currentCase = handleCase(currentSuite, value);
     54                 } else if ("test".equals(key)) {
     55                     int timeout = -1;
     56                     if (tokens.length == 3) {
     57                         timeout = Integer.parseInt(tokens[2]);
     58                     }
     59                     handleTest(currentCase, value, timeout);
     60                 }
     61             }
     62         } finally {
     63             if (scanner != null) {
     64                 scanner.close();
     65             }
     66         }
     67         return suiteMap.values();
     68     }
     69 
     70     private TestSuite handleSuite(Map<String, TestSuite> suiteMap, String fullSuite) {
     71         String[] suites = fullSuite.split("\\.");
     72         int numSuites = suites.length;
     73         TestSuite lastSuite = null;
     74 
     75         for (int i = 0; i < numSuites; i++) {
     76             String name = suites[i];
     77             if (lastSuite != null) {
     78                 if (lastSuite.hasSuite(name)) {
     79                     lastSuite = lastSuite.getSuite(name);
     80                 } else {
     81                     TestSuite newSuite = new TestSuite(name);
     82                     lastSuite.addSuite(newSuite);
     83                     lastSuite = newSuite;
     84                 }
     85             } else if (suiteMap.containsKey(name)) {
     86                 lastSuite = suiteMap.get(name);
     87             } else {
     88                 lastSuite = new TestSuite(name);
     89                 suiteMap.put(name, lastSuite);
     90             }
     91         }
     92 
     93         return lastSuite;
     94     }
     95 
     96     private TestCase handleCase(TestSuite suite, String caseName) {
     97         TestCase testCase = new TestCase(caseName);
     98         suite.addCase(testCase);
     99         return testCase;
    100     }
    101 
    102     private void handleTest(TestCase testCase, String test, int timeout) {
    103         testCase.addTest(test, timeout);
    104     }
    105 }
    106