Hi Kurchi,
i looked into the change. Today i did run it a few time and it allays
worked. The logic looks straight forward to me.
I would only improve indenting and the try - autoclose for the Server.
The startServer() can be implemented in the constructor. The
server.close() in the exept() method is not required due to the
autoclose and this saves a few parameters here and there.
cheers
Andreas
Here my diff on your patch change:
diff --git a/test/java/net/Authenticator/B4769350.java
b/test/java/net/Authenticator/B4769350.java
--- a/test/java/net/Authenticator/B4769350.java
+++ b/test/java/net/Authenticator/B4769350.java
@@ -55,7 +55,7 @@
}
}
- static class Client extends Thread {
+ static class Client extends Thread {
String authority, path;
boolean allowerror;
@@ -74,7 +74,7 @@
InputStream is = urlc.getInputStream();
read (is);
is.close();
- } catch (URISyntaxException e) {
+ } catch (URISyntaxException e) {
System.out.println (e);
error = true;
} catch (IOException e) {
@@ -94,11 +94,7 @@
CyclicBarrier t1Cond1;
CyclicBarrier t1Cond2;
- public String getAddress() {
- return server.getAddress().getHostName();
- }
-
- public void startServer() {
+ public Server() {
InetSocketAddress addr = new InetSocketAddress(0);
try {
@@ -131,6 +127,10 @@
server.start();
}
+ public String getAddress() {
+ return server.getAddress().getHostName();
+ }
+
public int getPort() {
return server.getAddress().getPort();
}
@@ -143,9 +143,10 @@
}
/* T1 tests the client by sending 4 requests to 2 different realms
- * in parallel. The client should recognise two pairs of
dependent requests
- * and execute the first of each pair in parallel. When they
both succeed
- * the second requests should be executed without calling the
authenticator.
+ * in parallel. The client should recognise two pairs of dependent
+ * requests and execute the first of each pair in parallel.
When they
+ * both succeed the second requests should be executed without
calling
+ * the authenticator.
* The test succeeds if the authenticator was only called twice.
*/
class AuthenticationHandlerT1a implements HttpHandler
@@ -171,11 +172,9 @@
default:
System.out.println ("Unexpected request");
}
- } catch (InterruptedException |
- BrokenBarrierException e)
- {
- throw new RuntimeException(e);
- }
+ } catch (InterruptedException | BrokenBarrierException e) {
+ throw new RuntimeException(e);
+ }
}
}
@@ -270,10 +269,9 @@
}
}
- /* T2 tests to check that if initial authentication fails, the
second will
- * succeed, and the authenticator is called twice
+ /* T2 tests to check that if initial authentication fails, the
second
+ * will succeed, and the authenticator is called twice
*/
-
class AuthenticationHandlerT2a implements HttpHandler
{
volatile int count = -1;
@@ -287,11 +285,10 @@
}
AuthenticationHandler.errorReply(exchange,
"Basic realm=\"realm3\"");
-
}
}
- class AuthenticationHandlerT2b implements HttpHandler
+ class AuthenticationHandlerT2b implements HttpHandler
{
volatile int count = -1;
@@ -316,7 +313,6 @@
* resource at same time. Authenticator should be called once
for server
* and once for proxy
*/
-
class AuthenticationHandlerT3a implements HttpHandler
{
volatile int count = -1;
@@ -423,11 +419,10 @@
int f = auth.getCount();
if (f != 2) {
- except ("Authenticator was called "+f+" times. Should be 2",
- server);
+ except ("Authenticator was called "+f+" times. Should be 2");
}
if (error) {
- except ("error occurred", server);
+ except ("error occurred");
}
auth.resetCount();
@@ -444,10 +439,10 @@
f = auth.getCount();
if (f != redirects+1) {
except ("Authenticator was called "+f+" times. Should be: "
- + redirects+1, server);
+ + redirects+1);
}
if (error) {
- except ("error occurred", server);
+ except ("error occurred");
}
}
@@ -466,11 +461,10 @@
int f = auth.getCount();
if (f != 2) {
- except ("Authenticator was called "+f+" times. Should be: "
+ 2,
- server);
+ except ("Authenticator was called "+f+" times. Should be: "
+ 2);
}
if (error) {
- except ("error occurred", server);
+ except ("error occurred");
}
}
@@ -482,10 +476,11 @@
System.setProperty ("http.maxRedirects", Integer.toString
(redirects));
System.setProperty ("http.auth.serializeRequests", "true");
Authenticator.setDefault (auth);
+
try (Server server = new Server()) {
- server.startServer();
System.out.println ("Server: listening on port: "
+ server.getPort());
+
if (proxy) {
System.setProperty ("http.proxyHost", "localhost");
System.setProperty ("http.proxyPort",
@@ -495,11 +490,9 @@
doServerTests ("localhost:"+server.getPort(), server);
}
}
-
}
- public static void except (String s, Server server) {
- server.close();
+ public static void except (String s) {
throw new RuntimeException (s);
}
On 25.07.13 20:35, Kurchi Subhra Hazra wrote:
Hi,
Did anyone have a chance to look at this?
Thanks,
Kurchi
On Thu, Jul 18, 2013 at 4:26 PM, Kurchi Hazra
<kurchi.subhra.ha...@oracle.com <mailto:kurchi.subhra.ha...@oracle.com>>
wrote:
Hi Michael,
I added some comments as to what is the purpose of the latches
and barriers. Those comments alongwith the
comments describing the purpose of the handlers should make the
synchronization logic more clear. Let me know what
you think: http://cr.openjdk.java.net/~__khazra/8017779/webrev.01/
<http://cr.openjdk.java.net/~khazra/8017779/webrev.01/>
Thanks,
Kurchi
On 7/17/2013 2:07 PM, Kurchi Hazra wrote:
On 7/17/2013 12:27 AM, Michael McMahon wrote:
On 16/07/13 20:11, Kurchi Hazra wrote:
Hi,
We have observed that
test/java/net/Authenticator/__B4769350.java fails
intermittently. Although not reproducible always,
the bug could be in the test/sun/net/www/httptest
library that this test uses. I have rewritten the test
to use
com.sun.net.httpserver instead since we anyway want to
move away from using the httptest library.
I have used CyclicBarriers to mimic
TestHttpServer.rendezvous() and CountDownLatches to
mimic TestHttpServer.__waitForCondition() and hopefully
preserved the rest of the logic in the test.
I have not seen the test failing after these changes.
Bug: http://bugs.sun.com/view_bug.__do?bug_id=8017779
<http://bugs.sun.com/view_bug.do?bug_id=8017779>
Webrev:
http://cr.openjdk.java.net/~__khazra/8017779/webrev.00/
<http://cr.openjdk.java.net/~khazra/8017779/webrev.00/>
Thanks,
Kurchi
Kurchi,
Since this is a fairly complicated test, and it's great to
see it being rewritten,
is there any possibility of adding some commentary that
explains the purpose
of the synchronization code. For instance, I can't see the
purpose of the call
on line 163 as it just blocks a thread that has already
completed its work
Michael
Hi Michael,
I have just preserved whatever logic the test originally had.
The specific instance you point out waits
for the T1b() handle to be executed for case 0 before moving
forward. But I guess it is hard to understand in a
glance and I'll add some more comments and get back with a new
webrev.
Thanks,
Kurchi
--
-Kurchi