2020-01-07 11:23:09 +00:00
// Copyright 2019 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.
package queue
import (
2020-01-31 00:09:39 +08:00
"sync"
2020-01-07 11:23:09 +00:00
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestLevelQueue ( t * testing . T ) {
handleChan := make ( chan * testData )
2022-01-22 21:22:14 +00:00
handle := func ( data ... Data ) [ ] Data {
2020-01-07 11:23:09 +00:00
assert . True ( t , len ( data ) == 2 )
for _ , datum := range data {
testDatum := datum . ( * testData )
handleChan <- testDatum
}
2022-01-22 21:22:14 +00:00
return nil
2020-01-07 11:23:09 +00:00
}
2020-01-31 00:09:39 +08:00
var lock sync . Mutex
2020-01-07 11:23:09 +00:00
queueShutdown := [ ] func ( ) { }
queueTerminate := [ ] func ( ) { }
2022-09-04 23:14:53 +08:00
tmpDir := t . TempDir ( )
2020-01-07 11:23:09 +00:00
queue , err := NewLevelQueue ( handle , LevelQueueConfiguration {
2020-02-02 23:19:58 +00:00
ByteFIFOQueueConfiguration : ByteFIFOQueueConfiguration {
WorkerPoolConfiguration : WorkerPoolConfiguration {
QueueLength : 20 ,
BatchLength : 2 ,
BlockTimeout : 1 * time . Second ,
BoostTimeout : 5 * time . Minute ,
BoostWorkers : 5 ,
MaxWorkers : 10 ,
} ,
Workers : 1 ,
2020-01-29 01:01:06 +00:00
} ,
DataDir : tmpDir ,
2020-01-07 11:23:09 +00:00
} , & testData { } )
assert . NoError ( t , err )
2021-05-15 15:22:26 +01:00
go queue . Run ( func ( shutdown func ( ) ) {
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
queueShutdown = append ( queueShutdown , shutdown )
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2021-05-15 15:22:26 +01:00
} , func ( terminate func ( ) ) {
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
queueTerminate = append ( queueTerminate , terminate )
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2020-01-07 11:23:09 +00:00
} )
test1 := testData { "A" , 1 }
test2 := testData { "B" , 2 }
err = queue . Push ( & test1 )
assert . NoError ( t , err )
go func ( ) {
2020-09-05 23:50:57 +01:00
err := queue . Push ( & test2 )
2020-01-07 11:23:09 +00:00
assert . NoError ( t , err )
} ( )
result1 := <- handleChan
assert . Equal ( t , test1 . TestString , result1 . TestString )
assert . Equal ( t , test1 . TestInt , result1 . TestInt )
result2 := <- handleChan
assert . Equal ( t , test2 . TestString , result2 . TestString )
assert . Equal ( t , test2 . TestInt , result2 . TestInt )
err = queue . Push ( test1 )
assert . Error ( t , err )
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
for _ , callback := range queueShutdown {
callback ( )
}
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2020-01-07 11:23:09 +00:00
time . Sleep ( 200 * time . Millisecond )
err = queue . Push ( & test1 )
assert . NoError ( t , err )
err = queue . Push ( & test2 )
assert . NoError ( t , err )
select {
case <- handleChan :
assert . Fail ( t , "Handler processing should have stopped" )
default :
}
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
for _ , callback := range queueTerminate {
callback ( )
}
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2020-01-07 11:23:09 +00:00
// Reopen queue
queue , err = NewWrappedQueue ( handle ,
WrappedQueueConfiguration {
Underlying : LevelQueueType ,
Config : LevelQueueConfiguration {
2020-02-02 23:19:58 +00:00
ByteFIFOQueueConfiguration : ByteFIFOQueueConfiguration {
WorkerPoolConfiguration : WorkerPoolConfiguration {
QueueLength : 20 ,
BatchLength : 2 ,
BlockTimeout : 1 * time . Second ,
BoostTimeout : 5 * time . Minute ,
BoostWorkers : 5 ,
MaxWorkers : 10 ,
} ,
Workers : 1 ,
2020-01-29 01:01:06 +00:00
} ,
DataDir : tmpDir ,
2020-01-07 11:23:09 +00:00
} ,
} , & testData { } )
assert . NoError ( t , err )
2021-05-15 15:22:26 +01:00
go queue . Run ( func ( shutdown func ( ) ) {
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
queueShutdown = append ( queueShutdown , shutdown )
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2021-05-15 15:22:26 +01:00
} , func ( terminate func ( ) ) {
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
queueTerminate = append ( queueTerminate , terminate )
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2020-01-07 11:23:09 +00:00
} )
result3 := <- handleChan
assert . Equal ( t , test1 . TestString , result3 . TestString )
assert . Equal ( t , test1 . TestInt , result3 . TestInt )
result4 := <- handleChan
assert . Equal ( t , test2 . TestString , result4 . TestString )
assert . Equal ( t , test2 . TestInt , result4 . TestInt )
2020-01-31 00:09:39 +08:00
lock . Lock ( )
2020-01-07 11:23:09 +00:00
for _ , callback := range queueShutdown {
callback ( )
}
for _ , callback := range queueTerminate {
callback ( )
}
2020-01-31 00:09:39 +08:00
lock . Unlock ( )
2020-01-07 11:23:09 +00:00
}