From 6ea65ba94909c1186573ddeaf51570034d2464fa Mon Sep 17 00:00:00 2001 From: Ivan Volkov Date: Wed, 17 Aug 2022 17:38:40 +0300 Subject: [PATCH] Fixed direct assigning of fields with private type #731 --- .../utbot/framework/assemble/AssembleModelGenerator.kt | 6 ++++++ .../codegen/ClassWithStaticAndInnerClassesTest.kt | 9 +++++++++ .../examples/codegen/ClassWithStaticAndInnerClasses.java | 7 +++++++ 3 files changed, 22 insertions(+) diff --git a/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt b/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt index 1842f652c6..8a0456f3e3 100644 --- a/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt +++ b/utbot-framework/src/main/kotlin/org/utbot/framework/assemble/AssembleModelGenerator.kt @@ -6,6 +6,7 @@ import org.utbot.engine.ResolvedModels import org.utbot.engine.isPrivate import org.utbot.engine.isPublic import org.utbot.framework.UtSettings +import org.utbot.framework.codegen.model.util.isAccessibleFrom import org.utbot.framework.modifications.AnalysisMode.SettersAndDirectAccessors import org.utbot.framework.modifications.ConstructorAnalyzer import org.utbot.framework.modifications.ConstructorAssembleInfo @@ -255,6 +256,11 @@ class AssembleModelGenerator(private val methodUnderTest: UtMethod<*>) { if (fieldId.isFinal) { throw AssembleException("Final field $fieldId can't be set in an object of the class $classId") } + if (!fieldId.type.isAccessibleFrom(methodPackageName)) { + throw AssembleException( + "Field $fieldId can't be set in an object of the class $classId because its type is inaccessible" + ) + } //fill field value if it hasn't been filled by constructor, and it is not default if (fieldId in constructorInfo.affectedFields || (fieldId !in constructorInfo.setFields && !fieldModel.hasDefaultValue()) diff --git a/utbot-framework/src/test/kotlin/org/utbot/examples/codegen/ClassWithStaticAndInnerClassesTest.kt b/utbot-framework/src/test/kotlin/org/utbot/examples/codegen/ClassWithStaticAndInnerClassesTest.kt index 52810696eb..1b1cc4436e 100644 --- a/utbot-framework/src/test/kotlin/org/utbot/examples/codegen/ClassWithStaticAndInnerClassesTest.kt +++ b/utbot-framework/src/test/kotlin/org/utbot/examples/codegen/ClassWithStaticAndInnerClassesTest.kt @@ -97,6 +97,15 @@ internal class ClassWithStaticAndInnerClassesTest : UtValueTestCaseChecker(testC ) } + @Test + fun testGetValueFromPublicFieldWithPrivateType() { + check( + ClassWithStaticAndInnerClasses::getValueFromPublicFieldWithPrivateType, + eq(2), + coverage = DoNotCalculate + ) + } + @Test fun testPublicStaticClassWithPrivateField_DeepNestedStatic_g() { checkAllCombinations( diff --git a/utbot-sample/src/main/java/org/utbot/examples/codegen/ClassWithStaticAndInnerClasses.java b/utbot-sample/src/main/java/org/utbot/examples/codegen/ClassWithStaticAndInnerClasses.java index 5e3761d2b1..11c20f54cb 100644 --- a/utbot-sample/src/main/java/org/utbot/examples/codegen/ClassWithStaticAndInnerClasses.java +++ b/utbot-sample/src/main/java/org/utbot/examples/codegen/ClassWithStaticAndInnerClasses.java @@ -3,6 +3,9 @@ public class ClassWithStaticAndInnerClasses { public int z = 0; + // public field that exposes private type PrivateInnerClassWithPublicField + public PrivateInnerClassWithPublicField publicFieldWithPrivateType = new PrivateInnerClassWithPublicField(0); + private static class PrivateStaticClassWithPublicField { public int x; @@ -239,4 +242,8 @@ PackagePrivateFinalInnerClassWithPackagePrivateField usePackagePrivateFinalInner return innerClass.createFromIncrement(x); } + + int getValueFromPublicFieldWithPrivateType() { + return publicFieldWithPrivateType.x; + } }