2020-04-05 00:20:50 -06:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2017-01-16 22:58:58 -07:00
package process
import (
2019-11-30 07:40:22 -07:00
"context"
2017-01-16 22:58:58 -07:00
"testing"
2017-11-13 07:51:45 -07:00
"time"
2017-01-16 22:58:58 -07:00
"github.com/stretchr/testify/assert"
)
2021-02-03 14:36:38 -07:00
func TestGetManager ( t * testing . T ) {
go func ( ) {
// test race protection
_ = GetManager ( )
} ( )
pm := GetManager ( )
assert . NotNil ( t , pm )
}
2021-11-30 13:06:32 -07:00
func TestManager_AddContext ( t * testing . T ) {
pm := Manager { processes : make ( map [ IDType ] * Process ) , next : 1 }
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
ctx , cancel := context . WithCancel ( context . Background ( ) )
defer cancel ( )
p1Ctx , _ , finished := pm . AddContext ( ctx , "foo" )
defer finished ( )
assert . NotEmpty ( t , GetContext ( p1Ctx ) . GetPID ( ) , "expected to get non-empty pid" )
p2Ctx , _ , finished := pm . AddContext ( p1Ctx , "bar" )
defer finished ( )
assert . NotEmpty ( t , GetContext ( p2Ctx ) . GetPID ( ) , "expected to get non-empty pid" )
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
assert . NotEqual ( t , GetContext ( p1Ctx ) . GetPID ( ) , GetContext ( p2Ctx ) . GetPID ( ) , "expected to get different pids %s == %s" , GetContext ( p2Ctx ) . GetPID ( ) , GetContext ( p1Ctx ) . GetPID ( ) )
assert . Equal ( t , GetContext ( p1Ctx ) . GetPID ( ) , GetContext ( p2Ctx ) . GetParent ( ) . GetPID ( ) , "expected to get pid %s got %s" , GetContext ( p1Ctx ) . GetPID ( ) , GetContext ( p2Ctx ) . GetParent ( ) . GetPID ( ) )
2017-01-16 22:58:58 -07:00
}
2019-11-30 07:40:22 -07:00
func TestManager_Cancel ( t * testing . T ) {
2021-11-30 13:06:32 -07:00
pm := Manager { processes : make ( map [ IDType ] * Process ) , next : 1 }
2019-11-30 07:40:22 -07:00
2021-11-30 13:06:32 -07:00
ctx , _ , finished := pm . AddContext ( context . Background ( ) , "foo" )
defer finished ( )
pm . Cancel ( GetPID ( ctx ) )
select {
case <- ctx . Done ( ) :
default :
assert . Fail ( t , "Cancel should cancel the provided context" )
}
finished ( )
2019-11-30 07:40:22 -07:00
2021-11-30 13:06:32 -07:00
ctx , cancel , finished := pm . AddContext ( context . Background ( ) , "foo" )
defer finished ( )
cancel ( )
2019-11-30 07:40:22 -07:00
select {
case <- ctx . Done ( ) :
default :
assert . Fail ( t , "Cancel should cancel the provided context" )
}
2021-11-30 13:06:32 -07:00
finished ( )
2019-11-30 07:40:22 -07:00
}
2017-01-16 22:58:58 -07:00
func TestManager_Remove ( t * testing . T ) {
2021-11-30 13:06:32 -07:00
pm := Manager { processes : make ( map [ IDType ] * Process ) , next : 1 }
ctx , cancel := context . WithCancel ( context . Background ( ) )
defer cancel ( )
p1Ctx , _ , finished := pm . AddContext ( ctx , "foo" )
defer finished ( )
assert . NotEmpty ( t , GetContext ( p1Ctx ) . GetPID ( ) , "expected to have non-empty PID" )
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
p2Ctx , _ , finished := pm . AddContext ( p1Ctx , "bar" )
defer finished ( )
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
assert . NotEqual ( t , GetContext ( p1Ctx ) . GetPID ( ) , GetContext ( p2Ctx ) . GetPID ( ) , "expected to get different pids got %s == %s" , GetContext ( p2Ctx ) . GetPID ( ) , GetContext ( p1Ctx ) . GetPID ( ) )
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
pm . Remove ( GetPID ( p2Ctx ) )
2017-01-16 22:58:58 -07:00
2021-11-30 13:06:32 -07:00
_ , exists := pm . processes [ GetPID ( p2Ctx ) ]
assert . False ( t , exists , "PID %d is in the list but shouldn't" , GetPID ( p2Ctx ) )
2017-01-16 22:58:58 -07:00
}
2017-11-13 07:51:45 -07:00
func TestExecTimeoutNever ( t * testing . T ) {
// TODO Investigate how to improve the time elapsed per round.
maxLoops := 10
for i := 1 ; i < maxLoops ; i ++ {
_ , stderr , err := GetManager ( ) . ExecTimeout ( 5 * time . Second , "ExecTimeout" , "git" , "--version" )
if err != nil {
t . Fatalf ( "git --version: %v(%s)" , err , stderr )
}
}
}
func TestExecTimeoutAlways ( t * testing . T ) {
maxLoops := 100
for i := 1 ; i < maxLoops ; i ++ {
_ , stderr , err := GetManager ( ) . ExecTimeout ( 100 * time . Microsecond , "ExecTimeout" , "sleep" , "5" )
// TODO Simplify logging and errors to get precise error type. E.g. checking "if err != context.DeadlineExceeded".
if err == nil {
t . Fatalf ( "sleep 5 secs: %v(%s)" , err , stderr )
}
}
}