| Geoff hendrey 2005-06-06, 7:49 am |
| These are notes I gathered from the last version of
the TCK I ran (not what I just got from Apache, but
maybe some of the problems remain, we'll see). These
are notes on the test source code itself. I'm not
looking for any feedback on this, jut thought I would
toss it out there.
Package: com.sun.jdotck.api.PersistenceManager
========================================
======
[test class = GetObjectIdClass]
contains hardcoded reference to RI's OID class.
c1.getName().equals("com.sun.jdori.fostore.OID")
This causes non-RI to wrongly fail.
[test class =
ConcurrentPersistenceManagerSameClasses]
Does not properly cleanup PCPoint and PCRect
objects. COnsequently, if the
test is run more than once, it fails the second
time. The reason for
failure is because the "findPoint" method issues a
jdo query, and uses
the first object returned by the query's iterator.
However, there may
be multiple objects in the iterator. The test then
goes on to compare the
JAVA identity of said first object with the JAVA
identity of the object
made persistent earlier in the transaction. This
leads to a failure with
a message:
"Found PCPoint: 110, 120
Expected: 110, 120"
This test would be fixed by deleting all objects
matching the query BEFORE
doing the first insert, or by changing the test
comparison from JAVA
identity to 110==p11a.getX() && 120==p11a.getY()
[test = OneInstanceOfObjectPerPersistenceManager
]
this test cannot be run twice in a row without
clearing the database. Query
findPoint (int x, int y) will simply find a point
from a previous run. Since
we're using datastore identity, the object
retrieved from the query will be
different since it has a different database pk.
this results in Failed.
"Assertion A5.4-2 failed; query results differ"
[test = RefreshSideEffects]
While not stricktly a bug, this test cannot be run
twice in a row from the
same JVM. This is because PersistenceCapable "n1"
is declared as static.
The second time the test is run,
"makePersistent(n1)" is called on a different
persistence manager, while n1 remains in the cache
of the first pm. This
is illegal. This problem also manifests itself in
all tests begining with
"Refresh".
Package: com.sun.jdotck.api.InstanceCallbacks
========================================
=====
[test class = CallingJdoPreClear]
in InstanceCallbackClass.jdoPreClear the following
line causes a
NullPointerException because children is null:
<code>
...
numberOfChildren[intValue] = children.size();
...
</code>
children is not in the default-fetch-group and
never gets loaded within the
transaction for the PC "primaryObj". The
"touchFields" method never touches
primaryObj.children, thus it remains
null, having been set null in the transition to
HOLLOW caused by the prior
commit. Because jdoPreClear is not modified by the
enhancer, children does
not get loaded when jdoPreClear is called and the
NullPointerException is
thrown. This could be fixed by modifying the
"instanceCallbacks.jdo" meta-
data to add default-fetch-group="true" for the
field 'children'.
package: com.sun.jdotck.models.company
=======================================
[test class = Company]
in constructor, parameter 'addr' is not assigned
to instance variable
'address'
<code>
address = address
</code>
should be changed to "this.address = addr;"
package: com.sun.jdotck.models.fieldtypes
=======================================
[test class = TestFieldsOfObject]
The default value for Object0 is null. When the
test forces garbage
collection via System.gc(), the PC is garbage
collected. When the PC is
materialized from the datastore on getObjectById,
a new instance of the PC
is constructed. Because Object0 is not persistent,
val assumes null default
value. This causes a null pointer exception when
!val.equals(startValue)
is evaluated. The solution is to properly set the
value of isPersistent[0]
to false. This test incorrectly has set
isPersistent[0] to true. If the
value of isPersistent[0] is set to false, the
offending block of code is
correctly skiped and the null pointer avoided.
The same error will be caused for several
non-persistent fields.
All of the following indexes of isPersistent
should be false, not true:
0,16,36,52,72,88,108,124
[test class = TestFieldsOfSimpleInterface]
The problem is identical to that of
TestFieldsOfObject.
All of the following indexes of isPersistent
should be false, not true:
0,16,36,52,72,88,108,124
[test class = TestCollectionCollections]
Should not use Vector, since application is not
required to support
Collection or Set unless they reference a
HashSet. Causes a
ClassCastException to be thrown.
package: com.sun.jdotck.models.inheritance
=======================================
[test class = NonpersistentSuperclass]
Any time a superclass field is referenced, I had
to modify the source to
cast the object to the concrete class containing
the field. For example,
c.floatE must be changed to
((TopNonPersistE)c).floatE, because the field
floatE is contained in uphierarchy class
TopNonPersistE. If I do not do this
a NoSuchMethodException is thrown from within the
enhanced class. I believe
this to be a bug in the reference enhancer. From
now on I'll call this
SUPERCLASS_ENHANCED_FIELD_BUG
Also, this test depends on restoreValues=true, but
does not setup
restoreValues to be true. I had to set
restoreValues=true in iut.properties.
[test class = FieldWithSameNameInSuperclass]
SUPERCLASS_ENHANCED_FIELD_BUG and
Enancer does not appear to be enhancing
FieldSameName4.n3 or
FieldSameName3.n1. In the case of
FieldSameName3.n1 this is correct because
FieldSameName2 declares
persistence-modifier="none" in metadata, so n1 should
not be persistent in FieldSameName3. But it does
look like FieldSameName4.n3
should be enhanced.
Mutators get/setIntH in FieldsSameName4 access
FieldsSameName4.n3, which
explains the messages printed by the test below.
However, the parts of
the test that say "intF should be ..." represent
an erroneus check against
non-enhanced field FieldsSameName3.n1. Since the
fiels is not enhanced, it
would not get restored.
"
Object reverted to transient after rollback.
Persistent attribute shortF is 25, it should be 394
Object reverted to transient after rollback.
Persistent attribute intH is 26, it should be -347600
Read object back after rollback. Persistent
attribute shortF is 6, it should be 258
Read object back after rollback. Persistent
attribute intH is 7, it should be -25
Read object back after rollback. Persistent
attribute shortF is 15, it should be 8
Read object back after rollback. Persistent
attribute intH is 16, it should be -603
"
[test class =
NonPersistentFieldsAreNonPersistentInSub
class]
SUPERCLASS_ENHANCED_FIELD_BUG
[test class =
TransactionalFieldsAreTransactionalInSub
classes]
SUPERCLASS_ENHANCED_FIELD_BUG
here is an example of the error produced by
SUPERCLASS_ENHANCED_FIELD_BUG
"Failed. Class linking error while trying to load
test class
`com.sun.jdotck.models.inheritance. TransactionalFieldsAreTransactionalInSub
classes':
java.lang.NoSuchMethodError:
com.sun.jdotck.models.inheritance.AllPersist4.jdoSetthirdObj(Lcom/sun/jdotck/models/inheritance/AllPersist4;Lcom/sun/jdotck/models/inheritance/AllPersist4;)V"
[test class =
PersistentFieldsArePersistentInSubClasse
s]
SUPERCLASS_ENHANCED_FIELD_BUG
For datastore identity, the AllPersist equals
method is broken.
Equals will fail with a ClassCastException if obj
is an
AllPersist. Basically this method cannot return
true unless *application*
identity is used! Since I am testing with
Datastore identity, both the equals
and hashcode methods should not be changes from
their defaults in Object.
Therefore I commented them out.
package: com.sun.jdotck.query.operators
=======================================
NOTE: None of these tests in this package passes
completely due to bogus
comparisons of floats to ints, etc. The spec
warns against doing such
comparisons, so I take these "failures" with a
grain of salt.
[test =
com.sun.jdotck.query.operators.BinaryAddition]
This tests is broken. the first thing it does in
execute an invalid filter,
which naturally throws an exception (which the
test is not coded to catch).
To get the test beyond the initial exception, I
commented out the bunk query.
This test also erroneously compares the characters
'o' and 'E' to the integer
1+8. It also erroneusly compares 1+8 to a very
large random integer value.
The error messages print nothing to indicate why
the test failed. I inserted
a print to show the error:
Executing test BinaryAddition() ...
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
error, Size = 0but expected size() = 0 for filter:
charNotNull == 1 + 8
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
error, Size = 0but expected size() = 0 for filter:
charNull == 1 + 8
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
Size = 1
Object is PrimitiveTypes(9)
error, Size = 0but expected size() = 0 for filter:
bigInteger == 1 + 8
[test =
com.sun.jdotck.query.operators.GreaterThanOrEqual]
MySql comparisons of BigInt broken when BigInt
represented as String.
Example: SELECT "-999999999999999999" =
-999999999999999999
returns 0. Should return 1 since mysql supposed to
convert string to number
when one argument of arithmetic is number and
other is String.
This causes:
JDOQL GreaterThanOrEqual test returns wrong number
of instances with filter "fld_BigInteger >= value",
parameter "java.math.BigInteger value"
Expected 10 Got 9
ordering of String comparisons is not specified by
the spec.
MySQL: SELECT "JDO" >= "abcde" will return 1.
Therefore the
following should not be errors:
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "value >= fld_String", parameter
"String value"
Retrieved value: abcde, with parameter value: JDO
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "value >= fld_String", parameter
"String value"
Retrieved value: abcdef, with parameter value: JDO
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "value >= fld_String", parameter
"String value"
Retrieved value: Java, with parameter value: JDO
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "value >= fld_String", parameter
"String value"
Retrieved value: hello world, with parameter
value: JDO
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "value >= fld_String", parameter
"String value"
Retrieved value: Java, with parameter value: JDO
JDOQL GreaterThanOrEqual test returns wrong number
of instances with filter "value >= fld_String",
parameter "String value"
Expected 2 Got 7
JDOQL GreaterThanOrEqual test returns wrong number
of instances with filter "fld_String >= value",
parameter "String value"
Expected 9 Got 4
JDOQL GreaterThanOrEqual test returns wrong number
of instances with filter "value.fld_String >=
fld_String", parameter
"com.sun.jdotck.models.fieldtypes.AllTypes value"
Expected 8 Got 2
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "fld_String >= "Java""
Retrieved value: JDO has a very nice persistence
API, with parameter value: Java
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "fld_String >= "Java""
Retrieved value: JDO, with parameter value: Java
JDOQL GreaterThanOrEqual test returns incorrect
value with filter "fld_String >= "Java""
Retrieved value: JDO is a breeze to use, with
parameter value: Java
JDOQL GreaterThanOrEqual test returns wrong number
of instances with filter "fld_BigInteger >= value",
parameter "java.math.BigInteger value"
Expected 10 Got 9
[test = com.sun.jdotck.query.operators.Equality]
The following fail:
<code>
run_intQuery(int_filterL, floatParameter, new
Float(Integer.MAX_VALUE), Integer.MAX_VALUE, 1);
run_intQuery(int_filterR, floatParameter, new
Float(Integer.MIN_VALUE), Integer.MIN_VALUE, 1);
</code>
This is because rounding of Integer.MaxValue and
Integer.MIN_VALUE. This is
expected. Don't try to compare floats to ints.
Same goes for BigInteger, int,
Long, etc. This test has many bogus comparisons.
[test =
com.sun.jdotck.query.operators.GreaterThan]
Bogus comparisons of floats to ints, String to
String, etc., fail due to
rounding.
[test = com.sun.jdotck.query.operators.LessThan]
Bogus comparisons of floats to ints, String to
String, etc., fail due to
rounding or DB ordering or string comparisons.
[test = com.sun.jdotck.query.operators.NotEquals]
Bogus comparisons of floats to ints, String to
String, etc., fail due to
rounding or DB ordering or string comparisons.
[test =
com.sun.jdotck.query.operators.LessThanOrEqual]
Bogus comparisons of floats to ints, String to
String, etc., fail due to
rounding or DB ordering or string comparisons.
package: com.sun.jdotck.query
=============================
[test =
ExecutingMultipleQueriesSimultaneouslyIs
ThreadSafe]
If this test executed a single query in each pm,
simultaneously this test would pass.
But, the same query is executed multiple times
inside a single transaction.
This causes deadlock, see explaination below. This
deadlock is unavoidable
even if the queries are ordered in the same
direction.
[test =
MultipleActiveQueryInstanceInSamePersist
enceManagerExecutedSimultaneously]
This test does not, in fact, use the "same
persistence manager" for all the
queries as is implied by the name. In fact, it
uses a different pm for each
query, and naturally the queries deadlock as a
result of this. The deadlock
occurs because from different PM's, the same
sequence of the same query is
executed. PM A locks the rows in the RS. PM B's
query waits for PM A to
release the rows. PM A then queries the same rows
again, and deadlocks
because B has the next lock. There was a method
commented out
//pm = getThePM(pmf); This would have done what
the test purports to do.
It would have kept a static instance of the PM
that all the simultaneous
instances would use.
However, the test would then fail because all the
simultaneous
instances do a pm.currentTransaction.begin(). And
you can't call begin multiple
times on the same transaction. So generally, this
test is very screwed up and
difficult to even think of a way to make it work.
__________________________________
Yahoo! Mail Mobile
Take Yahoo! Mail with you! Check email on your mobile phone.
http://mobile.yahoo.com/learn/mail
|