Running tests

Organization

Tests are located in the spec/ folder. They are organized into sub-folders and files, according to system type, specification and functional areas.

% tree spec -d                          
spec
├── site          # tests for sites (equipment)
│   ├── core      # tests covering core specification
│   └── tlc       # tests for traffic light controllers
├── supervisor    # tests for supervisor systems (experimental)
└── support       # helper classes and other support files 

Running Tests

Note: Before running tests, be sure to set up your test configuration.

The RSMP Validator is based on the RSpec testing tool, so you use the rspec command to run tests. You should be located in the root of the project folder when running test.

Test a site, by running tests covering the core specification:

% bundle exec rspec spec/site/core
Using test config config/gem_tlc.yaml
Run options: exclude {:rsmp=>[unless relevant for 3.1.5]}
....

Finished in 1.01 seconds (files took 0.64491 seconds to load)
4 examples, 0 failures

In this example, the tests are running against a TLC emulator from the rsmp gem, running on the local machine, which is why the tests run in just about 1 second.

Filtering Tests

You can use rspec command line options to filter which tests to run.

If you want to store you selection for easy reuse, add them to a file name .rspec-local, in the root of the project folder. RSpec will automatically use the options. Example:

% cat .rspec-local
--pattern spec/site/*   # run tests in spec/site/
--exclude-pattern spec/site/unknown_status_spec.rb    # skip tests in this file
--tag ~programming           # exclude tests tagged with :programming

.rspec-local is git ignored, and will therefore not be added to the repo.

You can also keep different configurations, and pick on when running tests, eg:

% bundle exec rspec --options my_rspec_options

Running tests again a local Ruby TLC site

For trying out the specs, you can just the rsmp command from the rsmp gem to run a local Ruby TLC site.

Because the validator by default listens on port 13111, use should tell the site to connect on this port. You can do this either by editing the configuration, or using the supervisor command line option, as shown below.

You can use short reconnect and timeout intervals in the config file, which will make the test quick to run.

% cd rmsp
% bundle exec rsmp site --type tlc --json --config config/tlc.yaml --supervisors localhost:13111
2020-01-01 23:38:48 UTC                           Starting site RN+SI0001
2020-01-01 23:38:48 UTC                           Connecting to superviser at 127.0.0.1:12111
2020-01-01 23:38:48 UTC                           No connection to supervisor at 127.0.0.1:12111
2020-01-01 23:38:48 UTC                           Will try to reconnect again every 0.1 seconds..

Once it’s running, you can run the validator site specs, and you will see the Ruby TLC site respond to e.g. request to switch signal plan:

2020-01-01 23:38:54 UTC  6697976b5     -->  c776  Received CommandRequest {"mType":"rSMsg","type":"CommandRequest","ntsOId":"","xNId":"","cId":"TC","arg":[{"cCI":"M0002","cO":"setPlan","n":"status","v":"True"},{"cCI":"M0002","cO":"setPlan","n":"securityCode","v":"0000"},{"cCI":"M0002","cO":"setPlan","n":"timeplan","v":"2"}],"mId":"c77665c1-f7cc-4488-8bcb-f809939e0e20"}
2020-01-01 23:38:54 UTC                           Switching to plan 2

See the rsmp gem documentation for details on how to run Ruby sites and supervisors.

Alarms and Programming

Testing alarms require some way to trigger them.

There’s not yet any way to trigger alarms directly via RSMP. But often you can program the equipment to raise an alarm when a specific input is activated. If that’s the case, use the alarm_activcation item in the validator config to specify which input activates which alarm:

alarm_activation:
  A0302: 
    input: 7
    component: DL1

Tests that rely on device programming are tagged with :programming. If the device cannot be programmed to raise alarm on input activation, you should skip tests that rely on this, by passing the --tag ~programming as an option to the rspec command:

% bundle exec rspec spec/site/ --tag ~programming

RSpec Helpers and Options

The file spec/spec_helper.rb will be included automatically by RSpec, because the file .rspec has the following options:

--require spec_helper

The file spec/spec_helper.rband will in turn include the required dependencies, including the rsmp gem and files in spec/support/, which defines helper classes and methods.

Git Ignores

The file .gitignore is setup to ignore files and folders that typically use used for private configurations, including config/private/ and all secrets*.yaml files in config/.