TT#74160 Recursive vars replacement in API tests

Modify NGCP API Test Framework:
1. Add support for using variables in deeply nested parameters in yaml
test scenarios, by running vars replacement in recursion.
2. Simplify vars replacement logic in RequestBuilder.pm by deleting
conditions that are relevant to TestExecutor.pm only.
3. Allow passing directory as argument to testrunner in order to run
all yaml tests in that specific directory.
4. Fix the error message of failed 'code' condition.

Change-Id: I05a310609dc1ad15d33e37574e07078dfbe38aa7
changes/59/37159/2
Victor Tsvetov 6 years ago
parent 8facf0e419
commit d9a4d49ab5

@ -51,56 +51,30 @@ sub _replace_vars {
# substitute variables in content
if ( $args->{content} ) {
if ( ref $args->{content} eq 'HASH' ) {
foreach my $content_key (keys %{$args->{content}}) {
if ( $args->{content}->{$content_key} && $args->{content}->{$content_key} =~ /\$\{(.*)\}/ ) {
if ( ref $args->{retain}->{$1} eq 'ARRAY' || ref $args->{retain}->{$1} eq 'HASH' ) {
$args->{content}->{$content_key} = $args->{retain}->{$1};
$args->{content} = $self->_replace_vars_recursion($args->{content}, $args->{retain});
}
else {
$args->{content}->{$content_key} =~ s/\$\{(.*)\}/$args->{retain}->{$1}/;
}
sub _replace_vars_recursion {
my ( $self, $elem, $retain ) = @_;
if ( ref $elem eq 'HASH' ) {
foreach my $k (keys %{$elem}) {
$elem->{$k} = $self->_replace_vars_recursion($elem->{$k}, $retain);
}
elsif ( $args->{content}->{$content_key} && $args->{content}->{$content_key} =~ /^\$\{(.*)\}\..+/ ) {
my @splitted_values = split (/\./, $args->{content}->{$content_key});
$args->{content}->{$content_key} = $self->_retrieve_from_composed_key( \@splitted_values, $args->{retain} );
}
}
}
elsif ( ref $args->{content} eq 'ARRAY' ) {
foreach my $content ( @{$args->{content}} ) {
foreach my $content_key (keys %$content) {
if ( $content->{$content_key} && $content->{$content_key} =~ /\$\{(.*)\}$/ ) {
if ( ref $args->{retain}->{$1} eq 'ARRAY' || ref $args->{retain}->{$1} eq 'HASH' ) {
$content->{$content_key} = $args->{retain}->{$1};
}
else {
$content->{$content_key} =~ s/\$\{(.*)\}/$args->{retain}->{$1}/;
}
}
elsif ( $content->{$content_key} && $content->{$content_key} =~ /^\$\{(.*)\}\..+/ ) {
my @splitted_values = split (/\./, $content->{$content_key});
$content->{$content_key} = $self->_retrieve_from_composed_key( \@splitted_values, $args->{retain} );
}
}
}
}
else {
if ( $args->{content} =~ /\$\{(.*)\}/ ) {
$args->{content} = $args->{retain}->{$1};
}
} elsif ( ref $elem eq 'ARRAY' ) {
foreach my $e ( @{$elem} ) {
$e = $self->_replace_vars_recursion($e, $retain);
}
} elsif ( ref $elem eq '' and defined $elem and $elem =~ /\$\{(.*)\}/ ) {
if ( ref $retain->{$1} eq '' ) {
$elem =~ s/\$\{(.*)\}/$retain->{$1}/;
} else {
$elem = $retain->{$1};
}
}
sub _retrieve_from_composed_key {
my ( $self, $splitted_values, $retained ) = @_;
if ( $splitted_values->[0] =~ /\$\{(.*)\}/ ) {
my $value = $retained->{$1};
grep { $value = $value->{$splitted_values->[$_]} } (1..(scalar @$splitted_values - 1));
return $value;
}
return $elem;
}
1;

@ -44,7 +44,7 @@ sub run_tests {
INFO ( "Check ok." );
}
else {
ERROR ( "NOT OK. Expected: ".$result->code.". Got: $check_value" );
ERROR ( "NOT OK. Expected: $check_value. Got: ".$result->code);
$tests_result->{success} = 0;
push @{$tests_result->{errors}}, "Error at 'is' condition for test '$test_name'";
}

@ -15,7 +15,7 @@ if ( !$server ){
print "Usage: \$ perl testrunner.pl [<testsystem>] [<testset>]\n";
print "Usage example: \$ perl testrunner.pl 192.168.88.162\n";
print "Usage example: \$ perl testrunner.pl 192.168.88.162 fast\n";
print "Possible test set: all, stable, fast, t/api-rest2/Contracts.yaml\n";
print "Possible test set: all, stable, fast, t/api-rest2/tests-directory, t/api-rest2/Contracts.yaml\n";
print "Default test set: all\n";
exit(1);
}
@ -32,6 +32,10 @@ elsif ( $selected eq 'all' ) {
print "Test selection: all\n";
map { push @test_files, "./$_" } `ls ./t/api-rest2/*.yaml`;
}
elsif ( -d $selected ) {
print "Test selection: all files in '$selected' directory\n";
map { push @test_files, "./$_" } `ls ${selected}/*.yaml`;
}
else {
print "Test selection: $selected\n";
push @test_files, $selected;

Loading…
Cancel
Save