forked from diffblue/cbmc
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding unit tests for verifying the behaviour of lazy methods on lambdas
- Loading branch information
thk123
committed
Mar 13, 2018
1 parent
28c6477
commit e1961d8
Showing
4 changed files
with
278 additions
and
0 deletions.
There are no files selected for viewing
239 changes: 239 additions & 0 deletions
239
unit/java_bytecode/ci_lazy_methods/lazy_load_lambdas.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,239 @@ | ||
/*******************************************************************\ | ||
Module: Unit tests for parsing generic classes | ||
Author: DiffBlue Limited. All rights reserved. | ||
\*******************************************************************/ | ||
|
||
#include <testing-utils/catch.hpp> | ||
#include <testing-utils/load_java_class.h> | ||
#include <testing-utils/require_symbol.h> | ||
|
||
SCENARIO( | ||
"Lazy load lambda methods", | ||
"[core][java_bytecode][ci_lazy_methods][lambdas][!mayfail]") | ||
{ | ||
GIVEN("A class with some locally declared lambdas") | ||
{ | ||
const symbol_tablet symbol_table = load_java_class_lazy( | ||
"LocalLambdas", | ||
"./java_bytecode/java_bytecode_parser/lambda_examples/", | ||
"LocalLambdas.test"); | ||
|
||
THEN("Then the lambdas should be loaded") | ||
{ | ||
std::string lambda_name_prefix = "java::LocalLambdas.lambda$test$"; | ||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "0:()V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "3:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "6:()[I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "9:(I)I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "10:(Ljava/lang/Object;)Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "11:(LDummyGeneric;)LDummyGeneric;"); | ||
} | ||
} | ||
GIVEN("A class with some member lambdas") | ||
{ | ||
const symbol_tablet symbol_table = load_java_class_lazy( | ||
"MemberLambdas", | ||
"./java_bytecode/java_bytecode_parser/lambda_examples/", | ||
"MemberLambdas.test"); | ||
|
||
THEN("Then the lambdas should be loaded") | ||
{ | ||
std::string lambda_name_prefix = "java::MemberLambdas.lambda$new$"; | ||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "0:()V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "3:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "6:()[I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "9:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;"); | ||
} | ||
} | ||
GIVEN("A class with some static lambdas") | ||
{ | ||
const symbol_tablet symbol_table = load_java_class_lazy( | ||
"StaticLambdas", | ||
"./java_bytecode/java_bytecode_parser/lambda_examples/", | ||
"StaticLambdas.test"); | ||
|
||
THEN("Then the lambdas should be loaded") | ||
{ | ||
std::string lambda_name_prefix = "java::StaticLambdas.lambda$static$"; | ||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "0:()V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "3:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "6:()[I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "9:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;"); | ||
} | ||
} | ||
GIVEN("A class with some outer member lambdas") | ||
{ | ||
const symbol_tablet symbol_table = load_java_class_lazy( | ||
"OuterMemberLambdas$Inner", | ||
"./java_bytecode/java_bytecode_parser/lambda_examples/", | ||
"OuterMemberLambdas$Inner.test"); | ||
|
||
THEN("Then the lambdas should be loaded") | ||
{ | ||
std::string lambda_name_prefix = | ||
"java::OuterMemberLambdas$Inner.lambda$new$"; | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "0:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "1:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "2:()LDummyGeneric;"); | ||
} | ||
} | ||
} | ||
|
||
SCENARIO( | ||
"Lazy load lambda methods in seperate class", | ||
"[core][java_bytecode][ci_lazy_methods][lambdas][!mayfail]") | ||
{ | ||
const symbol_tablet symbol_table = load_java_class_lazy( | ||
"ExternalLambdaAccessor", | ||
"./java_bytecode/java_bytecode_parser/lambda_examples/", | ||
"ExternalLambdaAccessor.test"); | ||
|
||
THEN("Then the lambdas should be loaded") | ||
{ | ||
std::string lambda_name_prefix = "java::ExternalLambdas.lambda$new$"; | ||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "0:()V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "1:(ILjava/lang/Object;LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, | ||
lambda_name_prefix + "2:([I[Ljava/lang/Object;[LDummyGeneric;)V"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "3:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "4:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "5:()LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "6:()[I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "7:()[Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "8:()[LDummyGeneric;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "9:()I"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "10:()Ljava/lang/Object;"); | ||
|
||
require_symbol::require_symbol_exists( | ||
symbol_table, lambda_name_prefix + "11:()LDummyGeneric;"); | ||
} | ||
} |
Binary file added
BIN
+1.82 KB
unit/java_bytecode/java_bytecode_parser/lambda_examples/ExternalLambdaAccessor.class
Binary file not shown.
39 changes: 39 additions & 0 deletions
39
unit/java_bytecode/java_bytecode_parser/lambda_examples/ExternalLambdaAccessor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
class ExternalLambdas | ||
{ | ||
int memberPrimitive; | ||
Object memberReference; | ||
DummyGeneric<Integer> memberSpecalisedGeneric; | ||
|
||
public SimpleLambda simpleLambda = () -> { /*NOP*/ }; | ||
public ParameterLambda paramLambda = (int primitive, Object reference, DummyGeneric<Integer> specalisedGeneric) -> {}; | ||
public ArrayParameterLambda arrayParamLambda = (int[] primitive, Object[] reference, DummyGeneric<Integer>[] specalisedGeneric) -> {}; | ||
public ReturningLambdaPrimitive returnPrimitiveLambda = () -> { return 1; }; | ||
public ReturningLambdaReference returnReferenceLambda = () -> { return null; }; | ||
public ReturningLambdaSpecalisedGeneric returningSpecalisedGenericLambda = () -> { return null; }; | ||
public ReturningLambdaPrimitiveArray returnPrimitiveArrayLambda = () -> { return null; }; | ||
public ReturningLambdaReferenceArray returnReferenceArrayLambda = () -> { return null; }; | ||
public ReturningLambdaSpecalisedGenericArray returningSpecalisedGenericArrayLambda = () -> { return null; }; | ||
public ReturningLambdaPrimitive returnPrimitiveLambdaCapture = () -> { return memberPrimitive; }; | ||
public ReturningLambdaReference returnReferenceLambdaCapture = () -> { return memberReference; }; | ||
public ReturningLambdaSpecalisedGeneric returningSpecalisedGenericLambdaCapture = () -> { return memberSpecalisedGeneric; }; | ||
} | ||
|
||
public class ExternalLambdaAccessor | ||
{ | ||
public static void test() | ||
{ | ||
ExternalLambdas e = new ExternalLambdas(); | ||
e.simpleLambda.Execute(); | ||
e.paramLambda.Execute(4, null, null); | ||
e.arrayParamLambda.Execute(null, null, null); | ||
e.returnPrimitiveLambda.Execute(); | ||
e.returnReferenceLambda.Execute(); | ||
e.returningSpecalisedGenericLambda.Execute(); | ||
e.returnPrimitiveArrayLambda.Execute(); | ||
e.returnReferenceArrayLambda.Execute(); | ||
e.returningSpecalisedGenericArrayLambda.Execute(); | ||
e.returnPrimitiveLambdaCapture.Execute(); | ||
e.returnReferenceLambdaCapture.Execute(); | ||
e.returningSpecalisedGenericLambdaCapture.Execute(); | ||
} | ||
} |
Binary file added
BIN
+3.75 KB
unit/java_bytecode/java_bytecode_parser/lambda_examples/ExternalLambdas.class
Binary file not shown.