View Javadoc
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 }