Test Entities
Structural Test Entities
TestCase
The TestCase
entity acts as a container for a list of child entities which are started sequentially.
- type: org.apache.brooklyn.test.framework.TestCase
brooklyn.children:
- type: org.apache.brooklyn.entity.database.mysql.MySqlNode
...
- type: org.apache.brooklyn.test.framework.TestSensor
...
This can be used to enforce a strict ordering, for example ensuring a sensor has a certain value before attempting to invoke an effector.
Timeouts on child entities should be set relative to the completion of the preceding entity.
The ParallelTestCase
entity can be added as a child to run a subset of entities in parallel as a single step.
Parameters
on.error.spec
- Spec of entity to instantiate (and start, if startable) if the test-case failson.finally.spec
- Spec of entity to instantiate (and start, if startable) after a test-case either passes or failscontinueOnFailure
- Whether to continue executing subsequent children if an earlier child fails
ParallelTestCase
The ParallelTestCase
entity acts as a container for a list of child entities which are started in parallel.
- type: org.apache.brooklyn.test.framework.ParallelTestCase
brooklyn.children:
- type: org.apache.brooklyn.entity.database.mysql.MySqlNode
...
- type: org.apache.brooklyn.entity.webapp.ControlledDynamicWebAppCluster
...
This can be used to run a subset of entities in parallel as a single step when nested under a TestCase
entity.
Timeouts on child entities should be set relative to the start of the ParallelTestCase
.
LoopOverGroupMembersTestCase
The LoopOverGroupMembersTestCase
entity is configured with a target group and a test specification. For each member of the targeted group, the test case will create a TargetableTestComponent entity from the supplied test specification and set the components target to be the group member.
- type: org.apache.brooklyn.test.framework.LoopOverGroupMembersTestCase
brooklyn.config:
target: $brooklyn:entity("infrastructure").component("child", "DockerHosts")
test.spec:
$brooklyn:entitySpec:
type: org.apache.brooklyn.test.framework.TestSensor
...
Parameters
target
- group who's members are to be tested, specified via DSL. For example,$brooklyn:entity("tomcat")
. See also thetargetId
parameter.targetId
- alternative to thetarget
parameter which wraps the DSL component lookup requiring only theid
be supplied. For example,tomcat
. Please note, this must point to a group.test.spec
- The TargetableTestComponent to create for each child.
InfrastructureDeploymentTestCase
The InfrastructureDeploymentTestCase
will first create and deploy an infrastructure from the infrastructure.deployment.spec
config. It will then retrieve a deployment location by getting the value of the infrastructures infrastructure.deployment.location.sensor
sensor. It will then create and deploy all entities from the infrastructure.deployment.spec
config to the deployment location.
- type: org.apache.brooklyn.test.framework.InfrastructureDeploymentTestCase
brooklyn.config:
infrastructure.deployment.location.sensor: entity.dynamicLocation
infrastructure.deployment.spec:
$brooklyn:entitySpec:
- type: docker-cloud-calico
...
infrastructure.deployment.entity.specs:
- $brooklyn:entitySpec:
type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess
...
Parameters
infrastructure.deployment.spec
- the infrastructure to be deployed.infrastructure.deployment.entity.specs
- the entities to be deployed to the infrastructureinfrastructure.deployment.location.sensor
- the name of the sensor on the infrastructure to retrieve the deployment location
Validation Test Entities
TestSensor
The TestSensor
entity performs an assertion on a specified sensors value.
- type: org.apache.brooklyn.test.framework.TestSensor
name: Check tomcat isUp
brooklyn.config:
target: $brooklyn:entity("tomcat")
sensor: service.isUp
timeout: 10m
assert:
- equals: true
Parameters
target
- entity whose sensor will be tested, specified via DSL. For example,$brooklyn:entity("tomcat")
. See also thetargetId
parameter.targetId
- alternative to thetarget
parameter which wraps the DSL component lookup requiring only theid
be supplied. For example,tomcat
.sensor
- sensor to evaluate. For exampleservice.isUp
.timeout
- duration to wait on assertion to return a result. For example10s
,10m
, etcassert
- assertion to perform on the specified sensor value. See section on assertions below.
Tip
If the TestSensor
is wrapped within a TestCase
,
ParallelTestCase
or LoopOverGroupMembersTestCase
that set the target,
you don't need to specify the target, unless you want to test a different entity.
TestEffector
The TestEffector
entity invokes the specified effector on a target entity. If the result of the effector is a String, it will then perform assertions on the result.
- type: org.apache.brooklyn.test.framework.TestEffector
name: Invoke Deploy Effector
brooklyn.config:
target: $brooklyn:entity("tomcat")
effector: deploy
timeout: 5m
params:
url: https://search.maven.org/remotecontent?filepath=org/apache/brooklyn/example/brooklyn-example-hello-world-sql-webapp/0.12.0/brooklyn-example-hello-world-sql-webapp-0.12.0.war # BROOKLYN_VERSION
targetName: newcontext
Parameters
target
- entity whose effector will be invoked, specified via DSL. For example,$brooklyn:entity("tomcat")
. See also thetargetId
parameter.targetId
- alternative to thetarget
parameter which wraps the DSL component lookup requiring only theid
be supplied. For example,tomcat
.timeout
- duration to wait on the effector task to complete. For example10s
,10m
, etceffector
- effector to invoke, for exampledeploy
.params
- parameters to pass to the effector, these will depend on the entity and effector being tested. The example above shows theurl
andtargetName
parameters being passed to Tomcatsdeploy
effector.assert
- assertion to perform on the returned result. See section on assertions below.
Tip
If the TestEffector
is wrapped within a TestCase
,
ParallelTestCase
or LoopOverGroupMembersTestCase
that set the target,
you don't need to specify the target, unless you want to test a different entity.
TestHttpCall
The TestHttpCall
entity performs a HTTP GET on the specified URL and performs an assertion on the response.
- type: org.apache.brooklyn.test.framework.TestHttpCall
name: Check HTTP Response Status Code
brooklyn.config:
url: $brooklyn:entity("tomcat").attributeWhenReady("webapp.url")
timeout: 60s
applyAssertionTo: status
assert:
- isEqualTo: 200
Parameters
url
- URL to perform GET request on, this can use DSL for example$brooklyn:entity("tomcat").attributeWhenReady("webapp.url")
.timeout
- duration to wait on a HTTP response. For example10s
,10m
, etcapplyAssertionTo
- The filed to apply the assertion to. For examplestatus
,body
assert
- assertion to perform on the response. See section on assertions below.
Tip
If the TestHttpCall
is wrapped within a TestCase
,
ParallelTestCase
or LoopOverGroupMembersTestCase
that set the target,
you don't need to specify the target, unless you want to test a different entity.
TestSshCommand
The TestSshCommand runs a command on the host of the target entity. The script is expected not to run indefinitely, but to return a result (process exit code), along with its standard out and error streams, which can then be tested using assertions. If no assertions are explicitly configured, the default is to assert a non-zero exit code.
Either a bash command may be provided in the YAML, or a URL for a script which will be executed.
services:
- type: org.apache.brooklyn.test.framework.TestCase
name: testcase1
brooklyn.children:
- type: org.apache.brooklyn.entity.webapp.tomcat.TomcatServer
id: testprocess
- type: org.apache.brooklyn.test.framework.TestSshCommand
name: Check tomcat process running with ps
brooklyn.config:
targetId: testprocess
command: ps -ef
assert.status:
equals: 0
assert.out:
contains: tomcat
assert.err:
isEmpty: true
- type: org.apache.brooklyn.test.framework.TestSshCommand
name: Check hello world script
brooklyn.config:
targetId: testprocess
download.url: https://github.com/apache/brooklyn-docs/raw/master/guide/blueprints/test/example_yaml/entities/script1.sh
assert.status:
equals: 0
assert.out:
equals: hello world
assert.err:
isEmpty: true
Parameters
command
- The shell command to execute. (This anddownloadUrl
are mutually exclusive.)downloadUrl
- URL for a script to download and execute. (This andcommand
are mutually exclusive.)shell.env
- Map of environment variables to be set.scriptDir
- ifdownloadUrl
is used. The directory on the target host where downloaded scripts should be copied to.runDir
- the working directory where the command or script will be executed on the target host.assertStatus
- Assertions on the exit code of the command or script. See section on assertions below.assertOut
- Assertions on the standard output of the command as a String.assertErr
- Assertions on the standard error of the command as a String.
Tip
If the TestSshCommand
is wrapped within a TestCase
,
ParallelTestCase
or LoopOverGroupMembersTestCase
that set the target,
you don't need to specify the target, unless you want to test a different entity.
Assertions
The following conditions are provided by those test entities above that include assertions
isNull
- asserts that the actual value isnull
.notNull
- asserts that the actual value is NOTnull
.isEqualTo
- asserts that the actual value equals an expected value.equalTo
- a synonym forisEqualTo
equals
- a synonym forisEqualTo
notEqual
- asserts that the actual value does not equal the expected value.matches
- asserts that the actual value matches a regex pattern, for example".*hello.*"
. Note that regular expressions follow the Java defaults, e.g. for line terminators. One can use"(?m)"
for multi-line mode (so that^
and$
also match just after/before line terminators, rather than just the start/end of the entire input sequence). The dotall mode, set with"(?s)"
, can also be useful (so that.
matches any character, including line terminators).containsMatch
- asserts that the value contains a string that matches a regex. It follow the behaviour of the Matcher.find() method). This can be useful for simplifying matching in multi-line input.contains
- asserts that the actual value contains the supplied valueisEmpty
- asserts that the actual value is an empty stringnotEmpty
- asserts that the actual value is a non empty stringhasTruthValue
- asserts that the actual value has the expected interpretation as a booleangreaterThan
- asserts that the actual value is greater than the expected value according to Java's Comparable interface. Actual and expected must be instances of the same type and implementComparable
.lessThan
- asserts that the actual value is less than the expected value according to Java's Comparable interface. Actual and expected must be instances of the same type and implementComparable
.
Assertions may be provided as a simple map:
assert:
contains: 2 users
matches: .*[\d]* days.*
If there is the need to make multiple assertions with the same key, the assertions can be specified as a list of such maps:
assert:
- contains: 2 users
- contains: 2 days