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 }