[kaffe] Re: GregorianCalendar fixes

Dalibor Topic robilad@kaffe.org
Fri Nov 28 06:50:02 2003


Hi Stephen,

Stephen Crawley wrote:
> kaz@maczuka.gcd.org said:
> 
>>A mauve test attached. Since I have got a write access to the mauve
>>CVS registry,  I will add it to the registry.  The test results shows
>>that Sun's implementation also seems to have something wrong. 
> 
> 
> If Sun's implementation (you don't say which JDK version!) is failing
> a test, then that casts serious doubt on the correctness of the mauve
> testcase itself!

Sure. On the other hand, it also casts doubts on the quality of Sun's 
implementation. The JDK is quite buggy, see the JDK Bug Parade for a 
reference. The implementations are often less buggy that what we have in 
GNU Classpath or kaffe at the moment, but they are far from perfect, in 
my experience. I don't usually have much trouble crashing Sun's 1.4.2 VM 
with my java code. ;)

After looking at the test case, I'd say that it excercises a bit of a 
very badly specified area of the JDK. java.util.Calendar has a very, 
very ugly API. You can set the fields separately, but setting them can 
trigger recalculations & clearing of other, related fields.

Unfortunately, how the changes propagate is not very well documented, 
unless you shelve out the cash for the Java Class Libraries Vol. 1, 2nd 
Edition & and the Vol. 1, 2nd Edition Supplement books. Even then, it's 
not very clear that if setting HOUR first (which triggers an update of 
AM_PM) and then set AM_PM (which triggers an update of HOUR) has the 
same effect as setting AM_PM first and then setting HOUR.

I've tried Ito's test case with the setting of AM_PM and HOUR in 
reverse. The results for the JDK 1.4.2 are the same, it still breaks on 
the same four test cases as before. Clearing the calender to avoid side 
effects in field computation because of current time's fields being set 
doesn't help, either.

Bascially, there seems to be no way to tell Sun's JDK that you want to 
have 12:[00-59] [AM|PM] by using the set(field, value) API. [1] Which 
looks like a bug in Sun's implemenation to me, and this test exposes it.

> The over-arching principle for Mauve testcases is that the behavior of
> Sun's Java implementations is the "gold standard" for conformance
> testing.  Even if the Sun Java behavior contradicts the javadocs, or
> is "just plain wrong", it is still technically "correct behavior" from
> the POV of conformance.

That depends on the situation. If the behaviour is clearly a bug, like 
in the above case, I'd say report it to Sun, make sure Classpath does it 
better, and have a mauve test to expose the bug in the JDK.

After all, the goal shouldn't be to just have the classes, it should be 
to have the superior implementation. Having a test suite of our own 
helps in showing that everyone's implementations are buggy, but at least 
you can fix the free ones and share the fixes ;)

> [Sun sometimes acknowledges JDK bugs, but then says they won't fix them. 
> because of the risk of breaking existing customer code.  In such cases,
> other Java implementations need to be bug-for-bug compatible in order
> to minimize cross-platform portability problems for developers and
> end-users.]

Yes, but they also fix a lot of bugs between releases, judging by their 
release notes. If the software depends on the bug, I'd say fix the 
software ;) If the software depends on some badly specified part of the 
spec, I'd say write tests & make sure we understand that part well, so 
that we can make Classpath's code even better than the JDK. Which is the 
case here, I believe.

In the long run, the JDK is as irrelevant as an industry standard as SCO 
Unix is now. Ten years ago, there were many (closed source) 
implementations of Unix-ish OSes. GNU/Linux is gradually replacing them.

I boldly predict that the same will happen with Java. True WORA for Java 
will arrive, but it will arrive through free software efforts like mauve 
& GNU Classpath [2] that will provide the next reference platform.

cheers,
dalibor topic

[1] Unless you can somehow guess that setting AM_PM seems to wrap the 
clock time around in a rather weird way, so that when it's 12 and you 
set it to PM, you get AM, but when it's 12 and you set it to PM, you get 
AM.
[2] And kaffe, gcj, sablevm, kissme, etc. of course ;)