Skip to content

Commit 79e5daf

Browse files
committed
handle Local tunnel initiation and test context
1 parent 0423a85 commit 79e5daf

26 files changed

+286
-267
lines changed

config/cross.testng.xml

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,42 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
3-
<suite name="Cross-Platform">
3+
<suite name="Cross-Platform" thread-count="3" parallel="tests">
4+
<parameter name="config" value="cross.conf.json"/>
45
<listeners>
5-
<listener class-name="XMLSuiteClassInterceptor"/>
6+
<listener class-name="AlterSuiteClassInterceptor"/>
7+
<listener class-name="SuiteClassIntercepter"/>
68
</listeners>
7-
<test name="PoolTest1" parallel="classes" thread-count="2">
9+
<test name="PoolTest0">
10+
<classes>
11+
<class name="com.browserstack.suite.SuiteTest01" />
12+
<class name="com.browserstack.suite.SuiteTest02" />
13+
</classes>
14+
</test>
15+
<test name="PoolTest1">
16+
<classes>
17+
<class name="com.browserstack.suite.SuiteTest03" />
18+
<class name="com.browserstack.suite.SuiteTest04" />
19+
</classes>
20+
</test>
21+
<test name="PoolTest2">
22+
<parameter name="config" value="cross.conf.json"/>
23+
<classes>
24+
<class name="com.browserstack.suite.SuiteTest05" />
25+
<class name="com.browserstack.suite.SuiteTest06" />
26+
</classes>
27+
</test>
28+
<test name="PoolTest3">
829
<parameter name="config" value="cross.conf.json"/>
930
<classes>
10-
<class name="com.browserstack.suite.SuiteTest01"/>
31+
<class name="com.browserstack.suite.SuiteTest07" />
32+
<class name="com.browserstack.suite.SuiteTest08" />
1133
</classes>
1234
</test>
13-
<test name="PoolTest2" parallel="classes" thread-count="2">
35+
<test name="PoolTest4">
1436
<parameter name="config" value="cross.conf.json"/>
1537
<classes>
16-
<class name="com.browserstack.suite.SuiteTest01"/>
17-
<class name="com.browserstack.suite.SuiteTest02"/>
38+
<class name="com.browserstack.suite.SuiteTest09" />
39+
<class name="com.browserstack.suite.SuiteTest10" />
1840
</classes>
1941
</test>
2042
</suite>
21-

config/local.testng.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
33
<suite name="Local">
4+
<parameter name="config" value="local.conf.json"/>
5+
<listeners>
6+
<listener class-name="SuiteClassIntercepter"/>
7+
</listeners>
48
<test name="LocalTest">
5-
<parameter name="config" value="local.conf.json"/>
6-
<parameter name="environment" value="chrome"/>
9+
<parameter name="platform" value="0"/>
710
<classes>
811
<class name="com.browserstack.LocalTest"/>
912
</classes>

config/parallel.testng.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
33
<suite name="Parallel" thread-count="3" parallel="tests">
4+
<parameter name="config" value="parallel.conf.json"/>
5+
<listeners>
6+
<listener class-name="SuiteClassIntercepter"/>
7+
</listeners>
48
<test name="SingleTestEnv1">
5-
<parameter name="config" value="parallel.conf.json"/>
6-
<parameter name="environment" value="env1"/>
9+
<parameter name="platform" value="0"/>
710
<classes>
811
<class name="com.browserstack.SingleTest"/>
912
</classes>
1013
</test>
1114

1215
<test name="SingleTestEnv2">
13-
<parameter name="config" value="parallel.conf.json"/>
14-
<parameter name="environment" value="env2"/>
16+
<parameter name="platform" value="1"/>
1517
<classes>
1618
<class name="com.browserstack.SingleTest"/>
1719
</classes>
1820
</test>
1921

2022
<test name="SingleTestEnv3">
21-
<parameter name="config" value="parallel.conf.json"/>
22-
<parameter name="environment" value="env3"/>
23+
<parameter name="platform" value="2"/>
2324
<classes>
2425
<class name="com.browserstack.SingleTest"/>
2526
</classes>

config/single.testng.xml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
33
<suite name="Single">
4+
<parameter name="config" value="single.conf.json"/>
5+
<listeners>
6+
<listener class-name="SuiteClassIntercepter"/>
7+
</listeners>
48
<test name="SingleTest">
5-
<parameter name="config" value="single.conf.json"/>
6-
<parameter name="environment" value="chrome"/>
9+
<parameter name="platform" value="0"/>
710
<classes>
811
<class name="com.browserstack.SingleTest"/>
912
</classes>

pom.xml

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,20 @@
1414
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1515
<maven.compiler.source>1.6</maven.compiler.source>
1616
<maven.compiler.target>1.6</maven.compiler.target>
17+
<testng.version>7.4.0</testng.version>
1718
<surefire.version>2.19.1</surefire.version>
18-
19-
<test.file></test.file>
19+
<selenium.version>3.141.59</selenium.version>
20+
<json-simple.version>1.1.1</json-simple.version>
21+
<browserstack-local-java.version>1.0.6</browserstack-local-java.version>
22+
<test.file/>
2023
<config.file>default</config.file>
2124
</properties>
2225

2326
<dependencies>
2427
<dependency>
2528
<groupId>org.testng</groupId>
2629
<artifactId>testng</artifactId>
27-
<version>6.9.10</version>
30+
<version>${testng.version}</version>
2831
</dependency>
2932
<dependency>
3033
<groupId>commons-io</groupId>
@@ -34,17 +37,17 @@
3437
<dependency>
3538
<groupId>org.seleniumhq.selenium</groupId>
3639
<artifactId>selenium-java</artifactId>
37-
<version>3.12.0</version>
40+
<version>${selenium.version}</version>
3841
</dependency>
3942
<dependency>
4043
<groupId>com.browserstack</groupId>
4144
<artifactId>browserstack-local-java</artifactId>
42-
<version>1.0.3</version>
45+
<version>${browserstack-local-java.version}</version>
4346
</dependency>
4447
<dependency>
4548
<groupId>com.googlecode.json-simple</groupId>
4649
<artifactId>json-simple</artifactId>
47-
<version>1.1.1</version>
50+
<version>${json-simple.version}</version>
4851
</dependency>
4952
</dependencies>
5053

@@ -53,7 +56,7 @@
5356
<plugin>
5457
<groupId>org.apache.maven.plugins</groupId>
5558
<artifactId>maven-surefire-plugin</artifactId>
56-
<version>2.18.1</version>
59+
<version>${surefire.version}</version>
5760
</plugin>
5861
<plugin>
5962
<groupId>org.apache.maven.plugins</groupId>
@@ -117,7 +120,6 @@
117120
</plugins>
118121
</build>
119122
</profile>
120-
121123
<profile>
122124
<id>suite</id>
123125
<build>
@@ -141,11 +143,19 @@
141143
<plugin>
142144
<groupId>org.apache.maven.plugins</groupId>
143145
<artifactId>maven-surefire-plugin</artifactId>
146+
<version>2.19.1</version>
144147
<configuration>
145148
<suiteXmlFiles>
146149
<suiteXmlFile>config/cross.testng.xml</suiteXmlFile>
147150
</suiteXmlFiles>
148151
</configuration>
152+
<dependencies>
153+
<dependency>
154+
<groupId>org.aspectj</groupId>
155+
<artifactId>aspectjweaver</artifactId>
156+
<version>1.9.6</version>
157+
</dependency>
158+
</dependencies>
149159
</plugin>
150160
</plugins>
151161
</build>
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import org.json.simple.JSONArray;
2+
import org.json.simple.JSONObject;
3+
import org.json.simple.parser.JSONParser;
4+
import org.json.simple.parser.ParseException;
5+
import org.testng.IAlterSuiteListener;
6+
import org.testng.xml.XmlSuite;
7+
import org.testng.xml.XmlTest;
8+
9+
import java.io.FileReader;
10+
import java.io.IOException;
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.concurrent.CopyOnWriteArrayList;
14+
15+
public class AlterSuiteClassInterceptor implements IAlterSuiteListener {
16+
17+
@Override
18+
public void alter(List<XmlSuite> suites) {
19+
JSONParser parser = new JSONParser();
20+
21+
suites.forEach(suite -> {
22+
int platformLength = 0;
23+
JSONArray platforms;
24+
String configFile = suite.getParameter("config");
25+
try {
26+
JSONObject config = (JSONObject) parser.parse(new FileReader("src/test/resources/conf/" + configFile));
27+
if (!config.isEmpty()) {
28+
platforms = (JSONArray) config.get("platforms");
29+
platformLength = platforms.size();
30+
}
31+
} catch (IOException | ParseException e) {
32+
throw new RuntimeException(e);
33+
}
34+
int finalPlatformLength = platformLength;
35+
modifySuiteXML(suite, finalPlatformLength);
36+
});
37+
38+
}
39+
40+
private static void modifySuiteXML(XmlSuite suite, int numberOfPlatforms) {
41+
List<XmlTest> xmlTests = suite.getTests();
42+
List<XmlTest> xmlTests1 = new CopyOnWriteArrayList<>();
43+
int count = Integer.parseInt(String.valueOf(xmlTests.size()));
44+
for (int i = 0; i < count; i++) {
45+
XmlTest xmlTest = xmlTests.get(i);
46+
for (int j = 0; j < numberOfPlatforms; j++) {
47+
XmlTest xmlTestClone1 = (XmlTest) xmlTest.clone();
48+
xmlTestClone1.setName(xmlTestClone1.getName() + "-" + j);
49+
Map<String, String> map1 = xmlTestClone1.getAllParameters();
50+
map1.put("platform", String.valueOf(j));
51+
xmlTestClone1.setClasses(xmlTests.get(i).getClasses());
52+
xmlTestClone1.setParameters(map1);
53+
xmlTests1.add(xmlTestClone1);
54+
}
55+
}
56+
suite.getChildSuites().forEach(childSuite -> {
57+
if(childSuite.getParallel().toString().equalsIgnoreCase("false")) {
58+
childSuite.setParallel(XmlSuite.ParallelMode.TESTS);
59+
childSuite.setThreadCount(childSuite.getParentSuite().getThreadCount());
60+
}
61+
modifySuiteXML(childSuite, numberOfPlatforms);
62+
});
63+
suite.setTests(xmlTests1);
64+
}
65+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import com.browserstack.local.Local;
2+
import org.json.simple.JSONObject;
3+
import org.json.simple.parser.JSONParser;
4+
import org.testng.ISuite;
5+
import org.testng.ISuiteListener;
6+
7+
import java.io.FileReader;
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
import java.util.Objects;
11+
12+
public class SuiteClassIntercepter implements ISuiteListener {
13+
Local local;
14+
15+
@Override
16+
public void onStart(ISuite iSuite) {
17+
String configFile = iSuite.getParameter("config");
18+
try {
19+
JSONParser parser = new JSONParser();
20+
JSONObject config = (JSONObject) parser.parse(new FileReader("src/test/resources/conf/" + configFile));
21+
Map<String, String> commonCapabilities = (Map<String, String>) config.get("capabilities");
22+
if (commonCapabilities.get("browserstack.local") != null
23+
&& Objects.equals(commonCapabilities.get("browserstack.local"), "true")) {
24+
System.out.println("Starting BrowserStack Local...");
25+
local = new Local();
26+
Map<String, String> options = new HashMap<String, String>();
27+
options.put("key", config.get("key").toString());
28+
if (!local.isRunning()) {
29+
local.start(options);
30+
Runtime.getRuntime().addShutdownHook(new SuiteClassIntercepter.Closer(local));
31+
}
32+
System.out.println("BrowserStack Local Started Successfully.");
33+
}
34+
} catch (Exception e) {
35+
throw new RuntimeException(e);
36+
}
37+
}
38+
39+
@Override
40+
public void onFinish(ISuite iSuite) {
41+
if (local != null) {
42+
try {
43+
local.stop();
44+
} catch (Exception e) {
45+
throw new RuntimeException(e);
46+
}
47+
}
48+
}
49+
50+
private static class Closer extends Thread {
51+
private final Local local;
52+
53+
public Closer(Local local) {
54+
this.local = local;
55+
}
56+
57+
@Override
58+
public void run() {
59+
try {
60+
if (local.isRunning()) {
61+
local.stop();
62+
}
63+
} catch (Exception e) {
64+
e.printStackTrace();
65+
}
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)