Skip to content

Commit db8d967

Browse files
committed
Get first caffeine.test suite running in CaffeineTests
1 parent 41180ad commit db8d967

File tree

9 files changed

+122
-70
lines changed

9 files changed

+122
-70
lines changed

build.sc

+1
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ object integration extends MillModule{
210210
def testArgs = T{
211211
scalajslib.testArgs() ++
212212
scalaworker.testArgs() ++
213+
Seq("-DMILL_TESTNG=" + testng.runClasspath().map(_.path).mkString(",")) ++
213214
(for((k, v) <- testRepos()) yield s"-D$k=$v")
214215
}
215216
def forkArgs = testArgs()

integration/test/resources/caffeine/build.sc

+9-4
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ trait CaffeineModule extends MavenModule{
1818
MavenRepository("http://repo.spring.io/plugins-release")
1919
)
2020
trait Tests extends super.Tests{
21-
def testFrameworks = Seq("de.johoop.testnginterface.TestNGFramework")
21+
def testFrameworks = Seq("com.novocode.junit.JUnitFramework")
2222
def ivyDeps = Agg(
23-
ivy"de.johoop:sbt-testng-interface_2.12:3.1.1",
23+
ivy"com.novocode:junit-interface:0.11",
2424
libraries.guava,
2525
testLibraries.mockito,
2626
testLibraries.hamcrest,
@@ -82,7 +82,7 @@ object caffeine extends CaffeineModule {
8282
testLibraries.jctools,
8383
testLibraries.guavaTestLib,
8484
) ++
85-
testLibraries.testng
85+
testLibraries.testng
8686
}
8787
}
8888

@@ -97,6 +97,11 @@ object guava extends CaffeineModule {
9797
testLibraries.easymock,
9898
testLibraries.guavaTestLib
9999
)
100+
def forkArgs = Seq(
101+
"-Dguava.osgi.version=" + versions.guava,
102+
"-Dcaffeine.osgi.jar=" + caffeine.jar().path,
103+
"-Dcaffeine-guava.osgi.jar=" + guava.jar().path
104+
)
100105
}
101106
}
102107

@@ -111,7 +116,7 @@ object jcache extends CaffeineModule {
111116
testLibraries.jcacheGuice,
112117
testLibraries.guavaTestLib
113118
) ++
114-
testLibraries.testng
119+
testLibraries.testng
115120
}
116121
}
117122

integration/test/src/mill/integration/CaffeineTests.scala

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class CaffeineTests(fork: Boolean) extends IntegrationTestSuite("MILL_CAFFEINE_R
1010
// type inference issues during the compile
1111
if (mill.client.ClientServer.isJava9OrAbove){
1212
assert(eval(s"caffeine.test.compile"))
13+
assert(eval(s"caffeine.test"))
1314
assert(eval(s"guava.test.compile"))
1415
assert(eval(s"jcache.test.compile"))
1516
assert(eval(s"simulator.test.compile"))

scalalib/src/mill/scalalib/Lib.scala

+6-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package scalalib
33

44
import java.io.{File, FileInputStream}
55
import java.lang.annotation.Annotation
6+
import java.lang.reflect.Modifier
67
import java.util.zip.ZipInputStream
78
import javax.tools.ToolProvider
89

@@ -12,7 +13,6 @@ import coursier.{Cache, Dependency, Fetch, Repository, Resolution}
1213
import mill.Agg
1314
import mill.eval.{PathRef, Result}
1415
import mill.modules.Jvm
15-
1616
import mill.util.Ctx
1717
import sbt.testing._
1818

@@ -293,14 +293,18 @@ object Lib{
293293
case f: SubclassFingerprint =>
294294
!cls.isInterface &&
295295
(f.isModule == cls.getName.endsWith("$")) &&
296-
cl.loadClass(f.superclassName()).isAssignableFrom(cls)
296+
cl.loadClass(f.superclassName()).isAssignableFrom(cls) &&
297+
cls.getConstructors.count(c => c.getParameterCount == 0 && Modifier.isPublic(c.getModifiers)) == 1
298+
297299
case f: AnnotatedFingerprint =>
298300
val annotationCls = cl.loadClass(f.annotationName()).asInstanceOf[Class[Annotation]]
299301
(f.isModule == cls.getName.endsWith("$")) &&
302+
cls.getConstructors.count(c => c.getParameterCount == 0 && Modifier.isPublic(c.getModifiers)) == 1 &&
300303
(
301304
cls.isAnnotationPresent(annotationCls) ||
302305
cls.getDeclaredMethods.exists(_.isAnnotationPresent(annotationCls))
303306
)
307+
304308
}.map { f => (cls, f) }
305309
}
306310
}

testng/src/mill/testng/EventRecorder.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package mill.testng;
22

3-
import org.scalatools.testing.Event;
3+
import sbt.testing.Event;
44
import org.testng.ITestResult;
55
import org.testng.TestListenerAdapter;
66

7-
import org.scalatools.testing.EventHandler;
8-
import org.scalatools.testing.Logger;
7+
import sbt.testing.EventHandler;
8+
import sbt.testing.Logger;
99

1010
import java.util.HashMap;
1111

1212
public class EventRecorder extends TestListenerAdapter {
13-
private HashMap<String, java.util.List<Event>> basket = new HashMap<>();
13+
private final HashMap<String, java.util.List<Event>> basket = new HashMap<>();
1414

1515
String initKey(ITestResult result){
1616
String key = ResultEvent.classNameOf(result);
+37-32
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,45 @@
11

22
package mill.testng;
33

4-
import org.scalatools.testing.Event;
5-
import org.scalatools.testing.Result;
4+
import sbt.testing.*;
65
import org.testng.ITestResult;
76

8-
public class ResultEvent implements Event {
9-
public Result result;
10-
public String testName;
11-
public String description;
12-
public Throwable error;
13-
14-
public ResultEvent(Result result, String testName, String description, Throwable error) {
15-
this.result = result;
16-
this.testName = testName;
17-
this.description = description;
18-
this.error = error;
19-
}
20-
21-
22-
public Result result(){ return result; }
23-
public String testName(){ return testName; }
24-
public String description(){ return description; }
25-
public Throwable error(){ return error; }
26-
27-
static ResultEvent failure(ITestResult result){ return event(Result.Failure, result); }
28-
static ResultEvent skipped(ITestResult result){ return event(Result.Skipped, result); }
29-
static ResultEvent success(ITestResult result){ return event(Result.Success, result); }
30-
31-
static ResultEvent event(Result result, ITestResult testNGResult) {
32-
return new ResultEvent(
33-
result,
34-
testNGResult.getName(),
35-
testNGResult.getName(),
36-
result != Result.Success ? testNGResult.getThrowable() : null
37-
);
7+
public class ResultEvent {
8+
static Event failure(ITestResult result){ return event(Status.Failure, result); }
9+
static Event skipped(ITestResult result){ return event(Status.Skipped, result); }
10+
static Event success(ITestResult result){ return event(Status.Success, result); }
11+
12+
static Event event(Status result, ITestResult testNGResult) {
13+
return new Event() {
14+
public String fullyQualifiedName() {
15+
return testNGResult.getTestClass().getName();
16+
}
17+
18+
public Fingerprint fingerprint() {
19+
return Annotated.instance;
20+
}
21+
22+
public Selector selector() {
23+
return new SuiteSelector();
24+
}
25+
26+
public Status status() {
27+
return result;
28+
}
29+
30+
public OptionalThrowable throwable() {
31+
if (result != Status.Success){
32+
return new OptionalThrowable(testNGResult.getThrowable());
33+
}else {
34+
return new OptionalThrowable();
35+
}
36+
}
37+
38+
@Override
39+
public long duration() {
40+
return testNGResult.getEndMillis() - testNGResult.getStartMillis();
41+
}
42+
};
3843
}
3944
static String classNameOf(ITestResult result){ return result.getTestClass().getName(); }
4045
}

testng/src/mill/testng/TestNGFramework.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,27 @@
22

33

44

5-
import org.scalatools.testing.*;
5+
import sbt.testing.*;
66

77

88
public class TestNGFramework implements Framework {
99
public String name(){ return "TestNG"; }
10-
public Fingerprint[] tests(){
11-
return new Fingerprint[]{
12-
new Annotated("org.testng.annotations.Test")
13-
};
10+
11+
public Fingerprint[] fingerprints() {
12+
return new Fingerprint[]{Annotated.instance};
1413
}
1514

16-
public Runner testRunner(ClassLoader testClassLoader, Logger[] loggers){
17-
return new TestNGRunner(testClassLoader, loggers, sharedState);
15+
@Override
16+
public Runner runner(String[] args, String[] remoteArgs, ClassLoader classLoader) {
17+
return new TestNGRunner(args, remoteArgs, classLoader, sharedState);
1818
}
1919

20+
2021
private TestRunState sharedState = new TestRunState();
2122
}
2223

2324
class Annotated implements AnnotatedFingerprint{
25+
final public static Annotated instance = new Annotated("org.testng.annotations.Test");
2426
String annotationName;
2527
public Annotated(String annotationName) {
2628
this.annotationName = annotationName;

testng/src/mill/testng/TestNGInstance.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package mill.testng;
22

33

4-
import org.scalatools.testing.EventHandler;
5-
import org.scalatools.testing.Logger;
4+
import sbt.testing.Logger;
65

76
import org.testng.CommandLineArgs;
87
import org.testng.TestNG;
+54-19
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,72 @@
11
package mill.testng;
22

3-
import org.scalatools.testing.Fingerprint;
4-
import org.scalatools.testing.Logger;
5-
import org.scalatools.testing.Runner2;
6-
import org.scalatools.testing.EventHandler;
3+
import sbt.testing.*;
74

8-
public class TestNGRunner extends Runner2 {
9-
ClassLoader testClassLoader;
10-
Logger[] loggers;
11-
TestRunState state;
12-
public TestNGRunner(ClassLoader testClassLoader, Logger[] loggers, TestRunState state) {
13-
this.testClassLoader = testClassLoader;
14-
this.loggers = loggers;
15-
this.state = state;
5+
class TestNGTask implements Task {
6+
7+
TaskDef taskDef;
8+
TestNGRunner runner;
9+
public TestNGTask(TaskDef taskDef, TestNGRunner runner){
10+
this.taskDef = taskDef;
11+
this.runner = runner;
1612
}
17-
public void run(String testClassname, Fingerprint fingerprint, EventHandler eventHandler, String[] testOptions) {
13+
14+
@Override
15+
public String[] tags() {
16+
return new String[0];
17+
}
18+
19+
@Override
20+
public Task[] execute(EventHandler eventHandler, Logger[] loggers) {
1821
if (TestRunState.permissionToExecute.tryAcquire()) {
1922
TestNGInstance.start(
2023
TestNGInstance.loggingTo(loggers)
21-
.loadingClassesFrom(testClassLoader)
22-
.using(testOptions)
23-
.storingEventsIn(state.recorder)
24+
.loadingClassesFrom(runner.testClassLoader)
25+
.using(runner.args())
26+
.storingEventsIn(runner.state.recorder)
2427
);
2528

26-
state.testCompletion.countDown();
29+
runner.state.testCompletion.countDown();
2730
}
2831

2932
try{
30-
state.testCompletion.await();
33+
runner.state.testCompletion.await();
3134
}catch(InterruptedException e){
3235
throw new RuntimeException(e);
3336
}
3437

35-
state.recorder.replayTo(eventHandler, testClassname, loggers);
38+
runner.state.recorder.replayTo(eventHandler, taskDef.fullyQualifiedName(), loggers);
39+
return new Task[0];
40+
}
41+
42+
@Override
43+
public TaskDef taskDef() {
44+
return taskDef;
45+
}
46+
}
47+
public class TestNGRunner implements Runner {
48+
ClassLoader testClassLoader;
49+
TestRunState state;
50+
String[] args;
51+
String[] remoteArgs;
52+
public TestNGRunner(String[] args, String[] remoteArgs, ClassLoader testClassLoader, TestRunState state) {
53+
this.testClassLoader = testClassLoader;
54+
this.state = state;
55+
this.args = args;
56+
this.remoteArgs = remoteArgs;
57+
}
58+
59+
public Task[] tasks(TaskDef[] taskDefs) {
60+
Task[] out = new Task[taskDefs.length];
61+
for (int i = 0; i < taskDefs.length; i += 1) {
62+
out[i] = new TestNGTask(taskDefs[i], this);
63+
}
64+
return out;
3665
}
66+
67+
public String done() { return null; }
68+
69+
public String[] remoteArgs() { return remoteArgs; }
70+
71+
public String[] args() { return args; }
3772
}

0 commit comments

Comments
 (0)