UnitTestBot / UTBotJava

Automated unit test generation and precise code analysis for Java
Apache License 2.0
136 stars 43 forks source link

Using util method via reflection #2711

Open Damtev opened 11 months ago

Damtev commented 11 months ago

Consider the following class com.google.common.primitives.Booleans$LexicographicalComparator in guava-26.0:

private static enum LexicographicalComparator implements Comparator<boolean[]> { ... }

In tests for methods of this class in some specific conditions we generate the following code:

        Class booleansLexicographicalComparatorTestClazz = Class.forName("com.google.common.primitives.Booleans_LexicographicalComparatorTest");
        Class classType = Class.forName("java.lang.Class");
        Class stringType = Class.forName("java.lang.String");
        Method getStaticFieldValueMethod = booleansLexicographicalComparatorTestClazz.getDeclaredMethod("getStaticFieldValue", classType, stringType);
        getStaticFieldValueMethod.setAccessible(true);
        java.lang.Object[] getStaticFieldValueMethodArguments = new java.lang.Object[2];
        getStaticFieldValueMethodArguments[0] = "com.google.common.primitives.Booleans$LexicographicalComparator";
        getStaticFieldValueMethodArguments[1] = "INSTANCE";
        Object lexicographicalComparator = getStaticFieldValueMethod.invoke(null, getStaticFieldValueMethodArguments);

Steps to reproduce:

  1. Checkout to usvm_competitions_2024 branch, at least one reproducable commit 5503f43ede037b732bfad0d0f7fc2ec5e0e16d01
  2. Use the following settings in ContestEstimator:
        val timeLimit = 120
        methodFilter = "com.google.common.primitives.Booleans\$LexicographicalComparator.toString"
        projectFilter = listOf("guava-26.0")
  3. Add the following line com.google.common.primitives.Booleans$LexicographicalComparator to the utbot-junit-contest/src/main/resources/classes/guava-26.0/list
  4. Always use symbolicResult and ignore concreteResult in org.utbot.contest.usvm.jc.JcTestExecutor#execute