2020-04-05 11:50:50 +05:30
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 23:50:29 +05:30
// SPDX-License-Identifier: MIT
2020-04-05 11:50:50 +05:30
2017-01-17 11:28:58 +05:30
package process
import (
2019-11-30 20:10:22 +05:30
"context"
2017-01-17 11:28:58 +05:30
"testing"
2017-11-13 20:21:45 +05:30
"time"
2017-01-17 11:28:58 +05:30
"github.com/stretchr/testify/assert"
)
2021-02-04 03:06:38 +05:30
func TestGetManager ( t * testing . T ) {
go func ( ) {
// test race protection
_ = GetManager ( )
} ( )
pm := GetManager ( )
assert . NotNil ( t , pm )
}
2021-12-01 01:36:32 +05:30
func TestManager_AddContext ( t * testing . T ) {
2022-03-31 22:31:43 +05:30
pm := Manager { processMap : make ( map [ IDType ] * process ) , next : 1 }
2017-01-17 11:28:58 +05:30
2021-12-01 01:36:32 +05:30
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-17 11:28:58 +05:30
2021-12-01 01:36:32 +05:30
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-17 11:28:58 +05:30
}
2019-11-30 20:10:22 +05:30
func TestManager_Cancel ( t * testing . T ) {
2022-03-31 22:31:43 +05:30
pm := Manager { processMap : make ( map [ IDType ] * process ) , next : 1 }
2019-11-30 20:10:22 +05:30
2021-12-01 01:36:32 +05:30
ctx , _ , finished := pm . AddContext ( context . Background ( ) , "foo" )
defer finished ( )
pm . Cancel ( GetPID ( ctx ) )
select {
case <- ctx . Done ( ) :
default :
2023-10-11 16:32:24 +05:30
assert . FailNow ( t , "Cancel should cancel the provided context" )
2021-12-01 01:36:32 +05:30
}
finished ( )
2019-11-30 20:10:22 +05:30
2021-12-01 01:36:32 +05:30
ctx , cancel , finished := pm . AddContext ( context . Background ( ) , "foo" )
defer finished ( )
cancel ( )
2019-11-30 20:10:22 +05:30
select {
case <- ctx . Done ( ) :
default :
2023-10-11 16:32:24 +05:30
assert . FailNow ( t , "Cancel should cancel the provided context" )
2019-11-30 20:10:22 +05:30
}
2021-12-01 01:36:32 +05:30
finished ( )
2019-11-30 20:10:22 +05:30
}
2017-01-17 11:28:58 +05:30
func TestManager_Remove ( t * testing . T ) {
2022-03-31 22:31:43 +05:30
pm := Manager { processMap : make ( map [ IDType ] * process ) , next : 1 }
2021-12-01 01:36:32 +05:30
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-17 11:28:58 +05:30
2021-12-01 01:36:32 +05:30
p2Ctx , _ , finished := pm . AddContext ( p1Ctx , "bar" )
defer finished ( )
2017-01-17 11:28:58 +05:30
2021-12-01 01:36:32 +05:30
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-17 11:28:58 +05:30
2023-02-04 04:41:48 +05:30
finished ( )
2017-01-17 11:28:58 +05:30
2022-03-31 22:31:43 +05:30
_ , exists := pm . processMap [ GetPID ( p2Ctx ) ]
2021-12-01 01:36:32 +05:30
assert . False ( t , exists , "PID %d is in the list but shouldn't" , GetPID ( p2Ctx ) )
2017-01-17 11:28:58 +05:30
}
2017-11-13 20:21:45 +05:30
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 )
}
}
}