1 package com.simpligility.maven.plugins.android; 2 3 import com.android.ddmlib.IDevice; 4 import com.android.ddmlib.testrunner.ITestRunListener; 5 import com.android.ddmlib.testrunner.TestIdentifier; 6 import org.apache.commons.lang3.RandomStringUtils; 7 import org.apache.commons.lang3.RandomUtils; 8 import org.apache.maven.plugin.logging.SystemStreamLog; 9 import org.easymock.EasyMockRunner; 10 import org.easymock.Mock; 11 import org.junit.Before; 12 import org.junit.Rule; 13 import org.junit.Test; 14 import org.junit.rules.TemporaryFolder; 15 import org.junit.runner.RunWith; 16 import org.xml.sax.SAXException; 17 18 import javax.xml.XMLConstants; 19 import javax.xml.transform.stream.StreamSource; 20 import javax.xml.validation.Schema; 21 import javax.xml.validation.SchemaFactory; 22 import javax.xml.validation.Validator; 23 import java.io.File; 24 import java.io.IOException; 25 import java.util.Collections; 26 27 import static org.easymock.EasyMock.*; 28 import static org.junit.Assert.assertEquals; 29 import static org.junit.Assert.assertTrue; 30 31 @RunWith(EasyMockRunner.class) 32 public class AndroidTestRunListenerTest 33 { 34 35 @Mock 36 private IDevice device; 37 38 private final String suffix = RandomStringUtils.randomAlphabetic( 10 ); 39 private final String serial = RandomStringUtils.randomAlphabetic( 10 ); 40 private final String avd = RandomStringUtils.randomAlphabetic( 10 ); 41 private final String manufacturer = RandomStringUtils.randomAlphabetic( 10 ); 42 private final String model = RandomStringUtils.randomAlphabetic( 10 ); 43 private final String runName = RandomStringUtils.randomAlphabetic( 10 ); 44 private final String key = RandomStringUtils.randomAlphabetic( 10 ); 45 private final String value = RandomStringUtils.randomAlphabetic( 10 ); 46 private final int count = RandomUtils.nextInt( 1, 10 ); 47 private final int elapsed = RandomUtils.nextInt( 10, 1000 ); 48 49 @Rule 50 public TemporaryFolder target = new TemporaryFolder(); 51 52 @Before 53 public void setUp() throws Exception 54 { 55 expect( device.getSerialNumber() ).andReturn( serial ).anyTimes(); 56 expect( device.getAvdName() ).andReturn( avd ).anyTimes(); 57 expect( device.getProperty( "ro.product.manufacturer" ) ).andReturn( manufacturer ).anyTimes(); 58 expect( device.getProperty( "ro.product.model" ) ).andReturn( model ).anyTimes(); 59 expect( device.getProperties() ).andReturn( Collections.singletonMap( key, value ) ).anyTimes(); 60 } 61 62 private String randomTrace() { 63 return RandomStringUtils.randomAlphabetic( 20 ) + ":" + RandomStringUtils.randomAlphabetic( 20 ); 64 } 65 66 @Test 67 public void validReport() 68 { 69 replay( device ); 70 71 final ITestRunListener listener = new AndroidTestRunListener( device, new SystemStreamLog(), true, false, null, suffix, target.getRoot() ); 72 listener.testRunStarted( runName, count ); 73 74 final int tests = RandomUtils.nextInt( 5, 10 ); 75 for (int i = 0; i < tests; i++) 76 { 77 final TestIdentifier id = new TestIdentifier( RandomStringUtils.randomAlphabetic( 20 ), RandomStringUtils.randomAlphabetic( 10 ) ); 78 listener.testStarted( id ); 79 switch (RandomUtils.nextInt( 0, 4 )) 80 { 81 case 0: 82 listener.testFailed( id, randomTrace()); 83 break; 84 case 1: 85 listener.testAssumptionFailure( id, randomTrace() ); 86 break; 87 case 2: 88 listener.testIgnored( id ); 89 } 90 listener.testEnded( id, Collections.<String, String>emptyMap() ); 91 } 92 93 if (RandomUtils.nextInt( 0, 1 ) == 1) 94 { 95 listener.testRunFailed( RandomStringUtils.randomAlphabetic( 20 ) ); 96 } 97 listener.testRunEnded( elapsed, Collections.<String, String>emptyMap() ); 98 99 verify( device ); 100 101 assertEquals( 1, target.getRoot().listFiles().length ); 102 assertEquals( 1, target.getRoot().listFiles()[0].listFiles().length ); 103 for (File file : target.getRoot().listFiles()[0].listFiles()) 104 { 105 assertTrue( validateXMLSchema( "surefire/surefire-test-report.xsd", file ) ); 106 } 107 } 108 109 public boolean validateXMLSchema( String xsdResource, File xmlFile ) 110 { 111 try 112 { 113 final SchemaFactory factory = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI ); 114 final Schema schema = factory.newSchema( new StreamSource( getClass().getClassLoader().getResourceAsStream( xsdResource ) ) ); 115 final Validator validator = schema.newValidator(); 116 validator.validate( new StreamSource( xmlFile ) ); 117 } catch (IOException | SAXException e) 118 { 119 e.printStackTrace(); 120 return false; 121 } 122 return true; 123 } 124 }