[ Home | What's New | Contents | Overview | Contributors | Distribution | Examples | Documentation | Manual | Publications | Mailing List Archive | Problems ] This page was last updated by Axel Belinfante on 2003-08-05
TorX Test Tool Information
Prev   Next

campaign(1) - generate and populate TorX test campaign directory structure

Table of Contents

Name

campaign - generate and populate TorX test campaign directory structure

Synopsis

campaign configfile

Description

campaign is an experimental command that generates and populates a TorX test campaign directory structure. The configfile contains one or more TorX test run configurations, i.e. configurations specifying the specification, the (access to the) implementation, the TorX tool components to use, their parameters, seeds for random number generaters, etc. The configuration file is structured as a list of blocks of name=value pairs. Generally, for each test run that should be executed, the configuration file contains such a block for each instance of a TorX tool concept that ``participates'' in the test run. Examples of TorX tool concepts are the TorX tool components, the Implementation Under Test (IUT), the connections to the IUT, like the Points of Control and Observation (PCOs), and Implementation Access Points (IAPs). Each block has a type and a (unique) name, which together form the first name=value type=name pair of each block.

The names are used to ``link'' blocks, in the form of a DAG (directed acyclic graph). The ``root'' of the DAG is formed by a block of type campaign. The ``links'' are formed by name-value pairs in a block that refer to the names of other blocks, instead of specifying configuration parameters.

A particular ``link'' is made by the base field: it inherits the definition named in the field's value, provided that this definition is of the same type as the block that contains the base field.

To reduce the size of the configuration, a very primitive variable mechanism can be used to ``simulate'' parameterized blocks, and a primitive ``foreach'' construct can be used to create multiple instances of a configuration (with different variable instantiations).

Test Campaigns

Here we discuss test campaigns, the things that can be described in the campaign configuration language. Part of this section also tries to clarify the design of the campaign language.

Structure

We see test campaigns as hierarchies constisting of three ``levels''.

At the top we have the ``campaign'', that consists of a set of ``executions''. Each ``execution'' consists of a single experiment, where all parameters under control of the test operator are fixed. So, the configuration of an ``execution'' describes the test architecture, the tools, the parameters of the tools etc. The only remaining ``parameter'' is the non-determinism of the implementation. To cope with that, we allow each ``execution'' to be run more than once, which gives us that each ``execution'' is (has?) a set of ``runs''.

Components

The ingredients of a test campaign is formed by the execution architecture (what components do we have, and how are they connected) and its parameters.

The execution architecture is effectively identical to the test architecture (how are tester and iut connected), with the addition of information about the internal structure of the tester (what components are used, how are they connected).

In the test architecture we have the concepts ``Implementation Under Test'' (IUT), ``Implementation Access Point'' (IAP), ``Point of Control and Observation'' (PCO), ``Test Context'' and ``System Under Test''. In our view, the Adapter can only reach, access, communicate with, the IUT via the Test Context. The PCOs form the connection between the Adapter and the Test Context, and the IAPs form the connection between IUT and the Test Context. For the execution architecture we are not interested in the Test Context and the SUT, but we are interested in all the other concepts. In addition, we are interested in the concepts from the tool architecture: explorer, primer, combinator, test purpose, (batch) test, instantiator, driver, and adapter.

The IUT has one or more IAP's, and there are one or more PCO's. A PCO may coincide with an IAP, or there may be a test-context separating them, in which case there may be a many-to-many mapping between IAP's and PCO's. We currently assume that in the execution architecture we (may) have: one IUT, one adapter, one driver, zero or more explorers, zero or more primers, zero or more test purposes, zero or more combinators, zero or more batch tests, zero or more instantiators.

Connections

The IUT is connected (only) to the adapter, directly over IAP's or indirectly via PCO's and IAP's. The adapter is directly connected with the driver. The driver is has also connected either a primer, or a combinator, or a batch-test-primer, or an instantiator. The primer and batch-test-primer may have an explorer connected, or the explorer may be integrated in them. The combinator can have primers, test purposes and other combinators connected. Somehow, we should indicate for each combinator that is connected to another combinator how it should be treated (as a primer or as a test-purpose?). An indirect way to do that would be to associate with each combinator a role (the role that it wants to play for the driver or other combinator that it is connected to) or more indirectly, to specify for each combinator the operation that it is supposed to perform on its inputs, which then includes the ``interpretation'' that should be given to these inputs (trivial for primer and test-purpose inputs, more interesting for a combinator input).

Generated Director Structure

campaign generates from its configuration a multi-level directory structure. The top-level one contains the generated top-level Makefile, and (optionally via intermediate sub-directories, as specified in the dir field of each experiment specified in the test campaign) a number of ``experiment'' directories, one for each experiment specified in the configuration as part of the test campaign. Each of the ``experiment'' directories contains a generated Makefile for the experiment, and generated configuration files for the TorX tool components. The top-level Makefile recursively invokes the Makefiles in the ``experiment'' directories to execute the specified test campaign.

Configuration Language

We describe the language by the block types, and give for each type the recognized name=value fields (also known as attributes).

Not all fields of all blocks have to be given (we should mark the optional ones). The fields that may occur more than once in a block have a suffix ``*'' in the list below.

Note that the special field base may appear in every kind of block. base=value inherits the definition named in value, provided that that definition is of the same type as the block that contains the base field. Effectively, a block definition that starts in the following way:


type=name
    base=anothername
    ...
will try to ``in-place insert'' the contents of block type=anothername at the start of block type=name. Examples of the usage of base can be found in the EXAMPLES section below.

The block descriptions are in alphabetical order, as are the field descriptions in each block.

adapter
The value of the adapter name is just a name that is used to refer to the adapter definition from other configuration entries.
codingdir
the directory containing the coding library that will be used during test execution. In particular, this directory should contain implementations for the functions named in the multiplexer, encoder and decoder fields of the pco's.
exec
name of the program to execute when the adapter has to be started
execdir
directory in which the program named in the exec field has to be run
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
pco*
reference to definition elsewhere in the configuration
address
The value of the address name is used as a reference from within other blocks, and additionally it is (can be) used as a PIXIT parameter in en/decoding rules and/or connectors.
value
actual address. For network addressing we use the (plan9 derived) syntax giving (exclamation-mark separated) network, node and port as network!node!port. Currently known networks are pipe (just a single pipe, no node or port needed -- used when the implementation is started by the driver), and tcp and udp, where the nodename ``*'' refers to the local host. A port number may be omitted, which means that it can be chosen by the Operating System (or by the tool).
campaign
The value of the campaign name indicates the name of the campaign, which is not used. The campaign block is the ``root'' of the hierarchy of blocks in the configuration.
comment
to be used for documentation, not used by the tools
dir
the root of the campaing directory. All execution directories should be inside the campaign directory. The value of the dir field is available through the $campaign variable.
experiment*
reference to definition elsewhere in the configuration: an experiment that is part of the campaign
makefile
name of the top-level Makefile generated by campaign.
mkinclude
name of Makefile that is to be included in the top-level Makefile generated by campaign.
channel
The value of the channel name indicates the name of the channel.
iokind
the type (kind) of the channel, which must be either input or output
pco*
reference to definition elsewhere in the configuration: a pco``connected'' to this channel
sevent
the event representing ``suspension'' or ``quiescense'' (usally this will be Delta) not implemented yet
timeout
time out value for the channel (only for channels with iokind=output)
combinator
The value of the combinator name is just a name that is used to refer to the combinator definition from other configuration entries.
combinator*
reference to definition elsewhere in the configuration
config
name of the configuration file that has to be generated by campaign for the combinator described in this block.
exec
name of the program to execute when the primer has to be started
execdir
directory in which the program named in the exec field has to be run
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
gen
the program that can build (or generate) the combinator
genparams*
an argument for the program named in the gen field. There may be multiple genparams fields: we need one for each argument.
partitioner*
reference to definition elsewhere in the configuration
primer*
reference to definition elsewhere in the configuration
test*
reference to definition elsewhere in the configuration not implemented yet!
tp*
reference to definition elsewhere in the configuration not implemented yet!
driver
The value of the driver name is just a name that is used to refer to the driver definition from other configuration entries. (usually the value will be torx)
exec
name of the program to execute when the driver has to be started
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
post
program that has to be run after the driver has finished (not yet implemented)
pre
program that has to be run before the driver is started (not yet implemented)
experiment
The value of the experiment name is just a name that is used to refer to the experiment definition from other configuration entries. The value of the experiment field is available in this block (and in blocks refered by it) through the $experiment variable.
adapter
reference to definition elsewhere in the configuration
combinator
reference to definition elsewhere in the configuration
config
name of the configuration file that has to be generated by campaign for the experiment described in this block. Usually this will be in the directory indicated in the dir field.
dir
the directory in which the execution should take place
driver
reference to definition elsewhere in the configuration
driverparams*
additional flags for the driver program
impl
reference to definition elsewhere in the configuration
log
name of file in which to store the execution log (which includes the execution trace)
makefile
name of the Makefile that has to be generated by campaign for the experiment described in this block. Usually this will be in the directory indicated in the dir field.
maxdepth
the maximum number of steps that will be executed in a test run for this experiment
msg
name of file in which to store the (stderr) messages produced by the various components during execution
mkinclude
name of Makefile that is to be included in the Makefile generated by campaign.
mutant
name of the implementation mutant tu run. This is used to define the MUTANT entry in the generated configuration file.
partitioner
reference to definition elsewhere in the configuration
post
program that has to be run at the end of the test execution run (What are the default parameters for this program?)
postparams*
additional arguments for the program given in the post field
pre
program that has to be run at the start of the test execution run (What are the default parameters for this program?)
preparams*
additional arguments for the program given in the pre field
primer
reference to definition elsewhere in the configuration
runs
number of execution runs that will be executed for this experiment
seed
the seed parameter to be used during test execution
foreach
The foreach blocks define (typed) variables that can be used to create multiple instantiations of a configuration. The foreach definition can be ``activated'' in a product block by adding the appropriate foreach entry to it. The value of the foreach name is just a name that is used to refer to the foreach definition from other configuration entries.
name
the name of the variable
type
the type of the variable. Usually this will be something like block.field
value*
one of the values of the variable over which will be iterated
iap
The value of the iap name indicates the name of the iap. It will be referred to from impl blocks.
address
reference to definition elsewhere in the configuration. Currently we assume a single address for each iap.
impl
The value of the impl name is just a name that is used to refer to the impl definition from other configuration entries.
configgen
program that is able to generate a configuration file for the implementation, based on the configuration file together with parameters that are only known at run-time (e.g. port numbers chosen dynamically). (not yet implemented)
configgenparams*
arguments for the program named in the configgen field. There may be multiple configgenparams fields: we need one for each argument. (not yet implemented)
exec
name of the program to execute when the implementation has to be started
execcontext
program that is used as a filter between the implementation and the adapter. Such a filter can be used e.g. to translate between binary i/o done by the implementation and a hex encoding of it that is more pleasant for the adapter.
execcontextparams*
arguments for the program named in the execcontext field. There may be multiple execcontextparams fields: we need one for each argument.
execdir
directory in which the program named in the exec field has to be run
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
iap*
reference to definition elsewhere in the configuration. This may contain information that is needed by the adapter, like port addresses at the implementation side of the test context.
post
program that has to be run after the implemention has finished
postparams*
additional arguments for the program given in the post field
pre
program that has to be run before the implemention is started
preparams*
additional arguments for the program given in the pre field
partitioner
The value of the partitioner name is just a name that is used to refer to the partitioner definition from other configuration entries.
config
name of the configuration file that has to be generated by campaign for the partitioner described in this block.
exec
name of the program to execute when the partitioner has to be started
execdir
directory in which the program named in the exec field has to be run
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
gen
the program that can build (or generate) the combinator
genparams*
an argument for the program named in the gen field. not implemented yet
partfile
the location of the partition configuration file (that associates the weights with the actions)
pco
The value of the pco name indicates the name of the pco. It will be referred to from channel and adapter blocks (for the channels, we probably should check that there at most two references to each pco, one from an input channel and one from an output one).
address
reference to definition elsewhere in the configuration. Currently we assume a single address for each pco.
decoder
name of the decoding function that is used to decode values that are received via this pco. This function must be present in the library indicated by the codingdir field of the adapter. In the future we will not need this function, but instead use patterns over the event (if necessary enhanced with predicates).
encoder
name of the encoding function that is used to encode values that are sent over this pco. This function must be present in the library indicated by the codingdir field of the adapter. In the future we will not need this function, but instead use patterns over the event (if necessary enhanced with predicates).
ievent
a pattern over the events of the specification, that is used to partition those events in input and output pco's. This pattern indicates an input event. For backwords compatibility we also allow the pattern to consist of just a single gate name, together with the specification of a multiplexer function that will partition events on the same gate.
multiplexer
name of the function that is used to map an event to a pco. This function must be present in the library indicated by the codingdir field of the adapter. In the future we will not need this function, but instead use patterns over the event (if necessary enhanced with predicates).
oevent
a pattern over the events of the specification, that is used to partition those events in input and output pco's. This pattern indicates an output event. For backwords compatibility we also allow the pattern to consist of just a single gate name, together with the specification of a multiplexer function that will partition events on the same gate.
regexp
the value is exported to the decoding function,
where it may be used to segment stream-like data received from the SUT
primer
The value of the primer name is just a name that is used to refer to the primer definition from other configuration entries.
channel*
reference to definition elsewhere in the configuration. The channel definitions define the channels, the subset of the labels that they represent, and whether it is input or output.
exec
name of the program to execute when the primer has to be started
execdir
directory in which the program named in the exec field has to be run
execparams*
arguments for the program named in the exec field. There may be multiple execparams fields: we need one for each argument.
gen
the program that can build (or generate) the primer
genparams*
an argument for the program named in the gen field. There may be multiple genparams fields: we need one for each argument.
spec
reference to definition elsewhere in the configuration
product
The product blocks define multiple instantiations of a given template. The instantiations are generated as the cross product of the values of the product variables, as defined in foreach fields. The value of the product name is just a name that is used to refer to the product definition from other configuration entries.
foreach*
the variable definitions
prefix
the prefix of the names of the resulting instantiations. Their names will consist of the prefix, followed by for each foreach clause a hyphen followed by the value of the variable. So, ``product=lotosmutants'' in the example below, generates names like ``lotos-mutants-000-3'' (first the prefix, followed by a hyphen and a mutant value, followed by a hyphen and a seed value).
template
a reference to the block that should be instantiated. It should be of the type given in the type field.
type
the type of the result, which should be identical to the type of the given template. This will be something like
block
spec
The value of the spec name is just a name that is used to refer to the spec definition from other configuration entries.
auxfile*
the location of an auxiliary specification file. Currently they are used for user-supplied ADT implementation files (with .t and .f file name suffixes) that may be needed by CADP (via mkprimer(1)) to generate a Primer program from a LOTOS specification.
dialect
(optionally) describes tool dialect (e.g. to distinguish between LOTOS specs for lite and for CADP) (so far only used for documentation, not used by the campaign tool)
file
the location of the (main) specification file. (Note: in general a single specification could consist of several files. We can probably handle that by requesting that all files of a specification appear in the same directory, which then can be named here, and use the gen field to deal with it).
language
the specification language (only used for documentation, not used by the campaign tool)
var
The var blocks define (typed) variables that can be used to parameterise a configuration. The var definition can be ``activated'' in an arbitrary block by adding the appropriate var entry to it. The value of the var name is just a name that is used to refer to the var definition from other configuration entries.
name
the name of the variable
type
the type of the variable Usually this will be something like block.field
value*
the value of the variable. If the field given in the type field may appear more than once in its block, there may be multiple value fields for the variable definition.

Examples

First Example


#==============================================
spec=confprot01l
    file=$campaign/specs/confprot01.lot
    language=LOTOS  dialect=lite
spec=confprot01c
    file=$campaign/specs/confprot01.caesar.lot
    auxfile=$campaign/specs/confprot01.caesar.t
    auxfile=$campaign/specs/confprot01.caesar.f
    language=LOTOS  dialect=cadp
spec=confprot01p
    file=$campaign/specs/conf-solo.trojka
    language=PROMELA
primer=pl
    spec=confprot01c
    gen=mkprimer
    genparams=
    exec=$campaign/specs/confprot01.caesar
    execdir=$campaign/specs
    execparams=
    channel=in
    channel=out
primer=pp
    spec=confprot01p
    gen=mkprimer
    genparams=
    exec=$campaign/specs/conf-solo.sh
    execdir=$campaign/specs
    execparams=
    channel=in
    channel=out
impl=jan
    pre=
    post=
    exec=$campaign/impls/confprot.sh
    execparams=-c
    # execparams=$campaign/executions/$experiment/cfg.txt
    execparams=$campaign/cfg.txt
    execparams=-DEBUG
    execparams=-1
    execparams=-CSAP
    execparams=-MUTANT
    execparams=v-mutant
    execcontext=hexcontext
    execcontextparams=--
    configgen=
    configgenparams=-o
    configgenparams=$campaign/executions/$experiment/cfg.txt
    iap=up
    iap=low
    
driver=torx
    configgen=
    exec=torx
    execparams=--log
    execparams=$(log)
    execparams=--seed
    execparams=$(seed)
    execparams=--depth
    execparams=$(maxdepth)
    execparams=$(config)
    pre=
    post=
address=aup      name=v-add0   value=pipe
address=alow1    name=v-add1   value=udp!*!1075
address=alow2    name=v-add2   value=udp!*!1076
address=alow3    name=v-add3   value=udp!*!1077
address=alow4    name=v-add4   value=udp!*!1078
adapter=a        codingdir=v-coding
                               pco=up1  pco=low2 pco=low3 pco=low4
channel=in       iokind=input  pco=up1  pco=low2 pco=low3 pco=low4
channel=out      iokind=output pco=up1  pco=low2 pco=low3 pco=low4  timeout=2
pco=upbase       encoder=enCodingOfCFsp decoder=CFsp_nl2CFsp   regexp={RECVHEX[^0+0
pco=lowbase      encoder=enCodingOfUdp  decoder=udp_nl2udpsp   regexp={RECVHEX[^0+0
                 multiplexer=pcoOfUdp
pco=up1          base=upbase   address=aup       ievent=v-iev0 oevent=v-oev0
pco=low2         base=lowbase  address=alow2     ievent=v-iev2 oevent=v-oev2
pco=low3         base=lowbase  address=alow3     ievent=v-iev3 oevent=v-oev3
pco=low4         base=lowbase  address=alow4     ievent=v-iev4 oevent=v-oev4
iap=up           address=aup
iap=low          address=alow1
var=l-u-iev0  name=v-iev0   type=pco.ievent   value=cfsap_in!*!*
var=l-u-oev0  name=v-oev0   type=pco.oevent   value=cfsap_out!*
                                                 value=cfsap_out!*!*
var=l-l-iev2  name=v-iev2   type=pco.ievent   value=udp_in!udp1!udp_req(udp2,*)
                                                 value=udp_in!udp2!*
var=l-l-oev2  name=v-oev2   type=pco.oevent   value=udp_out!udp1!udp_ind(udp2,*)
                                                 value=udp_out!udp2!*
var=l-l-iev3  name=v-iev3   type=pco.ievent   value=udp_in!udp1!udp_req(udp3,*)
                                                 value=udp_in!udp3!*
var=l-l-oev3  name=v-oev3   type=pco.oevent   value=udp_out!udp1!udp_ind(udp3,*)
                                                 value=udp_out!udp3!*
var=l-l-iev4  name=v-iev4   type=pco.ievent   value=udp_in!udp1!udp_req(udp4,*)
                                                 value=udp_in!udp4!*
var=l-l-oev4  name=v-oev4   type=pco.oevent   value=udp_out!udp1!udp_ind(udp4,*)
                                                 value=udp_out!udp4!*
var=p-u-iev0  name=v-iev0   type=pco.ievent   value=from_upper
var=p-u-oev0  name=v-oev0   type=pco.oevent   value=to_upper
var=p-l-iev2  name=v-iev2   type=pco.ievent   value=from_lower
var=p-l-oev2  name=v-oev2   type=pco.oevent   value=to_lower
var=p-l-iev3  name=v-iev3   type=pco.ievent   value=from_lower
var=p-l-oev3  name=v-oev3   type=pco.oevent   value=to_lower
var=p-l-iev4  name=v-iev4   type=pco.ievent   value=from_lower
var=p-l-oev4  name=v-oev4   type=pco.oevent   value=to_lower
var=l-u-add0  name=v-add0   type=address.name value=cf1
var=l-l-add1  name=v-add1   type=address.name value=udp1
var=l-l-add2  name=v-add2   type=address.name value=udp2
var=l-l-add3  name=v-add3   type=address.name value=udp3
var=l-l-add4  name=v-add4   type=address.name value=udp4
var=p-u-add0  name=v-add0   type=address.name value=cf1
var=p-l-add1  name=v-add1   type=address.name value=1
var=p-l-add2  name=v-add2   type=address.name value=0
var=p-l-add3  name=v-add3   type=address.name value=2
var=p-l-add4  name=v-add4   type=address.name value=4
var=l-coding  name=v-coding type=adapter.codingdir
                 value=$campaign/coding/LOTOS
var=p-coding  name=v-coding type=adapter.codingdir
                 value=$campaign/coding/PROMELA
experiment=defaults
    msg=msg
    log=log
    dir=$campaign/executions/$experiment
    makefile=$campaign/executions/$experiment/torx.mk
    config=$campaign/executions/$experiment/torx.if
    pre=:
    post=:
    driver=torx
experiment=templatedefaults
    base=defaults
    runs=2
    seed=v-seed
    maxdepth=30
    adapter=a
    impl=jan
experiment=lotos
    base=templatedefaults
    primer=pl         var=l-coding   var=l-l-add1
    var=l-u-iev0   var=l-u-oev0   var=l-u-add0
    var=l-l-iev2   var=l-l-oev2   var=l-l-add2
    var=l-l-iev3   var=l-l-oev3   var=l-l-add3
    var=l-l-iev4   var=l-l-oev4   var=l-l-add4
experiment=promela
    base=templatedefaults
    primer=pp         var=p-coding   var=p-l-add1
    var=p-u-iev0   var=p-u-oev0   var=p-u-add0
    var=p-l-iev2   var=p-l-oev2   var=p-l-add2
    var=p-l-iev3   var=p-l-oev3   var=p-l-add3
    var=p-l-iev4   var=p-l-oev4   var=p-l-add4
foreach=seed
    type=experiment.seed
    name=v-seed
    value=1     value=2     value=3     value=4     value=5
foreach=mutants
    type=impl.execparams
    name=v-mutant
    value=000   value=100   value=111   value=214   value=247
    value=276   value=289   value=293   value=294   value=332
    value=345   value=348   value=358   value=384   value=398
    value=444   value=462   value=467   value=548   value=666
    value=687   value=738   value=749   value=782   value=836
    value=856   value=945
product=lotosmutants
    type=experiment
    foreach=mutants
    foreach=seed
    prefix=lotos-mutants
    template=lotos
product=promelamutants
    type=experiment
    foreach=mutants
    foreach=seed
    prefix=promela-mutants
    template=promela
    
campaign=one
    dir=/home/fmg/belinfan/src/cdr/utest_old_release/Examples/CampaignTemplate
    makefile=$campaign/Makefile
    product=lotosmutants
    product=promelamutants
#==============================================

Second Example


# ==============================================
driver=torx
    configgen=
    exec=torx
    execparams=--log
    execparams=$(log)
    execparams=--seed
    execparams=$(seed)
    execparams=--depth
    execparams=$(maxdepth)
    execparams=$(config)
    pre=
    post=
spec=LOTOS
    file=$campaign/specs/LOTOS/cf-pe-sut.caesar.lot
    auxfile=$campaign/specs/LOTOS/cf-pe-sut.caesar.t
    auxfile=$campaign/specs/LOTOS/cf-pe-sut.caesar.f
    language=LOTOS
    preproc=
    dialect=cadp
primer=pl
    spec=LOTOS
    gen=mkprimer
    genparams=
    exec=$campaign/specs/LOTOS/cf-pe-sut.caesar
    execdir=$campaign/specs/LOTOS
    execparams=
    channel=in
    channel=out
impl=janbase
    pre=
    post=
    exec=$campaign/impls/confprotv3c/confprot.sh
    gen=make
    execdir=$campaign/impls/confprotv3c
    genparams=confprot
    execparams=-a
    execparams=pythagoras:1075
    execparams=-a
    execparams=pythagoras:1076
    execparams=-a
    execparams=pythagoras:1077
    execcontext=hexcontext
    execcontextparams=--
    iap=up
    iap=low
foreach=mutants
    type=impl.execparams
    type=experiment.mutant
    name=v-nr
    value=001
    value=002
    value=003
    value=055
    value=056
    value=057
    value=058
    value=059
    value=099
    
foreach=seeds
    type=experiment.seed
    name=var-s
    value=789
    value=161
    value=78
    value=102
    value=360
    value=301
    value=24
    value=197
    value=694
    value=278
foreach=maxdepths
    type=experiment.maxdepth
    name=v-mdepth
    value=25
    value=50
    value=75
    value=100
    value=125
    value=150
    value=175
    value=200
    value=250
    value=300
#    value=400
#    value=500
#    value=700
#    value=750
#    value=1000
#    value=2000
#    value=4000
#    value=8000
#    value=50000
#    value=100000
adapter=a
    codingdir=var-coding
    pco=up1
    pco=low2
    pco=low3
pco=upbase
    encoder=enCodingOfCFsp
    decoder=CFsp_nl2CFsp
    regexp={RECVHEX[^0+0
pco=lowbase
    encoder=enCodingOfUdp
    decoder=udp_nl2udpsp
    multiplexer=pcoOfUdp
    regexp={RECVHEX[^0+0
pco=up1
    base=upbase
    address=up
    ievent=v-iev0
    oevent=v-oev0
pco=low2
    base=lowbase
    address=low2
    ievent=v-iev2
    oevent=v-oev2
pco=low3
    base=lowbase
    address=low3
    ievent=v-iev3
    oevent=v-oev3
iap=up
    address=up
iap=low
    address=low1
channel=in
    iokind=input
    pco=up1
    pco=low2
    pco=low3
channel=out
    iokind=output
    pco=up1
    pco=low2
    pco=low3
    timeout=5
    sevent=Delta
address=up
    name=var-address0
    value=pipe
address=low1
    name=var-address1
    value=udp!*!1075
address=low2
    name=var-address2
    value=udp!*!1076
address=low3
    name=var-address3
    value=udp!*!1077
var=l-u-iev0
    name=v-iev0
    type=pco.ievent
    value=cfsap_in!*!*
var=l-u-oev0
    name=v-oev0
    type=pco.oevent
    value=cfsap_out!*
    value=cfsap_out!*!*
var=l-l-iev2
    name=v-iev2
    type=pco.ievent
    value=udp_in!udp1!udp_req(udp2,*)
    value=udp_in!udp2!*
var=l-l-oev2
    name=v-oev2
    type=pco.oevent
    value=udp_out!udp1!udp_ind(udp2,*)
    value=udp_out!udp2!*
var=l-l-iev3
    name=v-iev3
    type=pco.ievent
    value=udp_in!udp1!udp_req(udp3,*)
    value=udp_in!udp3!*
var=l-l-oev3
    name=v-oev3
    type=pco.oevent
    value=udp_out!udp1!udp_ind(udp3,*)
    value=udp_out!udp3!*
var=l-u-address
    name=var-address0
    type=address.name
    value=cf1
var=l-l-address1
    name=var-address1
    type=address.name
    value=udp1
var=l-l-address2
    name=var-address2
    type=address.name
    value=udp2
var=l-l-address3
    name=var-address3
    type=address.name
    value=udp3
var=l-coding
    name=var-coding
    type=adapter.codingdir
    value=$campaign/coding/LOTOS
experiment=defaults
    msg=msg
    log=log
    dir=$campaign/experiment/$experiment
    makefile=$campaign/experiment/$experiment/torx.mk
    mkinclude=experiment.incl
    config=$campaign/experiment/$experiment/torx.if
    runs=var-runs
    seed=var-s
    maxdepth=v-mdepth
    var=l-u-iev0
    var=l-u-oev0
    var=l-l-iev2
    var=l-l-oev2
    var=l-l-iev3
    var=l-l-oev3
    var=l-u-address
    var=l-l-address1
    var=l-l-address2
    var=l-l-address3
    var=l-coding
    primer=pl
    adapter=a
    impl=janbase
    pre=:
    post=:
    driver=torx
    
# ================================================================
experiment=001
    base=defaults
    runs=1
    maxdepth=1000
product=expr
    type=experiment
    foreach=seeds
    prefix=expr
    template=001
# ================================================================
campaign=main
    dir=/home/fmg/feenstra/jf/campaign/confprot
    makefile=$campaign/Makefile
    experiment=product=expr
# ==============================================

Bugs

The campaign configuration language, and its tool support, are, at best, an interesting prototype, that still needs a number of iterations. Too much detail can and must be specified, the variable mechanism could be improved.

In general, it will be easier to write a shell script to invoke torx(1) in the way described in torx(1) than it is to use campaign.

The main problem seems to be that we picked a limited syntax and stayed with it, even though it became increasingly painful to add to it the features that (we think) we need.

See Also

torx-intro(1), environ(5)

Contact

By Email: <torx_support@cs.utwente.nl>

Version

This manual page documents version 3.9.0 of torx.


Table of Contents


Prev Table of Contents Next
Appendix D: TorX Manual Pages: autsimplify(1) - simplify automaton Aldebaran (.aut) file Valid HTML 4.01! Appendix D: TorX Manual Pages: cppmkprimer(1) - preprocess input with cpp before invoking mkprimer