@ -7,9 +7,12 @@
package dtmsvr
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/metadata"
)
func TestUtils ( t * testing . T ) {
@ -29,3 +32,87 @@ func TestSetNextCron(t *testing.T) {
tg . TimeoutToFail = 3
assert . Equal ( t , int64 ( 3 ) , tg . getNextCronInterval ( cronReset ) )
}
func TestNewAsyncContext ( t * testing . T ) {
var key testContextType = "key"
var value testContextType = "value"
ctxWithValue := context . WithValue ( context . Background ( ) , key , value )
newCtx := NewAsyncContext ( ctxWithValue )
assert . Equal ( t , ctxWithValue . Value ( key ) , newCtx . Value ( key ) )
var ctx context . Context
newCtx = NewAsyncContext ( ctx )
assert . Nil ( t , newCtx )
}
func TestAsyncContext ( t * testing . T ) {
ctx := context . Background ( )
cancelCtx2 , cancel := context . WithCancel ( ctx )
async := NewAsyncContext ( cancelCtx2 )
cancelCtx3 , cancel2 := context . WithCancel ( async )
defer cancel2 ( )
cancel ( )
select {
case <- cancelCtx2 . Done ( ) :
default :
assert . Failf ( t , "context should be canceled" , "context should be canceled" )
}
select {
case <- cancelCtx3 . Done ( ) :
assert . Failf ( t , "context should not be canceled" , "context should not be canceled" )
default :
}
}
type testContextType string
func TestAsyncContextRecursive ( t * testing . T ) {
var key testContextType = "key"
var key2 testContextType = "key2"
var key3 testContextType = "key3"
var value testContextType = "value"
var value2 testContextType = "value2"
var value3 testContextType = "value3"
var nestedKey testContextType = "nested_key"
var nestedValue testContextType = "nested_value"
ctxWithValue := context . WithValue ( context . Background ( ) , key , value )
nestedCtx := context . WithValue ( ctxWithValue , nestedKey , nestedValue )
cancelCtxx , cancel := context . WithCancel ( nestedCtx )
defer cancel ( )
timerCtxx , cancel2 := context . WithTimeout ( cancelCtxx , time . Duration ( 10 ) * time . Second )
defer cancel2 ( )
timer2 := context . WithValue ( timerCtxx , key2 , value2 )
timer3 := context . WithValue ( timer2 , key3 , value3 )
newCtx := NewAsyncContext ( timer3 )
assert . Equal ( t , timer3 . Value ( nestedKey ) , newCtx . Value ( nestedKey ) )
assert . Equal ( t , timer3 . Value ( key ) , newCtx . Value ( key ) )
assert . Equal ( t , timer3 . Value ( key2 ) , newCtx . Value ( key2 ) )
assert . Equal ( t , timer3 . Value ( key3 ) , newCtx . Value ( key3 ) )
}
func TestCopyContextWithMetadata ( t * testing . T ) {
md := metadata . New ( map [ string ] string { "key" : "value" } )
ctx := metadata . NewIncomingContext ( context . Background ( ) , md )
ctx = metadata . NewOutgoingContext ( ctx , md )
newCtx := NewAsyncContext ( ctx )
copiedMD , ok := metadata . FromIncomingContext ( newCtx )
assert . True ( t , ok )
assert . Equal ( t , 1 , len ( copiedMD [ "key" ] ) )
assert . Equal ( t , "value" , copiedMD [ "key" ] [ 0 ] )
copiedMD , ok = metadata . FromOutgoingContext ( newCtx )
assert . True ( t , ok )
assert . Equal ( t , 1 , len ( copiedMD [ "key" ] ) )
assert . Equal ( t , "value" , copiedMD [ "key" ] [ 0 ] )
}
func BenchmarkCopyContext ( b * testing . B ) {
var key testContextType = "key"
var value testContextType = "value"
ctx := context . WithValue ( context . Background ( ) , key , value )
b . ResetTimer ( )
for i := 0 ; i < b . N ; i ++ {
NewAsyncContext ( ctx )
}
}