0a4489d1fe
* FIX: committed test froze * FIX: committed test had a race condition! * Added properly handled panic test * Timeouts so that these tests should fail now if something goes wrong instead of failing.
170 lines
3.2 KiB
Go
170 lines
3.2 KiB
Go
package worker
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
var worker *Worker
|
|
|
|
func init() {
|
|
worker = New(Unlimited)
|
|
}
|
|
|
|
func TestWorkerErrNoneAgents(t *testing.T) {
|
|
err := worker.Ready()
|
|
if err != ErrNoneAgents {
|
|
t.Error("ErrNoneAgents expected.")
|
|
}
|
|
}
|
|
|
|
func TestWorkerAddServer(t *testing.T) {
|
|
t.Log("Add local server 127.0.0.1:4730.")
|
|
if err := worker.AddServer(Network, "127.0.0.1:4730"); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
if l := len(worker.agents); l != 1 {
|
|
t.Log(worker.agents)
|
|
t.Error("The length of server list should be 1.")
|
|
}
|
|
}
|
|
|
|
func TestWorkerErrNoneFuncs(t *testing.T) {
|
|
err := worker.Ready()
|
|
if err != ErrNoneFuncs {
|
|
t.Error("ErrNoneFuncs expected.")
|
|
}
|
|
}
|
|
|
|
func foobar(job Job) ([]byte, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func TestWorkerAddFunction(t *testing.T) {
|
|
if err := worker.AddFunc("foobar", foobar, 0); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := worker.AddFunc("timeout", foobar, 5); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if l := len(worker.funcs); l != 2 {
|
|
t.Log(worker.funcs)
|
|
t.Errorf("The length of function map should be %d.", 2)
|
|
}
|
|
}
|
|
|
|
func TestWorkerRemoveFunc(t *testing.T) {
|
|
if err := worker.RemoveFunc("foobar"); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}
|
|
|
|
func TestWork(t *testing.T) {
|
|
var wg sync.WaitGroup
|
|
worker.JobHandler = func(job Job) error {
|
|
t.Logf("%s", job.Data())
|
|
wg.Done()
|
|
return nil
|
|
}
|
|
if err := worker.Ready(); err != nil {
|
|
t.Error(err)
|
|
return
|
|
}
|
|
go worker.Work()
|
|
wg.Add(1)
|
|
worker.Echo([]byte("Hello"))
|
|
wg.Wait()
|
|
}
|
|
|
|
|
|
func TestWorkerClose(t *testing.T) {
|
|
worker.Close()
|
|
}
|
|
|
|
func TestWorkWithoutReady(t * testing.T){
|
|
other_worker := New(Unlimited)
|
|
|
|
if err := other_worker.AddServer(Network, "127.0.0.1:4730"); err != nil {
|
|
t.Error(err)
|
|
}
|
|
if err := other_worker.AddFunc("gearman-go-workertest", foobar, 0); err != nil {
|
|
t.Error(err)
|
|
}
|
|
|
|
timeout := make(chan bool, 1)
|
|
done := make( chan bool, 1)
|
|
|
|
other_worker.JobHandler = func( j Job ) error {
|
|
if( ! other_worker.ready ){
|
|
t.Error("Worker not ready as expected");
|
|
}
|
|
done <-true
|
|
return nil
|
|
}
|
|
go func() {
|
|
time.Sleep(5 * time.Second)
|
|
timeout <- true
|
|
}()
|
|
|
|
go func(){
|
|
other_worker.Work();
|
|
}()
|
|
|
|
// With the all-in-one Work() we don't know if the
|
|
// worker is ready at this stage so we may have to wait a sec:
|
|
go func(){
|
|
tries := 3
|
|
for( tries > 0 ){
|
|
if other_worker.ready {
|
|
other_worker.Echo([]byte("Hello"))
|
|
break
|
|
}
|
|
|
|
// still waiting for it to be ready..
|
|
time.Sleep(1 * time.Second)
|
|
tries--
|
|
}
|
|
}()
|
|
|
|
// determine if we've finished or timed out:
|
|
select{
|
|
case <- timeout:
|
|
t.Error("Test timed out waiting for the worker")
|
|
case <- done:
|
|
}
|
|
}
|
|
|
|
func TestWorkWithoutReadyWithPanic(t * testing.T){
|
|
other_worker := New(Unlimited)
|
|
|
|
timeout := make(chan bool, 1)
|
|
done := make( chan bool, 1)
|
|
|
|
// Going to work with no worker setup.
|
|
// when Work (hopefully) calls Ready it will get an error which should cause it to panic()
|
|
go func(){
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
done <- true
|
|
return
|
|
}
|
|
t.Error("Work should raise a panic.")
|
|
done <- true
|
|
}()
|
|
other_worker.Work();
|
|
}()
|
|
go func() {
|
|
time.Sleep(2 * time.Second)
|
|
timeout <- true
|
|
}()
|
|
|
|
select{
|
|
case <- timeout:
|
|
t.Error("Test timed out waiting for the worker")
|
|
case <- done:
|
|
}
|
|
|
|
}
|