[[robotframework-component]]
= Robot Framework Component
:docTitle: Robot Framework
:artifactId: camel-robotframework
:description: Pass camel exchanges to acceptence test written in Robot DSL.
:since: 3.0
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*


The *robotframework:* component allows for processing camel exchanges
in acceptence test suites which are already implemented with its own DSL. 
The depending keyword libraries that can be used inside test suites 
implemented in Robot DSL, could have been implemented either via 
Java or Pyhton.

This component will let you execute business logic of acceptence test cases 
in Robot language on which you can pass parameters to feed data via power 
of Camel Routes, however there is no reverse binding of parameters back where
you can pass values back into Camel exchange. Therefore, for that reason,
it actually acts like a template language passing camel exchanges by binding
data into the test cases implemented. 

[source,xml]
----
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-robotframework</artifactId>
    <version>x.x.x</version> <!-- use the same version as your Camel core version -->
</dependency>
----

== URI format

[source,text]
----
robotframework:templateName[?options]
----

Where *templateName* is the classpath-local URI of the template to
invoke; or the complete URL of the remote template (eg:
\file://folder/myfile.robot).

You can append query options to the URI in the following format,
`?option=value&option=value&...`

=== Options

// component options: START
The Robot Framework component supports 51 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *allowContextMapAll* (common) | Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a potential security risk as this opens access to the full power of CamelContext API. | false | boolean
| *allowTemplateFromHeader* (common) | Whether to allow to use resource template from header or not (default false). Enabling this allows to specify dynamic templates via message header. However this can be seen as a potential security vulnerability if the header is coming from a malicious user, so use this with care. | false | boolean
| *argumentFile* (common) | A text file to read more arguments from. |  | File
| *combinedTagStats* (common) | Creates combined statistics based on tags. Use the format tags:title List |  | String
| *criticalTags* (common) | Tests that have the given tags are considered critical. List |  | String
| *debugFile* (common) | A debug file that is written during execution. |  | File
| *document* (common) | Sets the documentation of the top-level tests suites. |  | String
| *dryrun* (common) | Sets dryrun mode on use. In the dry run mode tests are run without executing keywords originating from test libraries. Useful for validating test data syntax. | false | boolean
| *excludes* (common) | Selects the tests cases by tags. List |  | String
| *exitOnFailure* (common) | Sets robot to stop execution immediately if a critical test fails. | false | boolean
| *includes* (common) | Selects the tests cases by tags. List |  | String
| *listener* (common) | Sets a single listener for monitoring tests execution |  | String
| *listeners* (common) | Sets multiple listeners for monitoring tests execution. Use the format ListenerWithArgs:arg1:arg2 or simply ListenerWithoutArgs List |  | String
| *log* (common) | Sets the path to the generated log file. |  | File
| *logLevel* (common) | Sets the threshold level for logging. |  | String
| *logTitle* (common) | Sets a title for the generated tests log. |  | String
| *metadata* (common) | Sets free metadata for the top level tests suites. comma seperated list of string resulting as List |  | String
| *monitorColors* (common) | Using ANSI colors in console. Normally colors work in unixes but not in Windows. Default is 'on'. 'on' - use colors in unixes but not in Windows 'off' - never use colors 'force' - always use colors (also in Windows) |  | String
| *monitorWidth* (common) | Width of the monitor output. Default is 78. | 78 | String
| *name* (common) | Sets the name of the top-level tests suites. |  | String
| *nonCriticalTags* (common) | Tests that have the given tags are not critical. List |  | String
| *noStatusReturnCode* (common) | If true, sets the return code to zero regardless of failures in test cases. Error codes are returned normally. | false | boolean
| *output* (common) | Sets the path to the generated output file. |  | File
| *outputDirectory* (common) | Configures where generated reports are to be placed. |  | File
| *randomize* (common) | Sets the test execution order to be randomized. Valid values are all, suite, and test |  | String
| *report* (common) | Sets the path to the generated report file. |  | File
| *reportBackground* (common) | Sets background colors for the generated report and summary. |  | String
| *reportTitle* (common) | Sets a title for the generated tests report. |  | String
| *runEmptySuite* (common) | Executes tests also if the top level test suite is empty. Useful e.g. with --include/--exclude when it is not an error that no test matches the condition. | false | boolean
| *runFailed* (common) | Re-run failed tests, based on output.xml file. |  | File
| *runMode* (common) | Sets the execution mode for this tests run. Note that this setting has been deprecated in Robot Framework 2.8. Use separate dryryn, skipTeardownOnExit, exitOnFailure, and randomize settings instead. |  | String
| *skipTeardownOnExit* (common) | Sets whether the teardowns are skipped if the test execution is prematurely stopped. | false | boolean
| *splitOutputs* (common) | Splits output and log files. |  | String
| *suites* (common) | Selects the tests suites by name. List |  | String
| *suiteStatLevel* (common) | Defines how many levels to show in the Statistics by Suite table in outputs. |  | String
| *summaryTitle* (common) | Sets a title for the generated summary report. |  | String
| *tagDocs* (common) | Adds documentation to the specified tags. List |  | String
| *tags* (common) | Sets the tags(s) to all executed tests cases. List |  | String
| *tagStatExcludes* (common) | Excludes these tags from the Statistics by Tag and Test Details by Tag tables in outputs. List |  | String
| *tagStatIncludes* (common) | Includes only these tags in the Statistics by Tag and Test Details by Tag tables in outputs. List |  | String
| *tagStatLinks* (common) | Adds external links to the Statistics by Tag table in outputs. Use the format pattern:link:title List |  | String
| *tests* (common) | Selects the tests cases by name. List |  | String
| *timestampOutputs* (common) | Adds a timestamp to all output files. | false | boolean
| *variableFiles* (common) | Sets variables using variables files. Use the format path:args List |  | String
| *variables* (common) | Sets individual variables. Use the format name:value List |  | String
| *warnOnSkippedFiles* (common) | Show a warning when an invalid file is skipped. | false | boolean
| *xunitFile* (common) | Sets the path to the generated XUnit compatible result file, relative to outputDirectory. The file is in xml format. By default, the file name is derived from the testCasesDirectory parameter, replacing blanks in the directory name by underscores. |  | File
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *configuration* (advanced) | The configuration |  | RobotFrameworkCamelConfiguration
|===
// component options: END


// endpoint options: START
The Robot Framework endpoint is configured using URI syntax:

----
robotframework:resourceUri
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *resourceUri* | *Required* Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a bean to be used as the resource. For bean you can specify the method name after dot, eg bean:myBean.myMethod. |  | String
|===


=== Query Parameters (70 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *allowContextMapAll* (common) | Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a potential security risk as this opens access to the full power of CamelContext API. | false | boolean
| *allowTemplateFromHeader* (common) | Whether to allow to use resource template from header or not (default false). Enabling this allows to specify dynamic templates via message header. However this can be seen as a potential security vulnerability if the header is coming from a malicious user, so use this with care. | false | boolean
| *argumentFile* (common) | A text file to read more arguments from. |  | File
| *combinedTagStats* (common) | Creates combined statistics based on tags. Use the format tags:title List |  | String
| *contentCache* (common) | Sets whether to use resource content cache or not | false | boolean
| *criticalTags* (common) | Tests that have the given tags are considered critical. List |  | String
| *debugFile* (common) | A debug file that is written during execution. |  | File
| *document* (common) | Sets the documentation of the top-level tests suites. |  | String
| *dryrun* (common) | Sets dryrun mode on use. In the dry run mode tests are run without executing keywords originating from test libraries. Useful for validating test data syntax. | false | boolean
| *excludes* (common) | Selects the tests cases by tags. List |  | String
| *exitOnFailure* (common) | Sets robot to stop execution immediately if a critical test fails. | false | boolean
| *includes* (common) | Selects the tests cases by tags. List |  | String
| *listener* (common) | Sets a single listener for monitoring tests execution |  | String
| *listeners* (common) | Sets multiple listeners for monitoring tests execution. Use the format ListenerWithArgs:arg1:arg2 or simply ListenerWithoutArgs List |  | String
| *log* (common) | Sets the path to the generated log file. |  | File
| *logLevel* (common) | Sets the threshold level for logging. |  | String
| *logTitle* (common) | Sets a title for the generated tests log. |  | String
| *metadata* (common) | Sets free metadata for the top level tests suites. comma seperated list of string resulting as List |  | String
| *monitorColors* (common) | Using ANSI colors in console. Normally colors work in unixes but not in Windows. Default is 'on'. 'on' - use colors in unixes but not in Windows 'off' - never use colors 'force' - always use colors (also in Windows) |  | String
| *monitorWidth* (common) | Width of the monitor output. Default is 78. | 78 | String
| *name* (common) | Sets the name of the top-level tests suites. |  | String
| *nonCriticalTags* (common) | Tests that have the given tags are not critical. List |  | String
| *noStatusReturnCode* (common) | If true, sets the return code to zero regardless of failures in test cases. Error codes are returned normally. | false | boolean
| *output* (common) | Sets the path to the generated output file. |  | File
| *outputDirectory* (common) | Configures where generated reports are to be placed. |  | File
| *randomize* (common) | Sets the test execution order to be randomized. Valid values are all, suite, and test |  | String
| *report* (common) | Sets the path to the generated report file. |  | File
| *reportBackground* (common) | Sets background colors for the generated report and summary. |  | String
| *reportTitle* (common) | Sets a title for the generated tests report. |  | String
| *runEmptySuite* (common) | Executes tests also if the top level test suite is empty. Useful e.g. with --include/--exclude when it is not an error that no test matches the condition. | false | boolean
| *runFailed* (common) | Re-run failed tests, based on output.xml file. |  | File
| *runMode* (common) | Sets the execution mode for this tests run. Note that this setting has been deprecated in Robot Framework 2.8. Use separate dryryn, skipTeardownOnExit, exitOnFailure, and randomize settings instead. |  | String
| *skipTeardownOnExit* (common) | Sets whether the teardowns are skipped if the test execution is prematurely stopped. | false | boolean
| *splitOutputs* (common) | Splits output and log files. |  | String
| *suites* (common) | Selects the tests suites by name. List |  | String
| *suiteStatLevel* (common) | Defines how many levels to show in the Statistics by Suite table in outputs. |  | String
| *summaryTitle* (common) | Sets a title for the generated summary report. |  | String
| *tagDocs* (common) | Adds documentation to the specified tags. List |  | String
| *tags* (common) | Sets the tags(s) to all executed tests cases. List |  | String
| *tagStatExcludes* (common) | Excludes these tags from the Statistics by Tag and Test Details by Tag tables in outputs. List |  | String
| *tagStatIncludes* (common) | Includes only these tags in the Statistics by Tag and Test Details by Tag tables in outputs. List |  | String
| *tagStatLinks* (common) | Adds external links to the Statistics by Tag table in outputs. Use the format pattern:link:title List |  | String
| *tests* (common) | Selects the tests cases by name. List |  | String
| *timestampOutputs* (common) | Adds a timestamp to all output files. | false | boolean
| *variableFiles* (common) | Sets variables using variables files. Use the format path:args List |  | String
| *variables* (common) | Sets individual variables. Use the format name:value List |  | String
| *warnOnSkippedFiles* (common) | Show a warning when an invalid file is skipped. | false | boolean
| *xunitFile* (common) | Sets the path to the generated XUnit compatible result file, relative to outputDirectory. The file is in xml format. By default, the file name is derived from the testCasesDirectory parameter, replacing blanks in the directory name by underscores. |  | File
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
| *delay* (scheduler) | Milliseconds before the next poll. | 500 | long
| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
| *initialDelay* (scheduler) | Milliseconds before the first poll starts. | 1000 | long
| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. The value can be one of: TRACE, DEBUG, INFO, WARN, ERROR, OFF | TRACE | LoggingLevel
| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component. Use value spring or quartz for built in scheduler | none | Object
| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. The value can be one of: NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS | MILLISECONDS | TimeUnit
| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
|===
// endpoint options: END


=== Samples

For example you could use something like:

[source,java]
----
from("direct:setVariableCamelBody")
    .to("robotframework:src/test/resources/org/apache/camel/component/robotframework/set_variable_camel_body.robot")
----

To use a robot test case to execute and collect the results
and pass them to generate custom report if such need happens

It's possible to specify what template the component
should use dynamically via a header, so for example:

[source,java]
----
from("direct:in")
    .setHeader(RobotFrameworkCamelConstants.CAMEL_ROBOT_RESOURCE_URI).constant("path/to/my/template.robot")
    .to("robotframework:dummy?allowTemplateFromHeader=true");
----

Robotframework component helps you pass values into robot test cases 
with the similar approach how you would be able to pass values using 
Camel Simple Language. Components supports passing values in three
different ways. Exchange body, headers and properties.

[source,java]
----
from("direct:in")
    .setBody(constant("Hello Robot"))
    .setHeader(RobotFrameworkCamelConstants.CAMEL_ROBOT_RESOURCE_URI).constant("path/to/my/template.robot")
    .to("robotframework:dummy?allowTemplateFromHeader=true");
----

And the `template.robot` file:

[source,text]
----
    *** Test Cases ***
    Set Variable Camel Body Test Case
    ${myvar} =    Set Variable    ${body}
    Should Be True    ${myvar} == ${body}
----

[source,java]
----
from("direct:in")
    .setHeader("testHeader", constant("testHeaderValue"))
    .setHeader(RobotFrameworkCamelConstants.CAMEL_ROBOT_RESOURCE_URI).constant("path/to/my/template.robot")
    .to("robotframework:dummy?allowTemplateFromHeader=true");
----

And the `template.robot` file:

[source,text]
----
    *** Test Cases ***
    Set Variable Camel Header Test Case
    ${myvar} =    Set Variable    ${headers.testHeader}
    Should Be True    ${myvar} == ${headers.testHeader}
----

[source,java]
----
from("direct:in")
    .setProperty"testProperty", constant("testPropertyValue"))
    .setHeader(RobotFrameworkCamelConstants.CAMEL_ROBOT_RESOURCE_URI).constant("path/to/my/template.robot")
    .to("robotframework:dummy?allowTemplateFromHeader=true");
----

And the `template.robot` file:
[source,text]
----
    *** Test Cases ***
    Set Variable Camel Header Test Case
    ${myvar} =    Set Variable    ${properties.testProperty}
    Should Be True    ${myvar} == ${properties.testProperty}
----

Please note that when you pass values through Camel Exchange to test cases,
they will be available as case-sensitive ``body``, ``headers.[yourHeaderName]`` and ``properties.[yourPropertyName]``

include::camel-spring-boot::page$robotframework-starter.adoc[]
