Home | History | Annotate | Download | only in targetprep
      1 /*
      2  * Copyright (C) 2010 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 
     17 package com.android.tradefed.targetprep;
     18 
     19 import com.android.tradefed.targetprep.FlashingResourcesParser.AndroidInfo;
     20 import com.android.tradefed.targetprep.FlashingResourcesParser.Constraint;
     21 import com.android.tradefed.util.FileUtil;
     22 import com.android.tradefed.util.MultiMap;
     23 
     24 import junit.framework.TestCase;
     25 
     26 import java.io.BufferedReader;
     27 import java.io.File;
     28 import java.io.IOException;
     29 import java.io.StringReader;
     30 import java.util.Collection;
     31 import java.util.HashMap;
     32 import java.util.List;
     33 import java.util.Map;
     34 
     35 /**
     36  * Unit tests for {@link FlashingResourcesParser}.
     37  */
     38 public class FlashingResourcesParserTest extends TestCase {
     39 
     40     private static class Under3Chars implements Constraint {
     41         @Override
     42         public boolean shouldAccept(String item) {
     43             return item.length() < 3;
     44         }
     45     }
     46 
     47     /**
     48      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
     49      * data correctly.
     50      */
     51     public void testParseAndroidInfo() throws IOException {
     52         final String validInfoData = "require board=board1|board2\n" + // valid
     53                 "require version-bootloader=1.0.1\n" + // valid
     54                 "cylon=blah\n" + // valid
     55                 "blah"; // not valid
     56         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
     57         AndroidInfo fullInfo = FlashingResourcesParser.parseAndroidInfo(reader, null);
     58         MultiMap<String, String> result = fullInfo.get(null);
     59 
     60         assertEquals(3, result.size());
     61         List<String> boards = result.get(FlashingResourcesParser.BOARD_KEY);
     62         assertEquals(2, boards.size());
     63         assertEquals("board1", boards.get(0));
     64         assertEquals("board2", boards.get(1));
     65         List<String> bootloaders = result.get(FlashingResourcesParser.BOOTLOADER_VERSION_KEY);
     66         assertEquals("1.0.1", bootloaders.get(0));
     67     }
     68 
     69     /**
     70      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
     71      * data correctly.
     72      */
     73     public void testParseAndroidInfo_withConstraint() throws IOException {
     74         final String validInfoData = "require board=board1|board2\n" +
     75                 "require version-bootloader=1.0.1\n" +
     76                 "require version-baseband=abcde|fg|hijkl|m\n";
     77         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
     78         Map<String, Constraint> constraintMap = new HashMap<String, Constraint>(1);
     79         constraintMap.put(FlashingResourcesParser.BASEBAND_VERSION_KEY, new Under3Chars());
     80 
     81         AndroidInfo fullInfo = FlashingResourcesParser.parseAndroidInfo(reader, constraintMap);
     82         MultiMap<String, String> result = fullInfo.get(null);
     83 
     84         assertEquals(3, result.size());
     85         List<String> boards = result.get(FlashingResourcesParser.BOARD_KEY);
     86         assertEquals(2, boards.size());
     87         assertEquals("board1", boards.get(0));
     88         assertEquals("board2", boards.get(1));
     89         List<String> bootloaders = result.get(FlashingResourcesParser.BOOTLOADER_VERSION_KEY);
     90         assertEquals("1.0.1", bootloaders.get(0));
     91         List<String> radios = result.get(FlashingResourcesParser.BASEBAND_VERSION_KEY);
     92         assertEquals(2, radios.size());
     93         assertEquals("fg", radios.get(0));
     94         assertEquals("m", radios.get(1));
     95     }
     96 
     97     /**
     98      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
     99      * data correctly.
    100      *
    101      * When both 'require board=foo' and 'require product=bar' lines are present, the board line
    102      * should supercede the product line
    103      */
    104     public void testParseAndroidInfo_boardAndProduct() throws Exception {
    105         final String validInfoData = "require product=alpha|beta\n" +
    106                 "require board=gamma|delta";
    107         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    108 
    109         IFlashingResourcesParser parser = new FlashingResourcesParser(reader);
    110         Collection<String> reqBoards = parser.getRequiredBoards();
    111         assertEquals(2, reqBoards.size());
    112         assertTrue(reqBoards.contains("gamma"));
    113         assertTrue(reqBoards.contains("delta"));
    114     }
    115 
    116     /**
    117      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
    118      * data correctly.
    119      */
    120     public void testParseAndroidInfo_onlyBoard() throws Exception {
    121         final String validInfoData = "require board=gamma|delta";
    122         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    123 
    124         IFlashingResourcesParser parser = new FlashingResourcesParser(reader);
    125         Collection<String> reqBoards = parser.getRequiredBoards();
    126         assertEquals(2, reqBoards.size());
    127         assertTrue(reqBoards.contains("gamma"));
    128         assertTrue(reqBoards.contains("delta"));
    129     }
    130 
    131     /**
    132      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
    133      * data correctly.
    134      *
    135      * When only 'require product=bar' line is present, it should be passed out in lieu of the
    136      * (missing) board line.
    137      */
    138     public void testParseAndroidInfo_onlyProduct() throws Exception {
    139         final String validInfoData = "require product=alpha|beta";
    140         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    141 
    142         IFlashingResourcesParser parser = new FlashingResourcesParser(reader);
    143         Collection<String> reqBoards = parser.getRequiredBoards();
    144         assertEquals(2, reqBoards.size());
    145         assertTrue(reqBoards.contains("alpha"));
    146         assertTrue(reqBoards.contains("beta"));
    147     }
    148 
    149     /**
    150      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
    151      * data correctly.
    152      *
    153      * In particular, this tests that the "require-for-product:(productName)" requirement is parsed
    154      * properly and causes the expected internal state.
    155      */
    156     public void testRequireForProduct_internalState() throws Exception {
    157         final String validInfoData =
    158                 "require product=alpha|beta|gamma\n" +
    159                 "require version-bootloader=1234\n" +
    160                 "require-for-product:gamma " +
    161                     "version-bootloader=istanbul|constantinople\n";
    162         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    163 
    164         // Verify parsing for the first line
    165         AndroidInfo fullInfo = FlashingResourcesParser.parseAndroidInfo(reader, null);
    166         // 1 for global reqs, 1 for gamma-specific reqs
    167         assertEquals(2, fullInfo.size());
    168 
    169         MultiMap<String, String> globalReqs = fullInfo.get(null);
    170         assertEquals(2, globalReqs.size());
    171         List<String> products = globalReqs.get(FlashingResourcesParser.PRODUCT_KEY);
    172         assertEquals(3, products.size());
    173         assertEquals("alpha", products.get(0));
    174         assertEquals("beta", products.get(1));
    175         assertEquals("gamma", products.get(2));
    176         List<String> bootloaders = globalReqs.get(FlashingResourcesParser.BOOTLOADER_VERSION_KEY);
    177         assertEquals("1234", bootloaders.get(0));
    178 
    179         MultiMap<String, String> gammaReqs = fullInfo.get("gamma");
    180         assertNotNull(gammaReqs);
    181         assertEquals(1, gammaReqs.size());
    182         List<String> gammaBoot = gammaReqs.get("version-bootloader");
    183         assertEquals(2, gammaBoot.size());
    184         assertEquals("istanbul", gammaBoot.get(0));
    185         assertEquals("constantinople", gammaBoot.get(1));
    186     }
    187 
    188     /**
    189      * Test that {@link FlashingResourcesParser#parseAndroidInfo(BufferedReader, Map)} parses valid
    190      * data correctly.
    191      *
    192      * In particular, this tests that the "require-for-product:(productName)" requirement is parsed
    193      * properly and causes the expected internal state.
    194      */
    195     public void testRequireForProduct_api() throws Exception {
    196         final String validInfoData =
    197                 "require product=alpha|beta|gamma\n" +
    198                 "require version-bootloader=1234\n" +
    199                 "require-for-product:gamma " +
    200                     "version-bootloader=istanbul|constantinople\n";
    201         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    202         IFlashingResourcesParser parser = new FlashingResourcesParser(reader);
    203         assertEquals("1234", parser.getRequiredImageVersion("version-bootloader"));
    204         assertEquals("1234", parser.getRequiredImageVersion("version-bootloader", null));
    205         assertEquals("1234", parser.getRequiredImageVersion("version-bootloader", "alpha"));
    206         assertEquals("istanbul", parser.getRequiredImageVersion("version-bootloader", "gamma"));
    207     }
    208 
    209     /**
    210      * Test {@link FlashingResourcesParser#getBuildRequirements(File, Map)} when passed a
    211      * file that is not a zip.
    212      */
    213     public void testGetBuildRequirements_notAZip() throws IOException {
    214         File badFile = FileUtil.createTempFile("foo", ".zip");
    215         try {
    216             new FlashingResourcesParser(badFile);
    217             fail("TargetSetupError not thrown");
    218         } catch (TargetSetupError e) {
    219             // expected
    220         } finally {
    221             badFile.delete();
    222         }
    223     }
    224 
    225     /**
    226      * Test {@link FlashingResourcesParser#getRequiredImageVersion(String, String)} to make sure
    227      * the latest version is returned when multiple valid version exist.
    228      */
    229     public void testGetRequiredImageVersion() throws Exception {
    230         final String validInfoData =
    231             "require product=alpha|beta|gamma\n" +
    232             "require version-bootloader=1234|5678|3456\n" +
    233             "require-for-product:beta " +
    234                 "version-bootloader=ABCD|CDEF|EFGH\n" +
    235             "require-for-product:gamma " +
    236                 "version-bootloader=efgh|cdef|abcd\n";
    237         BufferedReader reader = new BufferedReader(new StringReader(validInfoData));
    238         IFlashingResourcesParser parser = new FlashingResourcesParser(reader);
    239         assertEquals("5678", parser.getRequiredImageVersion("version-bootloader"));
    240         assertEquals("5678", parser.getRequiredImageVersion("version-bootloader", null));
    241         assertEquals("5678", parser.getRequiredImageVersion("version-bootloader", "alpha"));
    242         assertEquals("EFGH", parser.getRequiredImageVersion("version-bootloader", "beta"));
    243         assertEquals("efgh", parser.getRequiredImageVersion("version-bootloader", "gamma"));
    244         assertNull(parser.getRequiredImageVersion("version-baseband"));
    245     }
    246 }
    247