Spaces:
Configuration error
Configuration error
package concurrency_test | |
import ( | |
"context" | |
"fmt" | |
"time" | |
. "github.com/mudler/LocalAI/pkg/concurrency" | |
. "github.com/onsi/ginkgo/v2" | |
. "github.com/onsi/gomega" | |
) | |
var _ = Describe("pkg/concurrency unit tests", func() { | |
It("can be used to recieve a result across goroutines", func() { | |
jr, wjr := NewJobResult[string, string]("foo") | |
Expect(jr).ToNot(BeNil()) | |
Expect(wjr).ToNot(BeNil()) | |
go func(wjr *WritableJobResult[string, string]) { | |
time.Sleep(time.Second * 5) | |
wjr.SetResult("bar", nil) | |
}(wjr) | |
resPtr, err := jr.Wait(context.Background()) | |
Expect(err).To(BeNil()) | |
Expect(jr.Request).ToNot(BeNil()) | |
Expect(*jr.Request()).To(Equal("foo")) | |
Expect(resPtr).ToNot(BeNil()) | |
Expect(*resPtr).To(Equal("bar")) | |
}) | |
It("can be used to recieve an error across goroutines", func() { | |
jr, wjr := NewJobResult[string, string]("foo") | |
Expect(jr).ToNot(BeNil()) | |
Expect(wjr).ToNot(BeNil()) | |
go func(wjr *WritableJobResult[string, string]) { | |
time.Sleep(time.Second * 5) | |
wjr.SetResult("", fmt.Errorf("test")) | |
}(wjr) | |
_, err := jr.Wait(context.Background()) | |
Expect(jr.Request).ToNot(BeNil()) | |
Expect(*jr.Request()).To(Equal("foo")) | |
Expect(err).ToNot(BeNil()) | |
Expect(err).To(MatchError("test")) | |
}) | |
It("can properly handle timeouts", func() { | |
jr, wjr := NewJobResult[string, string]("foo") | |
Expect(jr).ToNot(BeNil()) | |
Expect(wjr).ToNot(BeNil()) | |
go func(wjr *WritableJobResult[string, string]) { | |
time.Sleep(time.Second * 5) | |
wjr.SetResult("bar", nil) | |
}(wjr) | |
timeout1s, c1 := context.WithTimeoutCause(context.Background(), time.Second, fmt.Errorf("timeout")) | |
timeout10s, c2 := context.WithTimeoutCause(context.Background(), time.Second*10, fmt.Errorf("timeout")) | |
_, err := jr.Wait(timeout1s) | |
Expect(jr.Request).ToNot(BeNil()) | |
Expect(*jr.Request()).To(Equal("foo")) | |
Expect(err).ToNot(BeNil()) | |
Expect(err).To(MatchError(context.DeadlineExceeded)) | |
resPtr, err := jr.Wait(timeout10s) | |
Expect(jr.Request).ToNot(BeNil()) | |
Expect(*jr.Request()).To(Equal("foo")) | |
Expect(err).To(BeNil()) | |
Expect(resPtr).ToNot(BeNil()) | |
Expect(*resPtr).To(Equal("bar")) | |
// Is this needed? Cleanup Either Way. | |
c1() | |
c2() | |
}) | |
}) | |