// Copyright 2014 Google Inc. All rights reserved. // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. package taskqueue import ( "errors" "fmt" "reflect" "testing" "google.golang.org/appengine" "google.golang.org/appengine/internal" "google.golang.org/appengine/internal/aetesting" pb "google.golang.org/appengine/internal/taskqueue" ) func TestAddErrors(t *testing.T) { var tests = []struct { err, want error sameErr bool // if true, should return err exactly }{ { err: &internal.APIError{ Service: "taskqueue", Code: int32(pb.TaskQueueServiceError_TASK_ALREADY_EXISTS), }, want: ErrTaskAlreadyAdded, }, { err: &internal.APIError{ Service: "taskqueue", Code: int32(pb.TaskQueueServiceError_TOMBSTONED_TASK), }, want: ErrTaskAlreadyAdded, }, { err: &internal.APIError{ Service: "taskqueue", Code: int32(pb.TaskQueueServiceError_UNKNOWN_QUEUE), }, want: errors.New("not used"), sameErr: true, }, } for _, tc := range tests { c := aetesting.FakeSingleContext(t, "taskqueue", "Add", func(req *pb.TaskQueueAddRequest, res *pb.TaskQueueAddResponse) error { // don't fill in any of the response return tc.err }) task := &Task{Path: "/worker", Method: "PULL"} _, err := Add(c, task, "a-queue") want := tc.want if tc.sameErr { want = tc.err } if err != want { t.Errorf("Add with tc.err = %v, got %#v, want = %#v", tc.err, err, want) } } } func TestAddMulti(t *testing.T) { c := aetesting.FakeSingleContext(t, "taskqueue", "BulkAdd", func(req *pb.TaskQueueBulkAddRequest, res *pb.TaskQueueBulkAddResponse) error { res.Taskresult = []*pb.TaskQueueBulkAddResponse_TaskResult{ { Result: pb.TaskQueueServiceError_OK.Enum(), }, { Result: pb.TaskQueueServiceError_TASK_ALREADY_EXISTS.Enum(), }, { Result: pb.TaskQueueServiceError_TOMBSTONED_TASK.Enum(), }, { Result: pb.TaskQueueServiceError_INTERNAL_ERROR.Enum(), }, } return nil }) tasks := []*Task{ {Path: "/worker", Method: "PULL"}, {Path: "/worker", Method: "PULL"}, {Path: "/worker", Method: "PULL"}, {Path: "/worker", Method: "PULL"}, } r, err := AddMulti(c, tasks, "a-queue") if len(r) != len(tasks) { t.Fatalf("AddMulti returned %d tasks, want %d", len(r), len(tasks)) } want := appengine.MultiError{ nil, ErrTaskAlreadyAdded, ErrTaskAlreadyAdded, &internal.APIError{ Service: "taskqueue", Code: int32(pb.TaskQueueServiceError_INTERNAL_ERROR), }, } if !reflect.DeepEqual(err, want) { t.Errorf("AddMulti got %v, wanted %v", err, want) } } func TestAddWithEmptyPath(t *testing.T) { c := aetesting.FakeSingleContext(t, "taskqueue", "Add", func(req *pb.TaskQueueAddRequest, res *pb.TaskQueueAddResponse) error { if got, want := string(req.Url), "/_ah/queue/a-queue"; got != want { return fmt.Errorf("req.Url = %q; want %q", got, want) } return nil }) if _, err := Add(c, &Task{}, "a-queue"); err != nil { t.Fatalf("Add: %v", err) } }