Integration Testing ========================= ## Installing Docker and Running Please refer to instructions at [https://github.com/druid-io/docker-druid/blob/master/docker-install.md](https://github.com/druid-io/docker-druid/blob/master/docker-install.md) Instead of running ``` boot2docker init ``` run instead ``` boot2docker init -m 6000 ``` Make sure that you have at least 6GB of memory available before you run the tests. Set the docker ip via: ``` export DOCKER_IP=$(boot2docker ip 2>/dev/null) ``` Verify that docker is running by issuing the following command: ``` docker info ``` Running Integration tests ========================= ## Starting docker tests To run all the tests using docker and mvn run the following command - ``` mvn verify -P integration-tests ``` To run only a single test using mvn run the following command - ``` mvn verify -P integration-tests -Dit.test=<test_name> ``` ## Configure and run integration tests using existing cluster To run tests on any druid cluster that is already running, create a configuration file: { "broker_host": "<broker_ip>", "broker_port": "<broker_port>", "router_host": "<router_ip>", "router_port": "<router_port>", "indexer_host": "<indexer_ip>", "indexer_port": "<indexer_port>", "coordinator_host": "<coordinator_ip>", "coordinator_port": "<coordinator_port>", "middle_manager_host": "<middle_manager_ip>", "zookeeper_hosts": "<comma-separated list of zookeeper_ip:zookeeper_port>", } Set the environment variable CONFIG_FILE to the name of the configuration file - ``` export CONFIG_FILE=<config file name> ``` To run all the tests using mvn run the following command - ``` mvn verify -P int-tests-config-file ``` To run only a single test using mvn run the following command - ``` mvn verify -P int-tests-config-file -Dit.test=<test_name> ``` Writing a New Test =============== ## What should we cover in integration tests For every end-user functionality provided by druid we should have an integration-test verifying the correctness. ## Rules to be followed while writing a new integration test ### Every Integration Test must follow these rules 1) Name of the test must start with a prefix "IT" 2) A test should be independent of other tests 3) Tests are to be written in TestNG style ([http://testng.org/doc/documentation-main.html#methods](http://testng.org/doc/documentation-main.html#methods)) 4) If a test loads some data it is the responsibility of the test to clean up the data from the cluster ### How to use Guice Dependency Injection in a test A test can access different helper and utility classes provided by test-framework in order to access Coordinator,Broker etc.. To mark a test be able to use Guice Dependency Injection - Annotate the test class with the below annotation ``` @Guice(moduleFactory = DruidTestModuleFactory.class) ``` This will tell the test framework that the test class needs to be constructed using guice. ### Helper Classes provided 1) IntegrationTestingConfig - configuration of the test 2) CoordinatorResourceTestClient - httpclient for coordinator endpoints 3) OverlordResourceTestClient - httpclient for indexer endpoints 4) QueryResourceTestClient - httpclient for broker endpoints ### Static Utility classes 1) RetryUtil - provides methods to retry an operation until it succeeds for configurable no. of times 2) FromFileTestQueryHelper - reads queries with expected results from file and executes them and verifies the results using ResultVerifier Refer ITIndexerTest as an example on how to use dependency Injection TODOS ======================= 1) Remove the patch for TestNG after resolution of Surefire-622