replay.h File Reference

Store and use a replay of events for the DNS resolver. More...

#include "util/netevent.h"
#include "testcode/testpkts.h"
#include "util/rbtree.h"

Data Structures

struct  replay_scenario
 A replay scenario. More...
 
struct  replay_moment
 A replay moment. More...
 
struct  replay_range
 Range of timesteps, and canned replies to matching queries. More...
 
struct  replay_runtime
 Replay storage of runtime information. More...
 
struct  fake_pending
 Pending queries to network, fake replay version. More...
 
struct  replay_answer
 An answer that is pending to happen. More...
 
struct  fake_timer
 Timers with callbacks, fake replay version. More...
 
struct  replay_var
 Replay macro variable. More...
 

Functions

struct replay_scenarioreplay_scenario_read (FILE *in, const char *name, int *lineno)
 Read a replay scenario from the file. More...
 
void replay_scenario_delete (struct replay_scenario *scen)
 Delete scenario. More...
 
int replay_var_compare (const void *a, const void *b)
 compare two replay_vars
 
struct fake_timerreplay_get_oldest_timer (struct replay_runtime *runtime)
 get oldest enabled fake timer
 
void strip_end_white (char *p)
 strip whitespace from end of string
 
rbtree_typemacro_store_create (void)
 Create variable storage. More...
 
void macro_store_delete (rbtree_type *store)
 Delete variable storage. More...
 
char * macro_process (rbtree_type *store, struct replay_runtime *runtime, char *text)
 Apply macro substitution to string. More...
 
char * macro_lookup (rbtree_type *store, char *name)
 Look up a macro value. More...
 
int macro_assign (rbtree_type *store, char *name, char *value)
 Set macro value. More...
 
void macro_print_debug (rbtree_type *store)
 Print macro variables stored as debug info.
 
void testbound_selftest (void)
 testbounds self test
 

Detailed Description

Store and use a replay of events for the DNS resolver.

Used to test known scenarios to get known outcomes.

File format for replay files.

; unbound.conf options.
; ...
; additional commandline options to pass to unbound
COMMANDLINE cmdline_option
; autotrust key file contents, also adds auto-trust-anchor-file: "x" to cfg
AUTOTRUST_FILE id
; contents of that file
AUTOTRUST_END
; temp file names are echoed as "tmp/xxx.fname"
TEMPFILE_NAME fname
; temp file contents, inline, deleted at end of run
TEMPFILE_CONTENTS fname
; contents of that file
; this creates $INCLUDE /tmp/xxx.fname
$INCLUDE_TEMPFILE fname
TEMPFILE_END
CONFIG_END
; comment line.
SCENARIO_BEGIN name_of_scenario
RANGE_BEGIN start_time end_time
   ; give ip of the virtual server, it matches any ip if not present.
   ADDRESS ip_address 
   match_entries
RANGE_END
; more RANGE items.
; go to the next moment
STEP time_step event_type [ADDRESS ip_address]
; event_type can be:
     o NOTHING - nothing
     o QUERY - followed by entry
     o CHECK_ANSWER - followed by entry
     o CHECK_OUT_QUERY - followed by entry (if copy-id it is also reply).
     o REPLY - followed by entry
     o TIMEOUT
     o TIME_PASSES ELAPSE [seconds] - increase 'now' time counter, can be
        a floating point number.
       TIME_PASSES EVAL [macro] - expanded for seconds to move time.
     o TRAFFIC - like CHECK_ANSWER, causes traffic to flow.
        actually the traffic flows before this step is taken.
        the step waits for traffic to stop.
     o CHECK_AUTOTRUST [id] - followed by FILE_BEGIN [to match] FILE_END.
        The file contents is macro expanded before match.
     o CHECK_TEMPFILE [fname] - followed by FILE_BEGIN [to match] FILE_END
     o INFRA_RTT [ip] [dp] [rtt] - update infra cache entry with rtt.
     o FLUSH_MESSAGE name type class - flushes entry in message cache.
     o EXPIRE_MESSAGE name type class - expires entry in message cache.
     o ERROR
; following entry starts on the next line, ENTRY_BEGIN.
; more STEP items
SCENARIO_END

Calculations, a macro-like system: ${$myvar + 3600}
STEP 10 ASSIGN myvar = 3600
        ; ASSIGN event. '=' is syntactic sugar here. 3600 is some expression.
${..} is macro expanded from its expression.  Text substitution.
        o $var replaced with its value.  var is identifier [azAZ09_]*
        o number is that number.
        o ${variables and arithmetic }
        o +, -, / and *.  Note, evaluated left-to-right. Use ${} for brackets.
          So again, no precedence rules, so 2+3*4 == ${2+3}*4 = 20.
          Do 2+${3*4} to get 24.
        o ${function params}
        o ${time} is the current time for the simulated unbound.
        o ${ctime value} is the text ctime(value), Fri 3 Aug 2009, ...
        o ${timeout} is the time until next timeout in comm_timer list.
        o ${range lower value upper} checks if lower<=value<=upper
                returns value if check succeeds.

; Example file
SCENARIO_BEGIN Example scenario
RANGE_BEGIN 0 100
  ENTRY_BEGIN
  ; precoded answers to queries.
  ENTRY_END
END_RANGE
STEP 0 QUERY
  ENTRY_BEGIN
  ; query
  ENTRY_END
; a query is sent out to the network by resolver.
; precoded answer from range is returned.
; algorithm will do precoded answers from RANGE immediately, except if
; the next step specifically checks for that OUT_QUERY.
; or if none of the precoded answers match.
STEP 1 CHECK_ANSWER
  ENTRY_BEGIN
  ; what the reply should look like
  ENTRY_END
; successful termination. (if the answer was OK).
; also, all answers must have been checked with CHECK_ANSWER.
; and, no more pending out_queries (that have not been checked).
SCENARIO_END

Function Documentation

◆ replay_scenario_read()

struct replay_scenario* replay_scenario_read ( FILE *  in,
const char *  name,
int *  lineno 
)

Read a replay scenario from the file.

Parameters
infile to read from.
namename to print in errors.
linenoincremented for every line read.
Returns
: Scenario. NULL if no scenario read.

References sldns_file_parse_state::default_ttl, sldns_file_parse_state::lineno, MAX_LINE_LEN, and parse_keyword().

Referenced by setup_playback().

◆ replay_scenario_delete()

void replay_scenario_delete ( struct replay_scenario scen)

◆ macro_store_create()

rbtree_type* macro_store_create ( void  )

Create variable storage.

Returns
new or NULL on failure.

References rbtree_create(), and replay_var_compare().

Referenced by testbound_selftest().

◆ macro_store_delete()

void macro_store_delete ( rbtree_type store)

Delete variable storage.

Parameters
storethe macro storage to free up.

References del_macro(), and traverse_postorder().

Referenced by comm_base_delete().

◆ macro_process()

char* macro_process ( rbtree_type store,
struct replay_runtime runtime,
char *  text 
)

Apply macro substitution to string.

Parameters
storevariable store.
runtimethe runtime to look up values as needed.
textstring to work on.
Returns
newly malloced string with result.

References macro_expand(), fake_timer::next, and fake_timer::runtime.

Referenced by moment_assign(), and time_passes().

◆ macro_lookup()

char* macro_lookup ( rbtree_type store,
char *  name 
)

Look up a macro value.

Like calling ${$name}.

Parameters
storevariable store
namemacro name
Returns
newly malloced string with result or strdup("") if not found. or NULL on malloc failure.

References macro_getvar(), replay_var::name, and replay_var::value.

◆ macro_assign()

int macro_assign ( rbtree_type store,
char *  name,
char *  value 
)

Set macro value.

Parameters
storevariable store
namemacro name
valuetext to set it to. Not expanded.
Returns
false on failure.

References rbnode_type::key, macro_getvar(), replay_var::name, replay_var::node, rbtree_insert(), and replay_var::value.