Merge pull request #41 from draxil/master
Better Work() without Ready() behaviour, now with improved tests!
This commit is contained in:
commit
320155c608
@ -183,7 +183,11 @@ func (worker *Worker) Ready() (err error) {
|
|||||||
// Most of time, this should be evaluated in goroutine.
|
// Most of time, this should be evaluated in goroutine.
|
||||||
func (worker *Worker) Work() {
|
func (worker *Worker) Work() {
|
||||||
if ! worker.ready {
|
if ! worker.ready {
|
||||||
panic( "worker: Work() called before Ready()")
|
// didn't run Ready beforehand, so we'll have to do it:
|
||||||
|
err := worker.Ready()
|
||||||
|
if err != nil {
|
||||||
|
panic( err )
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -3,6 +3,7 @@ package worker
|
|||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var worker *Worker
|
var worker *Worker
|
||||||
@ -77,6 +78,92 @@ func TestWork(t *testing.T) {
|
|||||||
wg.Wait()
|
wg.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func TestWorkerClose(t *testing.T) {
|
func TestWorkerClose(t *testing.T) {
|
||||||
worker.Close()
|
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:
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user