// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package watch
import (
"testing"
"time"
)
func init ( ) {
watchFuncFactory [ "noop" ] = noopWatch
}
func noopWatch ( params map [ string ] interface { } ) ( WatcherFunc , error ) {
fn := func ( p * Plan ) ( BlockingParamVal , interface { } , error ) {
idx := WaitIndexVal ( 0 )
if i , ok := p . lastParamVal . ( WaitIndexVal ) ; ok {
idx = i
}
return idx + 1 , uint64 ( idx + 1 ) , nil
}
return fn , nil
}
func mustParse ( t * testing . T , q string ) * Plan {
params := makeParams ( t , q )
plan , err := Parse ( params )
if err != nil {
t . Fatalf ( "err: %v" , err )
}
return plan
}
func TestRun_Stop ( t * testing . T ) {
t . Parallel ( )
plan := mustParse ( t , ` { "type":"noop"} ` )
var expect uint64 = 1
doneCh := make ( chan struct { } )
plan . Handler = func ( idx uint64 , val interface { } ) {
if idx != expect {
t . Fatalf ( "Bad: %d %d" , expect , idx )
}
if val != expect {
t . Fatalf ( "Bad: %d %d" , expect , val )
}
if expect == 1 {
close ( doneCh )
}
expect ++
}
errCh := make ( chan error , 1 )
go func ( ) {
errCh <- plan . Run ( "127.0.0.1:8500" )
} ( )
select {
case <- doneCh :
plan . Stop ( )
case <- time . After ( 1 * time . Second ) :
t . Fatalf ( "handler never ran" )
}
select {
case err := <- errCh :
if err != nil {
t . Fatalf ( "err: %v" , err )
}
case <- time . After ( 1 * time . Second ) :
t . Fatalf ( "watcher didn't exit" )
}
if expect == 1 {
t . Fatalf ( "Bad: %d" , expect )
}
}
func TestRun_Stop_Hybrid ( t * testing . T ) {
t . Parallel ( )
plan := mustParse ( t , ` { "type":"noop"} ` )
var expect uint64 = 1
doneCh := make ( chan struct { } )
plan . HybridHandler = func ( blockParamVal BlockingParamVal , val interface { } ) {
idxVal , ok := blockParamVal . ( WaitIndexVal )
if ! ok {
t . Fatalf ( "expected index-based watch" )
}
idx := uint64 ( idxVal )
if idx != expect {
t . Fatalf ( "Bad: %d %d" , expect , idx )
}
if val != expect {
t . Fatalf ( "Bad: %d %d" , expect , val )
}
if expect == 1 {
close ( doneCh )
}
expect ++
}
errCh := make ( chan error , 1 )
go func ( ) {
errCh <- plan . Run ( "127.0.0.1:8500" )
} ( )
select {
case <- doneCh :
plan . Stop ( )
case <- time . After ( 1 * time . Second ) :
t . Fatalf ( "handler never ran" )
}
select {
case err := <- errCh :
if err != nil {
t . Fatalf ( "err: %v" , err )
}
case <- time . After ( 1 * time . Second ) :
t . Fatalf ( "watcher didn't exit" )
}
if expect == 1 {
t . Fatalf ( "Bad: %d" , expect )
}
}
func TestRunWithClientAndLogger_NilLogger ( t * testing . T ) {
t . Parallel ( )
plan := mustParse ( t , ` { "type":"noop"} ` )
errCh := make ( chan error , 1 )
go func ( ) {
errCh <- plan . RunWithClientAndHclog ( nil , nil )
} ( )
plan . Stop ( )
select {
case err := <- errCh :
if err != nil {
t . Fatalf ( "err: %v" , err )
}
case <- time . After ( 1 * time . Second ) :
t . Fatalf ( "watcher didn't exit" )
}
}