eclipse-ee4j / jakartaee-tck-tools

Other
7 stars 15 forks source link

Incorrect class name is used when the generated test class requires a number to be added (e.g. Client.class in EE 10 but was split into Client1/2/3/4 in EE 11) #91

Closed scottmarlow closed 1 month ago

scottmarlow commented 1 month ago

Example from jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/entityManager/Client2AppmanagedTest.java:

public class Client2AppmanagedTest extends ee.jakarta.tck.persistence.core.entityManager.Client2 {
    static final String VEHICLE_ARCHIVE = "jpa_core_entityManager_appmanaged_vehicle";
...
        @TargetsContainer("tck-appclient")
        @OverProtocol("appclient")
        @Deployment(name = VEHICLE_ARCHIVE, order = 2)
        public static EnterpriseArchive createDeploymentVehicle(@ArquillianResource TestArchiveProcessor archiveProcessor) {
        // Client
            // the jar with the correct archive name
            JavaArchive jpa_core_entityManager_appmanaged_vehicle_client = ShrinkWrap.create(JavaArchive.class, "jpa_core_entityManager_appmanaged_vehicle_client.jar");
            // The class files
            jpa_core_entityManager_appmanaged_vehicle_client.addClasses(
            com.sun.ts.tests.common.vehicle.VehicleRunnerFactory.class,
            com.sun.ts.tests.common.vehicle.ejb3share.UseEntityManager.class,
            com.sun.ts.tests.common.vehicle.ejb3share.EJB3ShareIF.class,
            com.sun.ts.tests.common.vehicle.appmanaged.AppManagedVehicleIF.class,
            com.sun.ts.tests.common.vehicle.ejb3share.UseEntityManagerFactory.class,
            com.sun.ts.tests.common.vehicle.EmptyVehicleRunner.class,
            ee.jakarta.tck.persistence.common.PMClientBase.class,
            com.sun.ts.tests.common.vehicle.VehicleRunnable.class,
            com.sun.ts.tests.common.vehicle.appmanaged.AppManagedVehicleRunner.class,
            com.sun.ts.tests.common.vehicle.ejb3share.UserTransactionWrapper.class,
            com.sun.ts.lib.harness.EETest.class,
            com.sun.ts.lib.harness.ServiceEETest.class,
            com.sun.ts.tests.common.vehicle.ejb3share.EntityTransactionWrapper.class,
            com.sun.ts.tests.common.vehicle.VehicleClient.class,
            com.sun.ts.tests.common.vehicle.ejb3share.NoopTransactionWrapper.class
            );
scottmarlow commented 1 month ago

I looked in the current Platform TCK sources and think that we might only have this problem with jpa tests. Connector + JDBC do have some tests like connManagerClient1.java or callStmtClient1.java but I think those map to the same class names in EE 11 so are unlikely to hit this bug.

scottmarlow commented 1 month ago

I just counted the number of generated source files that have this problem and it happens in 1276 jpa tests. So, think I will find the cause and see if I can fix it.

scottmarlow commented 1 month ago

Look at updating parseVehiclePackage() to pass in clazz.getName() (e.g. "ee.jakarta.tck.persistence.core.annotations.access.field.Client1") to be used instead of "ee.jakarta.tck.persistence.core.annotations.access.field.Client.class".

scottmarlow commented 1 month ago

I'm going to push my hack for this fix to a branch but don't expect that we need to merge it as it needs further refinement.

scottmarlow commented 1 month ago

https://github.com/scottmarlow/jakartaee-tck-tools/tree/jakartaee-tck-tools-issues-91 has the hack fix.

starksm64 commented 1 month ago

The problem here is that the EE10 build.xml parse is using the EE10 test class which no longer exists. I don't see why the hack you have would change this. This is really another name mapping problem, but we can't add all these new client classes to the mapping.

It seems like the code is going to have to look for the EE10 version of the input EE11 client class after mapping, and if it ends in a number and does not exist in the EE10 code, look to map the EE10 non-numbered class to the input numbered class. I'll take a look at this tomorrow as its late.

scottmarlow commented 1 month ago

The problem here is that the EE10 build.xml parse is using the EE10 test class which no longer exists. I don't see why the hack you have would change this. This is really another name mapping problem, but we can't add all these new client classes to the mapping.

As best as I can tell from looking around at different Client1.java tests in the EE 10 TCK vs EE 11 TCK, the EE 11 jpa tests are the only examples of where we split EE 10 Client.java into multiple (EE 11) Client1.java + Client2.java sources. So the class name mapping issue is limited to the JPA tests.

My hack in diff form is:

diff --git a/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/Utils.java b/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/Utils.java
index b3f17ba..e81259c 100644
--- a/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/Utils.java
+++ b/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/Utils.java
@@ -260,6 +260,15 @@ public class Utils {
                             clazz = dotClass.replace('$', '.');
                         }
                     }
+                    // JPA hack
+                    if(clazz.contains("ee.jakarta.tck.persistence") && clazz.endsWith(".Client.class")) {
+                        System.out.println("xxx set a breakpoint here: " + clazz);
+                        String testClassName = System.getProperty("testpackage.classname") + ".class";
+                        System.out.println("clazz " + clazz + " needs to be updated with " + testClassName);
+                        if (!clazz.equals(testClassName)) {
+                                    clazz = testClassName;
+                        }
+                    }
                     classes.add(clazz);
                 }
             }
diff --git a/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/api/TestPackageInfoBuilder.java b/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/api/TestPackageInfoBuilder.java
index 45524fb..0f15b77 100644
--- a/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/api/TestPackageInfoBuilder.java
+++ b/tools/tck-rewrite-ant/src/main/java/tck/jakarta/platform/ant/api/TestPackageInfoBuilder.java
@@ -308,6 +308,7 @@ public class TestPackageInfoBuilder {
     private DeploymentMethodInfo parseVehiclePackage(PackageTarget pkgTargetWrapper, Class<?> clazz, VehicleType vehicleType) {
         pkgTargetWrapper.execute(vehicleType);
         String protocol = getProtocolForVehicle(vehicleType);
+        System.setProperty("testpackage.classname",clazz.getName());
         String testClassSimpleName = clazz.getSimpleName();
         // Extract the information for the current deployment from the parsed ts.vehicles info
         DeploymentInfo deployment = new DeploymentInfo(clazz, pkgTargetWrapper.getDeploymentName(), protocol, vehicleType);

My hack is very specific to the JPA compile failures that I was seeing. Initially, I looked up the call stack in the debugger and didn't see a quick solution so just hacked in the (thread unsafe) system property solution to pass the class name in.

It seems like the code is going to have to look for the EE10 version of the input EE11 client class after mapping, and if it ends in a number and does not exist in the EE10 code, look to map the EE10 non-numbered class to the input numbered class. I'll take a look at this tomorrow as its late.

It did seem like the TestPackageInfoBuilder#parseVehiclePackage did already have the EE 11 test class in variable clazz which I thought about passing down to the Utils#getClassFilesString(EE11toEE10Mapping mapping, List fileSets, List anonymousClasses) call.

starksm64 commented 1 month ago

Ok, I was looking at the wrong commit then.

See the latest changes I pushed up in #95 that add a mapping from the current test class if it ends with a digit and does not exist in EE10, but the non-digit class does. This is producing jpa code that compiles. If that works for you I can put out a 1.0.0-M3.

Note that the DefaultEEMapping ctor is now private and the instance needs to be obtained via DefaultEEMapping.getInstance(). This is because the test class mapping is set for each call to TestPackageInfoBuilder.buildTestClientsEx(...). This is definitely not a thread safe class now.

scottmarlow commented 1 month ago

I'm not sure but with this change + https://github.com/scottmarlow/jakartaee-tck-tools/tree/jakartaee-tck-tools-pull-95, I am getting the following compile failure (without my hack change that I mentioned earlier):

[ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3PmservletTest.java:[79,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientPmservletTest.java:[70,59] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientAppmanagednotxTest.java:[110,63] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3AppmanagedTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientAppmanagedTest.java:[110,63] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3PuservletTest.java:[79,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientPuservletTest.java:[71,59] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientStateful3Test.java:[109,63] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client5Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client2PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3Stateful3Test.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6PmservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3AppmanagednotxTest.java:[118,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1Stateful3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client3Stateless3Test.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client1PuservletTest.java:[80,71] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/jpa22/query/stream/ClientStateless3Test.java:[109,63] package com.sun.ts.tests.jpa.jpa22.query.stream.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client7Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6Stateless3Test.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client6AppmanagednotxTest.java:[119,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist [ERROR] platformtck/jpa/platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4AppmanagedTest.java:[120,75] package com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client does not exist

From platform-tests/src/main/java/ee/jakarta/tck/persistence/core/criteriaapi/CriteriaQuery/Client4AppmanagedTest.java:

        // Ejb
            // the jar with the correct archive name
            JavaArchive jpa_core_criteriaapi_CriteriaQuery_appmanaged_vehicle_ejb = ShrinkWrap.create(JavaArchive.class, "jpa_core_criteriaapi_CriteriaQuery_appmanaged_vehicle_ejb.jar");
            // The class files
            jpa_core_criteriaapi_CriteriaQuery_appmanaged_vehicle_ejb.addClasses(
                com.sun.ts.tests.common.vehicle.ejb3share.EJB3ShareBaseBean.class,
                com.sun.ts.tests.common.vehicle.VehicleRunnerFactory.class,
                com.sun.ts.tests.common.vehicle.ejb3share.UseEntityManager.class,
                com.sun.ts.tests.common.vehicle.ejb3share.EJB3ShareIF.class,
                com.sun.ts.lib.harness.EETest.Fault.class,
                com.sun.ts.tests.common.vehicle.appmanaged.AppManagedVehicleIF.class,
                com.sun.ts.tests.common.vehicle.ejb3share.UseEntityManagerFactory.class,
                ee.jakarta.tck.persistence.common.PMClientBase.class,
                ee.jakarta.tck.persistence.common.schema30.Util.class,
                com.sun.ts.tests.common.vehicle.VehicleRunnable.class,
                com.sun.ts.tests.common.vehicle.appmanaged.AppManagedVehicleBean.class,
                com.sun.ts.tests.common.vehicle.ejb3share.UserTransactionWrapper.class,
                ee.jakarta.tck.persistence.core.criteriaapi.CriteriaQuery.Client4.class,
                com.sun.ts.lib.harness.EETest.class,
                com.sun.ts.lib.harness.ServiceEETest.class,
                com.sun.ts.tests.common.vehicle.ejb3share.EntityTransactionWrapper.class,
                com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client.ExpectedResult.class,
                com.sun.ts.lib.harness.EETest.SetupException.class,
                com.sun.ts.tests.common.vehicle.VehicleClient.class,
                com.sun.ts.tests.common.vehicle.ejb3share.NoopTransactionWrapper.class
            );

It looks like com.sun.ts.tests.jpa.core.criteriaapi.CriteriaQuery.Client.ExpectedResult.class` was for nested Client.ExpectedResult class in the EE 10 Client.java