2323import static org .testng .Assert .assertEquals ;
2424
2525import java .io .IOException ;
26- import java .net .URL ;
2726import java .util .Properties ;
2827import java .util .Set ;
2928import java .util .concurrent .BlockingQueue ;
3029import java .util .concurrent .LinkedBlockingQueue ;
31- import java .util .concurrent .atomic .AtomicReference ;
3230
3331import org .jclouds .ContextBuilder ;
3432import org .jclouds .concurrent .config .ExecutorServiceModule ;
@@ -59,54 +57,51 @@ static TerremarkECloudClient mockTerremarkECloudClient(String uri) {
5957 .endpoint (uri )
6058 .overrides (overrides )
6159 .modules (modules )
62- .build ( TerremarkECloudApiMetadata . CONTEXT_TOKEN ). getApi ( );
60+ .buildApi ( TerremarkECloudClient . class );
6361 }
6462
6563 String versionXML = "<SupportedVersions><VersionInfo><Version>0.8b-ext2.8</Version><LoginUrl>URLv0.8/login</LoginUrl></VersionInfo></SupportedVersions>" ;
6664
6765 @ Test
6866 public void testLoginSetsContentLength () throws IOException , InterruptedException {
6967 MockWebServer server = new MockWebServer ();
70- AtomicReference <URL > url = setURLReplacingDispatcher (server );
68+ server .play ();
69+ server .setDispatcher (replaceURLWithLocalhostPort (server .getPort ()));
7170 server .enqueue (new MockResponse ().setResponseCode (200 ).setBody (versionXML ));
7271 server .enqueue (new MockResponse ().setResponseCode (200 )
7372 .addHeader ("x-vcloud-authorization" , "cookie" )
7473 .setBody ("<OrgList />" ));
75- server .play ();
76- url .set (server .getUrl ("/" ));
7774
78- TerremarkECloudClient api = mockTerremarkECloudClient (url . get ( ).toString ());
75+ TerremarkECloudClient api = mockTerremarkECloudClient (server . getUrl ( "/" ).toString ());
7976
8077 try {
8178 api .listOrgs ();
82- } finally {
8379 RecordedRequest getVersions = server .takeRequest ();
8480 assertEquals (getVersions .getRequestLine (), "GET /versions HTTP/1.1" );
8581
8682 RecordedRequest login = server .takeRequest ();
8783 assertEquals (login .getRequestLine (), "POST /v0.8/login HTTP/1.1" );
8884 assertEquals (login .getHeader ("Authorization" ), "Basic dXNlcjpwYXNzd29yZA==" );
8985 assertEquals (login .getHeader ("Content-Length" ), "0" );
90-
86+ } finally {
9187 server .shutdown ();
9288 }
9389 }
9490
95- /**
96- * there's no built-in way to defer evaluation of a response header, hence this
97- * method, which allows us to send back links to the mock server.
98- */
99- private AtomicReference <URL > setURLReplacingDispatcher (MockWebServer server ) {
100- final AtomicReference <URL > url = new AtomicReference <URL >();
101-
102- final QueueDispatcher dispatcher = new QueueDispatcher () {
91+ /**
92+ * this pattern is used for HATEOAS or similar apis which return urls for
93+ * further requests. If we don't replace here, the test cannot be bound to
94+ * the same MWS instance as it was created with.
95+ */
96+ private QueueDispatcher replaceURLWithLocalhostPort (final int port ) {
97+ return new QueueDispatcher () {
10398 protected final BlockingQueue <MockResponse > responseQueue = new LinkedBlockingQueue <MockResponse >();
10499
105100 @ Override
106101 public MockResponse dispatch (RecordedRequest request ) throws InterruptedException {
107102 MockResponse response = responseQueue .take ();
108103 if (response .getBody () != null ) {
109- String newBody = new String (response .getBody ()).replace ("URL" , url . get (). toString () );
104+ String newBody = new String (response .getBody ()).replace ("URL" , "http://localhost:" + port + "/" );
110105 response = response .setBody (newBody );
111106 }
112107 return response ;
@@ -117,7 +112,5 @@ public void enqueueResponse(MockResponse response) {
117112 responseQueue .add (response );
118113 }
119114 };
120- server .setDispatcher (dispatcher );
121- return url ;
122115 }
123116}
0 commit comments