| | package model_test |
| |
|
| | import ( |
| | "time" |
| |
|
| | "github.com/mudler/LocalAI/pkg/model" |
| | . "github.com/onsi/ginkgo/v2" |
| | . "github.com/onsi/gomega" |
| | ) |
| |
|
| | var _ = Describe("WatchDogOptions", func() { |
| | Context("DefaultWatchDogOptions", func() { |
| | It("should return sensible defaults", func() { |
| | opts := model.DefaultWatchDogOptions() |
| |
|
| | Expect(opts).ToNot(BeNil()) |
| | }) |
| | }) |
| |
|
| | Context("NewWatchDogOptions", func() { |
| | It("should apply options in order", func() { |
| | pm := newMockProcessManager() |
| | opts := model.NewWatchDogOptions( |
| | model.WithProcessManager(pm), |
| | model.WithBusyTimeout(10*time.Minute), |
| | model.WithIdleTimeout(20*time.Minute), |
| | model.WithBusyCheck(true), |
| | model.WithIdleCheck(true), |
| | model.WithLRULimit(5), |
| | model.WithMemoryReclaimer(true, 0.85), |
| | ) |
| |
|
| | Expect(opts).ToNot(BeNil()) |
| | }) |
| |
|
| | It("should allow overriding options", func() { |
| | opts := model.NewWatchDogOptions( |
| | model.WithLRULimit(3), |
| | model.WithLRULimit(7), |
| | ) |
| |
|
| | |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(newMockProcessManager()), |
| | model.WithLRULimit(3), |
| | model.WithLRULimit(7), |
| | ) |
| | Expect(wd.GetLRULimit()).To(Equal(7)) |
| |
|
| | Expect(opts).ToNot(BeNil()) |
| | }) |
| | }) |
| |
|
| | Context("Individual Options", func() { |
| | var pm *mockProcessManager |
| |
|
| | BeforeEach(func() { |
| | pm = newMockProcessManager() |
| | }) |
| |
|
| | It("WithProcessManager should set process manager", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | ) |
| | Expect(wd).ToNot(BeNil()) |
| | }) |
| |
|
| | It("WithBusyTimeout should set busy timeout", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithBusyTimeout(7*time.Minute), |
| | ) |
| | Expect(wd).ToNot(BeNil()) |
| | }) |
| |
|
| | It("WithIdleTimeout should set idle timeout", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithIdleTimeout(25*time.Minute), |
| | ) |
| | Expect(wd).ToNot(BeNil()) |
| | }) |
| |
|
| | It("WithBusyCheck should enable busy checking", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithBusyCheck(true), |
| | ) |
| | Expect(wd).ToNot(BeNil()) |
| | }) |
| |
|
| | It("WithIdleCheck should enable idle checking", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithIdleCheck(true), |
| | ) |
| | Expect(wd).ToNot(BeNil()) |
| | }) |
| |
|
| | It("WithLRULimit should set LRU limit", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithLRULimit(10), |
| | ) |
| | Expect(wd.GetLRULimit()).To(Equal(10)) |
| | }) |
| |
|
| | It("WithMemoryReclaimer should set both enabled and threshold", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithMemoryReclaimer(true, 0.88), |
| | ) |
| | enabled, threshold := wd.GetMemoryReclaimerSettings() |
| | Expect(enabled).To(BeTrue()) |
| | Expect(threshold).To(Equal(0.88)) |
| | }) |
| |
|
| | It("WithMemoryReclaimerEnabled should set enabled flag only", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithMemoryReclaimerEnabled(true), |
| | ) |
| | enabled, _ := wd.GetMemoryReclaimerSettings() |
| | Expect(enabled).To(BeTrue()) |
| | }) |
| |
|
| | It("WithMemoryReclaimerThreshold should set threshold only", func() { |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithMemoryReclaimerThreshold(0.75), |
| | ) |
| | _, threshold := wd.GetMemoryReclaimerSettings() |
| | Expect(threshold).To(Equal(0.75)) |
| | }) |
| | }) |
| |
|
| | Context("Option Combinations", func() { |
| | It("should work with all options combined", func() { |
| | pm := newMockProcessManager() |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithBusyTimeout(3*time.Minute), |
| | model.WithIdleTimeout(10*time.Minute), |
| | model.WithBusyCheck(true), |
| | model.WithIdleCheck(true), |
| | model.WithLRULimit(2), |
| | model.WithMemoryReclaimerEnabled(true), |
| | model.WithMemoryReclaimerThreshold(0.92), |
| | ) |
| |
|
| | Expect(wd).ToNot(BeNil()) |
| | Expect(wd.GetLRULimit()).To(Equal(2)) |
| |
|
| | enabled, threshold := wd.GetMemoryReclaimerSettings() |
| | Expect(enabled).To(BeTrue()) |
| | Expect(threshold).To(Equal(0.92)) |
| | }) |
| |
|
| | It("should work with no options (all defaults)", func() { |
| | wd := model.NewWatchDog() |
| |
|
| | Expect(wd).ToNot(BeNil()) |
| | Expect(wd.GetLRULimit()).To(Equal(0)) |
| |
|
| | enabled, threshold := wd.GetMemoryReclaimerSettings() |
| | Expect(enabled).To(BeFalse()) |
| | Expect(threshold).To(Equal(model.DefaultMemoryReclaimerThreshold)) |
| | }) |
| |
|
| | It("should allow partial configuration", func() { |
| | pm := newMockProcessManager() |
| | wd := model.NewWatchDog( |
| | model.WithProcessManager(pm), |
| | model.WithLRULimit(3), |
| | ) |
| |
|
| | Expect(wd).ToNot(BeNil()) |
| | Expect(wd.GetLRULimit()).To(Equal(3)) |
| |
|
| | |
| | enabled, threshold := wd.GetMemoryReclaimerSettings() |
| | Expect(enabled).To(BeFalse()) |
| | Expect(threshold).To(Equal(model.DefaultMemoryReclaimerThreshold)) |
| | }) |
| | }) |
| | }) |
| |
|