mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Add "# @no-test" tag to blacklist statements from test coverage analysis.
It can apply to either single statements: print "don't cover"; # @no-test or a block of statements: if ( F ) { # @no-test ... }
This commit is contained in:
parent
b6c3567ba4
commit
713e3ac5d0
6 changed files with 99 additions and 42 deletions
|
@ -5,7 +5,7 @@
|
|||
#include "util.h"
|
||||
|
||||
Brofiler::Brofiler()
|
||||
: delim('\t')
|
||||
: delim('\t'), ignoring(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -34,14 +34,24 @@ public:
|
|||
|
||||
void SetDelim(char d) { delim = d; }
|
||||
|
||||
void IncIgnoreDepth() { ignoring++; }
|
||||
void DecIgnoreDepth() { ignoring--; }
|
||||
|
||||
void AddStmt(const Stmt* s) { if ( ignoring == 0 ) stmts.push_back(s); }
|
||||
|
||||
private:
|
||||
/**
|
||||
* The current, global Brofiler instance creates this list at parse-time.
|
||||
*/
|
||||
list<const Stmt*> stmts;
|
||||
|
||||
private:
|
||||
/**
|
||||
*
|
||||
* Indicates whether new statments will not be considered as part of
|
||||
* coverage statistics because it was marked with the @no-test tag.
|
||||
*/
|
||||
unsigned int ignoring;
|
||||
|
||||
/**
|
||||
* This maps Stmt location-desc pairs to the total number of times that
|
||||
* Stmt has been executed. The map can be initialized from a file at
|
||||
* startup time and modified at shutdown time before writing back
|
||||
|
|
89
src/parse.y
89
src/parse.y
|
@ -29,6 +29,8 @@
|
|||
|
||||
%token TOK_DOC TOK_POST_DOC
|
||||
|
||||
%token TOK_NO_TEST
|
||||
|
||||
%left ',' '|'
|
||||
%right '=' TOK_ADD_TO TOK_REMOVE_FROM
|
||||
%right '?' ':' TOK_USING
|
||||
|
@ -42,6 +44,7 @@
|
|||
%right '!'
|
||||
%left '$' '[' ']' '(' ')' TOK_HAS_FIELD TOK_HAS_ATTR
|
||||
|
||||
%type <b> opt_no_test opt_no_test_block
|
||||
%type <str> TOK_ID TOK_PATTERN_TEXT single_pattern TOK_DOC TOK_POST_DOC
|
||||
%type <str_l> opt_doc_list opt_post_doc_list
|
||||
%type <id> local_id global_id def_global_id event_id global_or_event_id resolve_id begin_func
|
||||
|
@ -196,6 +199,7 @@ static std::list<std::string>* concat_opt_docs (std::list<std::string>* pre,
|
|||
%}
|
||||
|
||||
%union {
|
||||
bool b;
|
||||
char* str;
|
||||
std::list<std::string>* str_l;
|
||||
ID* id;
|
||||
|
@ -1315,121 +1319,117 @@ attr:
|
|||
;
|
||||
|
||||
stmt:
|
||||
'{' stmt_list '}'
|
||||
'{' opt_no_test_block stmt_list '}'
|
||||
{
|
||||
set_location(@1, @3);
|
||||
$$ = $2;
|
||||
set_location(@1, @4);
|
||||
$$ = $3;
|
||||
if ( $2 ) brofiler.DecIgnoreDepth();
|
||||
}
|
||||
|
||||
| TOK_PRINT expr_list ';'
|
||||
| TOK_PRINT expr_list ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @3);
|
||||
$$ = new PrintStmt($2);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $4 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_EVENT event ';'
|
||||
| TOK_EVENT event ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @3);
|
||||
$$ = new EventStmt($2);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $4 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_IF '(' expr ')' stmt
|
||||
{
|
||||
set_location(@1, @4);
|
||||
$$ = new IfStmt($3, $5, new NullStmt());
|
||||
//brofiler.stmts.push_back($$);
|
||||
}
|
||||
|
||||
| TOK_IF '(' expr ')' stmt TOK_ELSE stmt
|
||||
{
|
||||
set_location(@1, @4);
|
||||
$$ = new IfStmt($3, $5, $7);
|
||||
//brofiler.stmts.push_back($$);
|
||||
}
|
||||
|
||||
| TOK_SWITCH expr '{' case_list '}'
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new SwitchStmt($2, $4);
|
||||
//brofiler.stmts.push_back($$);
|
||||
}
|
||||
|
||||
| for_head stmt
|
||||
{
|
||||
$1->AsForStmt()->AddBody($2);
|
||||
//brofiler.stmts.push_back($1);
|
||||
}
|
||||
|
||||
| TOK_NEXT ';'
|
||||
| TOK_NEXT ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new NextStmt;
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $3 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_BREAK ';'
|
||||
| TOK_BREAK ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new BreakStmt;
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $3 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_RETURN ';'
|
||||
| TOK_RETURN ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new ReturnStmt(0);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $3 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_RETURN expr ';'
|
||||
| TOK_RETURN expr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new ReturnStmt($2);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $4 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_ADD expr ';'
|
||||
| TOK_ADD expr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @3);
|
||||
$$ = new AddStmt($2);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $4 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_DELETE expr ';'
|
||||
| TOK_DELETE expr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @3);
|
||||
$$ = new DelStmt($2);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $4 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_LOCAL local_id opt_type init_class opt_init opt_attr ';'
|
||||
| TOK_LOCAL local_id opt_type init_class opt_init opt_attr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @7);
|
||||
$$ = add_local($2, $3, $4, $5, $6, VAR_REGULAR);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $8 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_CONST local_id opt_type init_class opt_init opt_attr ';'
|
||||
| TOK_CONST local_id opt_type init_class opt_init opt_attr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @6);
|
||||
$$ = add_local($2, $3, $4, $5, $6, VAR_CONST);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $8 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| TOK_WHEN '(' expr ')' stmt
|
||||
{
|
||||
set_location(@3, @5);
|
||||
$$ = new WhenStmt($3, $5, 0, 0, false);
|
||||
brofiler.stmts.push_back($$);
|
||||
}
|
||||
|
||||
| TOK_WHEN '(' expr ')' stmt TOK_TIMEOUT expr '{' stmt_list '}'
|
||||
| TOK_WHEN '(' expr ')' stmt TOK_TIMEOUT expr '{' opt_no_test_block stmt_list '}'
|
||||
{
|
||||
set_location(@3, @8);
|
||||
$$ = new WhenStmt($3, $5, $9, $7, false);
|
||||
brofiler.stmts.push_back($$);
|
||||
set_location(@3, @9);
|
||||
$$ = new WhenStmt($3, $5, $10, $7, false);
|
||||
if ( $9 ) brofiler.DecIgnoreDepth();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1437,21 +1437,20 @@ stmt:
|
|||
{
|
||||
set_location(@4, @6);
|
||||
$$ = new WhenStmt($4, $6, 0, 0, true);
|
||||
brofiler.stmts.push_back($$);
|
||||
}
|
||||
|
||||
| TOK_RETURN TOK_WHEN '(' expr ')' stmt TOK_TIMEOUT expr '{' stmt_list '}'
|
||||
| TOK_RETURN TOK_WHEN '(' expr ')' stmt TOK_TIMEOUT expr '{' opt_no_test_block stmt_list '}'
|
||||
{
|
||||
set_location(@4, @9);
|
||||
$$ = new WhenStmt($4, $6, $10, $8, true);
|
||||
brofiler.stmts.push_back($$);
|
||||
set_location(@4, @10);
|
||||
$$ = new WhenStmt($4, $6, $11, $8, true);
|
||||
if ( $10 ) brofiler.DecIgnoreDepth();
|
||||
}
|
||||
|
||||
| expr ';'
|
||||
| expr ';' opt_no_test
|
||||
{
|
||||
set_location(@1, @2);
|
||||
$$ = new ExprStmt($1);
|
||||
brofiler.stmts.push_back($$);
|
||||
if ( ! $3 ) brofiler.AddStmt($$);
|
||||
}
|
||||
|
||||
| ';'
|
||||
|
@ -1649,6 +1648,18 @@ opt_doc_list:
|
|||
{ $$ = 0; }
|
||||
;
|
||||
|
||||
opt_no_test:
|
||||
TOK_NO_TEST
|
||||
{ $$ = true; }
|
||||
|
|
||||
{ $$ = false; }
|
||||
|
||||
opt_no_test_block:
|
||||
TOK_NO_TEST
|
||||
{ $$ = true; brofiler.IncIgnoreDepth(); }
|
||||
|
|
||||
{ $$ = false; }
|
||||
|
||||
%%
|
||||
|
||||
int yyerror(const char msg[])
|
||||
|
|
|
@ -216,6 +216,8 @@ ESCSEQ (\\([^\n]|[0-7]+|x[[:xdigit:]]+))
|
|||
}
|
||||
}
|
||||
|
||||
#{OWS}@no-test.* return TOK_NO_TEST;
|
||||
|
||||
#.* /* eat comments */
|
||||
|
||||
{WS} /* eat whitespace */
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
1 /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/coverage.coverage-blacklist/coverage-blacklist.bro, line 13 print cover me;
|
||||
1 /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/coverage.coverage-blacklist/coverage-blacklist.bro, line 17 print always executed;
|
||||
0 /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/coverage.coverage-blacklist/coverage-blacklist.bro, line 26 print also impossible, but included in code coverage analysis;
|
||||
1 /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/coverage.coverage-blacklist/coverage-blacklist.bro, line 29 print success;
|
||||
1 /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/coverage.coverage-blacklist/coverage-blacklist.bro, line 5 print first;
|
29
testing/btest/coverage/coverage-blacklist.bro
Normal file
29
testing/btest/coverage/coverage-blacklist.bro
Normal file
|
@ -0,0 +1,29 @@
|
|||
# @TEST-EXEC: BROFILER_FILE=coverage bro -b %INPUT
|
||||
# @TEST-EXEC: grep %INPUT coverage | sort -k2 >output
|
||||
# @TEST-EXEC: btest-diff output
|
||||
|
||||
print "first";
|
||||
|
||||
if ( F )
|
||||
{ # @no-test
|
||||
print "hello";
|
||||
print "world";
|
||||
}
|
||||
|
||||
print "cover me";
|
||||
|
||||
if ( T )
|
||||
{
|
||||
print "always executed";
|
||||
}
|
||||
|
||||
print "don't cover me"; # @no-test
|
||||
|
||||
if ( 0 + 0 == 1 ) print "impossible"; # @no-test
|
||||
|
||||
if ( 1 == 0 )
|
||||
{
|
||||
print "also impossible, but included in code coverage analysis";
|
||||
}
|
||||
|
||||
print "success";
|
Loading…
Add table
Add a link
Reference in a new issue