mirror of
https://github.com/mudler/LocalAI.git
synced 2026-02-14 08:31:10 -05:00
187 lines
4.7 KiB
Go
187 lines
4.7 KiB
Go
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), // override
|
|
)
|
|
|
|
// Create watchdog to verify
|
|
wd := model.NewWatchDog(
|
|
model.WithProcessManager(newMockProcessManager()),
|
|
model.WithLRULimit(3),
|
|
model.WithLRULimit(7), // override
|
|
)
|
|
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)) // default
|
|
})
|
|
|
|
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))
|
|
|
|
// Memory reclaimer should use defaults
|
|
enabled, threshold := wd.GetMemoryReclaimerSettings()
|
|
Expect(enabled).To(BeFalse())
|
|
Expect(threshold).To(Equal(model.DefaultMemoryReclaimerThreshold))
|
|
})
|
|
})
|
|
})
|