replay.c File Reference

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

#include "config.h"
#include <math.h>
#include <ctype.h>
#include <time.h>
#include "util/log.h"
#include "util/net_help.h"
#include "util/config_file.h"
#include "testcode/replay.h"
#include "testcode/testpkts.h"
#include "testcode/fake_event.h"
#include "sldns/str2wire.h"
#include "util/timeval_func.h"

Macros

#define MAX_LINE_LEN   10240
 max length of lines in file
 
#define tb_assert(x)
 

Functions

static char * macro_expand (rbtree_type *store, struct replay_runtime *runtime, char **text)
 Expand a macro. More...
 
static int parse_keyword (char **line, const char *keyword)
 parse keyword in string. More...
 
static void replay_moment_delete (struct replay_moment *mom)
 delete moment
 
static void replay_range_delete (struct replay_range *rng)
 delete range
 
void strip_end_white (char *p)
 strip whitespace from end of string
 
static struct replay_rangereplay_range_read (char *remain, FILE *in, const char *name, struct sldns_file_parse_state *pstate, char *line)
 Read a range from file. More...
 
static void read_file_content (FILE *in, int *lineno, struct replay_moment *mom)
 Read FILE match content.
 
static void read_assign_step (char *remain, struct replay_moment *mom)
 read assign step info
 
static struct replay_momentreplay_moment_read (char *remain, FILE *in, const char *name, struct sldns_file_parse_state *pstate)
 Read a replay moment 'STEP' from file. More...
 
static struct replay_scenariomake_scenario (char *line)
 makes scenario with title on rest of line
 
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...
 
static struct fake_timerfirst_timer (struct replay_runtime *runtime)
 fetch oldest timer in list that is enabled
 
struct fake_timerreplay_get_oldest_timer (struct replay_runtime *runtime)
 get oldest enabled fake timer
 
int replay_var_compare (const void *a, const void *b)
 compare two replay_vars
 
rbtree_typemacro_store_create (void)
 Create variable storage. More...
 
static void del_macro (rbnode_type *x, void *ATTR_UNUSED(arg))
 helper function to delete macro values
 
void macro_store_delete (rbtree_type *store)
 Delete variable storage. More...
 
static size_t macro_length (char *text)
 return length of macro
 
static int do_buf_insert (char *buf, size_t remain, char *after, char *inserted)
 insert new stuff at start of buffer
 
static char * do_macro_recursion (rbtree_type *store, struct replay_runtime *runtime, char *at, size_t remain)
 do macro recursion
 
static struct replay_varmacro_getvar (rbtree_type *store, char *name)
 get var from store
 
static char * do_macro_variable (rbtree_type *store, char *buf, size_t remain)
 do macro variable
 
static char * do_macro_ctime (char *arg)
 do ctime macro on argument
 
static double perform_arith (double x, char op, double y, double *res)
 perform arithmetic operator
 
static char * do_macro_arith (char *orig, size_t remain, char **arithstart)
 do macro arithmetic on two numbers and operand
 
static char * do_macro_range (char *buf)
 Do range macro on expanded buffer.
 
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...
 
void macro_print_debug (rbtree_type *store)
 Print macro variables stored as debug info.
 
int macro_assign (rbtree_type *store, char *name, char *value)
 Set macro value. More...
 
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.

Macro Definition Documentation

◆ tb_assert

#define tb_assert (   x)
Value:
do { if(!(x)) fatal_exit("%s:%d: %s: assertion %s failed", \
__FILE__, __LINE__, __func__, #x); \
num_asserts++; \
} while(0);
void fatal_exit(const char *format,...)
implementation of fatal_exit
Definition: log.c:341

Function Documentation

◆ macro_expand()

static char * macro_expand ( rbtree_type store,
struct replay_runtime runtime,
char **  text 
)
static

Expand a macro.

Parameters
storevalue storage
runtimereplay runtime for other stuff.
textthe macro text, after the ${, Updated to after the } when done (successfully).
Returns
expanded text, malloced. NULL on failure.

References do_macro_arith(), do_macro_ctime(), do_macro_range(), do_macro_recursion(), do_macro_variable(), first_timer(), macro_length(), replay_runtime::now_secs, fake_timer::runtime, and fake_timer::tv.

Referenced by do_macro_recursion(), and macro_process().

◆ parse_keyword()

static int parse_keyword ( char **  line,
const char *  keyword 
)
static

parse keyword in string.

Parameters
lineif found, the line is advanced to after the keyword.
keywordstring.
Returns
: true if found, false if not.

Referenced by replay_moment_read(), replay_range_read(), and replay_scenario_read().

◆ replay_range_read()

static struct replay_range* replay_range_read ( char *  remain,
FILE *  in,
const char *  name,
struct sldns_file_parse_state pstate,
char *  line 
)
static

Read a range from file.

Parameters
remainRest of line (after RANGE keyword).
infile to read from.
namename to print in errors.
pstateread state structure with with lineno : incremented as lines are read. ttl, origin, prev for readentry.
lineline buffer.
Returns
: range object to add to list, or NULL on error.

References replay_range::addr, replay_range::addrlen, replay_range::end_step, extstrtoaddr(), sldns_file_parse_state::lineno, log_err(), MAX_LINE_LEN, parse_keyword(), read_entry(), replay_range::start_step, and strip_end_white().

◆ replay_moment_read()

static struct replay_moment* replay_moment_read ( char *  remain,
FILE *  in,
const char *  name,
struct sldns_file_parse_state pstate 
)
static

Read a replay moment 'STEP' from file.

Parameters
remainRest of line (after STEP keyword).
infile to read from.
namename to print in errors.
pstatewith lineno, ttl, origin, prev for parse state. lineno is incremented.
Returns
: range object to add to list, or NULL on error.

References replay_moment::addr, replay_moment::addrlen, replay_moment::evt_type, extstrtoaddr(), sldns_file_parse_state::lineno, log_err(), parse_keyword(), replay_moment::repevt_front_query, replay_moment::repevt_nothing, and replay_moment::time_step.

◆ 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.