Skip to content

Commit 18f0367

Browse files
committed
Let ExpectationServer support specified port
1 parent 96382d8 commit 18f0367

File tree

4 files changed

+56
-16
lines changed

4 files changed

+56
-16
lines changed

core/src/main/java/org/commonjava/test/http/expect/ExpectationServer.java

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import javax.servlet.ServletException;
3333
import java.io.IOException;
3434
import java.io.InputStream;
35+
import java.net.BindException;
3536
import java.net.MalformedURLException;
3637
import java.net.URL;
3738
import java.util.Arrays;
@@ -56,11 +57,25 @@ public ExpectationServer()
5657
this( null );
5758
}
5859

60+
public ExpectationServer( final int port )
61+
{
62+
this( null, port );
63+
}
64+
5965
public ExpectationServer( final String baseResource )
6066
{
6167
servlet = new ExpectationServlet( baseResource );
6268
}
6369

70+
public ExpectationServer( final String baseResource, final int port )
71+
{
72+
servlet = new ExpectationServlet( baseResource );
73+
if ( port >= 80 )
74+
{
75+
this.port = port;
76+
}
77+
}
78+
6479
public int getPort()
6580
{
6681
return port;
@@ -92,25 +107,42 @@ public ExpectationServer start()
92107
final DeploymentManager dm = Servlets.defaultContainer().addDeployment( di );
93108
dm.deploy();
94109

95-
final AtomicReference<Integer> foundPort = new AtomicReference<>();
96-
server = PortFinder.findPortFor( 16, p -> {
97-
foundPort.set( p );
110+
boolean started = false;
111+
if ( this.port != null && this.port >= 80 )
112+
{
98113
try
99114
{
100-
Undertow s = Undertow.builder().setHandler( dm.start() ).addHttpListener( p, "127.0.0.1" ).build();
101-
s.start();
102-
103-
return s;
115+
server = Undertow.builder().setHandler( dm.start() ).addHttpListener( this.port, "127.0.0.1" ).build();
116+
server.start();
117+
started = true;
104118
}
105-
catch ( ServletException e )
119+
catch ( Exception e )
106120
{
107-
throw new IOException( "Failed to start: " + e.getMessage(), e );
121+
logger.warn( "The port {} is occupied, will find another port to try!", this.port );
108122
}
109-
} );
110-
111-
this.port = foundPort.get();
123+
}
124+
if ( !started )
125+
{
126+
final AtomicReference<Integer> foundPort = new AtomicReference<>();
127+
server = PortFinder.findPortFor( 16, p -> {
128+
foundPort.set( p );
129+
try
130+
{
131+
Undertow s = Undertow.builder().setHandler( dm.start() ).addHttpListener( p, "127.0.0.1" ).build();
132+
s.start();
133+
134+
return s;
135+
}
136+
catch ( ServletException e )
137+
{
138+
throw new IOException( "Failed to start: " + e.getMessage(), e );
139+
}
140+
} );
141+
142+
this.port = foundPort.get();
143+
}
112144

113-
logger.info( "STARTED Test HTTP Server on 127.0.0.1:" + port );
145+
logger.info( "STARTED Test HTTP Server on 127.0.0.1:{}", port );
114146

115147
return this;
116148
}

junit5/src/main/java/org/commonjava/test/http/junit5/annotations/Expected.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@
2828
public @interface Expected
2929
{
3030
String base() default "";
31+
32+
int port() default 0;
3133
}

junit5/src/main/java/org/commonjava/test/http/junit5/expect/ExpectationServerExtension.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,16 @@
2121
import org.junit.jupiter.api.extension.BeforeEachCallback;
2222
import org.junit.jupiter.api.extension.ExtensionContext;
2323
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
24+
import org.slf4j.Logger;
25+
import org.slf4j.LoggerFactory;
2426

2527
import java.lang.reflect.Field;
2628

2729
public class ExpectationServerExtension
2830
implements AfterEachCallback, BeforeEachCallback, TestInstancePostProcessor
2931
{
32+
private final Logger logger = LoggerFactory.getLogger( this.getClass() );
33+
3034
private ExpectationServer server;
3135

3236
@SuppressWarnings( "unused" )
@@ -67,10 +71,13 @@ public void postProcessTestInstance( Object testInstance, ExtensionContext conte
6771
{
6872
Expected expected = field.getAnnotation( Expected.class );
6973
String base = expected.base();
70-
this.server = new ExpectationServer( base );
74+
int port = expected.port();
75+
logger.debug( "Found field with @Expected annotation, base resource is {}, port is {}", base, port );
76+
this.server = new ExpectationServer( base, port );
7177
field.setAccessible( true );
7278
if ( field.getType().equals( ExpectationServer.class ) )
7379
{
80+
logger.debug( "Injecting the field {} with server instance", field.getName() );
7481
field.set( testInstance, this.server );
7582
return;
7683
}

junit5/src/test/java/org/commonjava/test/http/junit5/TestHttpServerExtendWithTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,13 @@
3838
public class TestHttpServerExtendWithTest
3939
{
4040
// @RegisterExtension
41-
@Expected( base = "repos" )
41+
@Expected( base = "repos", port = 9090)
4242
private ExpectationServer server;
4343

4444
@Test
4545
public void simpleDownload()
4646
throws Exception
4747
{
48-
// final ExpectationServer server = expected.getServer();
4948
final String subPath = "/path/to/something.txt";
5049
final String content = "this is the content";
5150
final String url = server.formatUrl( subPath );

0 commit comments

Comments
 (0)