use of org.sonar.java.se.xproc.HappyPathYield in project sonar-java by SonarSource.
the class ExplodedGraphWalkerTest method test_enqueueing_of_catch_blocks.
@Test
public void test_enqueueing_of_catch_blocks() {
SymbolicExecutionVisitor sev = createSymbolicExecutionVisitor("src/test/java/org/sonar/java/bytecode/se/testdata/ExceptionEnqueue.java");
MethodBehavior mb = sev.behaviorCache.behaviors.get("org.sonar.java.bytecode.se.testdata.ExceptionEnqueue#testCatchBlockEnqueue(Lorg/sonar/java/bytecode/se/testdata/ExceptionEnqueue;)Z");
List<HappyPathYield> happyPathYields = mb.happyPathYields().collect(Collectors.toList());
assertThat(happyPathYields).hasSize(1);
assertThat(happyPathYields.get(0).resultConstraint()).isNull();
mb = sev.behaviorCache.behaviors.get("org.sonar.java.bytecode.se.testdata.ExceptionEnqueue#testCatchBlockEnqueue2()Z");
happyPathYields = mb.happyPathYields().collect(Collectors.toList());
assertThat(happyPathYields).hasSize(1);
// correctly result constraint should be TRUE, but we enqueue also unreachable catch block which creates yield with FALSE result
// and yields are reduced consequently
assertThat(happyPathYields.get(0).resultConstraint()).isNull();
}
use of org.sonar.java.se.xproc.HappyPathYield in project sonar-java by SonarSource.
the class BytecodeEGWalkerTest method generateMethodBehavior.
@Test
public void generateMethodBehavior() throws Exception {
MethodBehavior methodBehavior = getMethodBehavior("fun(ZLjava/lang/Object;)Ljava/lang/Object;");
assertThat(methodBehavior.yields()).hasSize(2);
SymbolicValue svFirstArg = new SymbolicValue();
SymbolicValue svsecondArg = new SymbolicValue();
SymbolicValue svResult = new SymbolicValue();
List<SymbolicValue> invocationArguments = Lists.newArrayList(svFirstArg, svsecondArg);
List<ObjectConstraint> collect = methodBehavior.yields().stream().map(my -> {
Collection<ProgramState> ps = my.statesAfterInvocation(invocationArguments, Lists.newArrayList(), ProgramState.EMPTY_STATE, () -> svResult).collect(Collectors.toList());
assertThat(ps).hasSize(1);
ProgramState next = ps.iterator().next();
return next.getConstraint(svResult, ObjectConstraint.class);
}).collect(Collectors.toList());
assertThat(collect).hasSize(2).containsOnly(ObjectConstraint.NOT_NULL, ObjectConstraint.NULL);
List<HappyPathYield> nullConstraintOnResult = methodBehavior.happyPathYields().filter(my -> ObjectConstraint.NULL.equals(my.resultConstraint().get(ObjectConstraint.class))).collect(Collectors.toList());
assertThat(nullConstraintOnResult).hasSize(1);
HappyPathYield nullConstraintResult = nullConstraintOnResult.get(0);
Collection<ProgramState> ps = nullConstraintResult.statesAfterInvocation(invocationArguments, Lists.newArrayList(), ProgramState.EMPTY_STATE, () -> svResult).collect(Collectors.toList());
assertThat(ps).hasSize(1);
ObjectConstraint constraint = ps.iterator().next().getConstraint(svsecondArg, ObjectConstraint.class);
assertThat(constraint).isSameAs(ObjectConstraint.NULL);
}
use of org.sonar.java.se.xproc.HappyPathYield in project sonar-java by SonarSource.
the class BytecodeEGWalkerTest method test_enqueueing_of_catch_blocks.
@Test
public void test_enqueueing_of_catch_blocks() {
MethodBehavior mb = getMethodBehavior(ExceptionEnqueue.class, "testCatchBlockEnqueue(Lorg/sonar/java/bytecode/se/testdata/ExceptionEnqueue;)Z");
List<HappyPathYield> happyPathYields = mb.happyPathYields().collect(Collectors.toList());
assertThat(happyPathYields).hasSize(1);
assertThat(happyPathYields.get(0).resultConstraint()).isNull();
List<ExceptionalYield> exceptionalYields = mb.exceptionalPathYields().collect(Collectors.toList());
assertThat(exceptionalYields).hasSize(1);
assertThat(exceptionalYields.get(0).exceptionType(semanticModel).is("java.lang.RuntimeException")).isTrue();
}
use of org.sonar.java.se.xproc.HappyPathYield in project sonar-java by SonarSource.
the class BytecodeEGWalkerExecuteTest method method_returning_new_should_have_not_null_result.
@Test
public void method_returning_new_should_have_not_null_result() {
MethodBehavior mb = walker.getMethodBehavior(BytecodeEGWalkerExecuteTest.class.getCanonicalName() + "#newObject()Ljava/lang/Object;", squidClassLoader);
List<MethodYield> yields = mb.yields();
assertThat(yields).hasSize(1);
MethodYield yield = yields.get(0);
assertThat(yield).isInstanceOf(HappyPathYield.class);
ConstraintsByDomain resultConstraint = ((HappyPathYield) yield).resultConstraint();
assertThat(resultConstraint).isNotNull();
assertThat(resultConstraint.get(ObjectConstraint.class)).isEqualTo(ObjectConstraint.NOT_NULL);
TypedConstraint typeConstraint = (TypedConstraint) resultConstraint.get(TypedConstraint.class);
assertThat(typeConstraint.type.equals("java.lang.String")).isTrue();
}
use of org.sonar.java.se.xproc.HappyPathYield in project sonar-java by SonarSource.
the class BytecodeEGWalkerTest method test_enqueueing_of_exit_block2.
@Test
public void test_enqueueing_of_exit_block2() {
MethodBehavior mb = getMethodBehavior(ExceptionEnqueue.class, "enqueueExitBlock2(Lorg/sonar/java/bytecode/se/testdata/ExceptionEnqueue;)Z");
List<HappyPathYield> happyPathYields = mb.happyPathYields().collect(Collectors.toList());
assertThat(happyPathYields).hasSize(1);
assertThat(happyPathYields.get(0).resultConstraint()).isNull();
List<ExceptionalYield> exceptionalYields = mb.exceptionalPathYields().collect(Collectors.toList());
assertThat(exceptionalYields).hasSize(1);
assertThat(exceptionalYields.get(0).exceptionType(semanticModel).is("java.io.IOException")).isTrue();
}
Aggregations