blob: 2a0ef846a0cf5d6b4fc04629e701465d628ace67 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can
// found in the LICENSE file.
package main
import (
"context"
"fmt"
"io/ioutil"
"os"
"reflect"
"sync"
"testing"
"time"
"go.fuchsia.dev/fuchsia/tools/debug/elflib"
)
type mockContext struct {
err error
}
func (ctx mockContext) Deadline() (time.Time, bool) {
return time.Time{}, true
}
func (ctx mockContext) Done() <-chan struct{} {
if ctx.err != nil {
c := make(chan struct{}, 1)
c <- struct{}{}
var rc <-chan struct{} = c
return rc
}
return nil
}
func (ctx mockContext) Err() error {
return ctx.err
}
func (ctx mockContext) Value(key interface{}) interface{} {
return ""
}
func mockWithReachableTimeout(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
return mockContext{err: context.DeadlineExceeded}, func() {}
}
func mockWithUnreachableTimeout(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
return mockContext{}, func() {}
}
func TestWorker(t *testing.T) {
buildID := "foo"
filename := fmt.Sprintf("%s.debug", buildID)
tmpFile, err := ioutil.TempFile("", filename)
if err != nil {
t.Fatalf("failed to create tempfile: %v", err)
}
timeout := 1 * time.Second
defer os.Remove(tmpFile.Name())
binaryFileRef := elflib.NewBinaryFileRef(tmpFile.Name(), buildID)
ctx := context.Background()
t.Run("run worker", func(t *testing.T) {
jobs := make(chan job, 1)
errs := make(chan error, 1)
testJob := newZxdbJob(binaryFileRef)
jobs <- testJob
close(jobs)
bkt := &mockBucket{
contents: map[string]bool{"other.debug": true},
}
var wg sync.WaitGroup
wg.Add(1)
worker(ctx, bkt, &wg, mockWithUnreachableTimeout, timeout, jobs, errs)
wg.Wait()
close(errs)
if err := <-errs; err != nil {
t.Fatalf("expected nil error, got %v", err)
}
})
t.Run("run worker with timeout", func(t *testing.T) {
jobs := make(chan job, 1)
errs := make(chan error, 1)
testJob := newZxdbJob(binaryFileRef)
jobs <- testJob
close(jobs)
bkt := &mockBucket{
contents: map[string]bool{"other.debug": true},
}
var wg sync.WaitGroup
wg.Add(1)
worker(ctx, bkt, &wg, mockWithReachableTimeout, timeout, jobs, errs)
wg.Wait()
close(errs)
err := <-errs
if err == nil {
t.Fatalf("expected error, got nil")
}
if _, ok := err.(jobTimeout); !ok {
t.Fatalf("expected jobTimeout error, got %v", reflect.TypeOf(err))
}
})
}