// Copyright 2011 Xing Xing All rights reserved. // Use of this source code is governed by a MIT // license that can be found in the LICENSE file. /* This module is Gearman API for golang. The protocol was implemented by native way. */ package gearman import ( "github.com/mikespook/gearman-go/client" "github.com/mikespook/gearman-go/worker" "strings" "sync" "testing" "time" ) const ( STR = "The gearman-go is a pure go implemented library." GEARMAND = "127.0.0.1:4730" ) func ToUpper(job worker.Job) ([]byte, error) { data := job.Data() data = []byte(strings.ToUpper(string(data))) return data, nil } func Sleep(job worker.Job) ([]byte, error) { time.Sleep(time.Second * 5) return nil, nil } func TestJobs(t *testing.T) { w := worker.New(worker.Unlimited) if err := w.AddServer("tcp4", GEARMAND); err != nil { t.Error(err) return } defer w.Close() t.Log("Servers added...") if err := w.AddFunc("ToUpper", ToUpper, 0); err != nil { t.Error(err) return } if err := w.AddFunc("Sleep", Sleep, 0); err != nil { t.Error(err) return } t.Log("Functions added...") w.ErrorHandler = func(e error) { t.Error(e) } if err := w.Ready(); err != nil { t.Error(err) return } go w.Work() t.Log("Worker is running...") c, err := client.New("tcp4", GEARMAND) if err != nil { t.Error(err) return } defer c.Close() c.ErrorHandler = func(e error) { t.Log(e) } { var w sync.WaitGroup jobHandler := func(job *client.Response) { upper := strings.ToUpper(STR) if string(job.Data) != upper { t.Errorf("%s expected, got %s", upper, job.Data) } w.Done() } w.Add(1) handle, err := c.Do("ToUpper", []byte(STR), client.JOB_NORMAL, jobHandler) if err != nil { t.Error(err) return } w.Wait() status, err := c.Status(handle) if err != nil { t.Error(err) return } if status.Known { t.Errorf("%s shouldn't be known", status.Handle) return } if status.Running { t.Errorf("%s shouldn't be running", status.Handle) } } { handle, err := c.DoBg("Sleep", nil, client.JOB_NORMAL) if err != nil { t.Error(err) return } time.Sleep(time.Second) status, err := c.Status(handle) if err != nil { t.Error(err) return } if !status.Known { t.Errorf("%s should be known", status.Handle) return } if !status.Running { t.Errorf("%s should be running", status.Handle) } } { status, err := c.Status("not exists handle") if err != nil { t.Error(err) return } if status.Known { t.Errorf("%s shouldn't be known", status.Handle) return } if status.Running { t.Errorf("%s shouldn't be running", status.Handle) } } }