Initial commit: DSH Web Manager
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestIntentReservationConcurrencyAndRestart(t *testing.T) {
|
||||
path := filepath.Join(t.TempDir(), "store.db")
|
||||
s, err := Open(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.EnsureIntents(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var wg sync.WaitGroup
|
||||
result := make(chan error, 30)
|
||||
for n := 0; n < 30; n++ {
|
||||
wg.Add(1)
|
||||
go func(n int) {
|
||||
defer wg.Done()
|
||||
if n%2 == 0 {
|
||||
result <- s.ReserveIntent(Intent{ID: ID(), UID: "u", Name: "test", Version: "1.2.3"})
|
||||
} else {
|
||||
result <- s.ReserveInstance(Instance{ID: ID(), UID: "u"})
|
||||
}
|
||||
}(n)
|
||||
}
|
||||
wg.Wait()
|
||||
close(result)
|
||||
ok := 0
|
||||
for err := range result {
|
||||
if err == nil {
|
||||
ok++
|
||||
} else if !errors.Is(err, ErrInstanceLimit) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
if ok != 2 {
|
||||
t.Fatalf("reserved %d", ok)
|
||||
}
|
||||
s.Close()
|
||||
s, err = Open(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer s.Close()
|
||||
if err = s.ReserveIntent(Intent{ID: ID(), UID: "u"}); !errors.Is(err, ErrInstanceLimit) {
|
||||
t.Fatalf("restart lost reservation: %v", err)
|
||||
}
|
||||
}
|
||||
func TestIntentClaimCancelAndVersion(t *testing.T) {
|
||||
s, err := Open(filepath.Join(t.TempDir(), "store.db"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer s.Close()
|
||||
if err = s.EnsureIntents(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
in := Intent{ID: ID(), UID: "u", Version: "1.2.3"}
|
||||
if err = s.ReserveIntent(in); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
i := Instance{ID: ID(), UID: "u", Version: "1.2.4"}
|
||||
if err = s.ClaimIntent(in.ID, i); !errors.Is(err, ErrIntentState) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.CancelIntent(in.ID, "other"); !errors.Is(err, ErrIntentState) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
i.Version = in.Version
|
||||
if err = s.ClaimIntent(in.ID, i); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.CancelIntent(in.ID, in.UID); !errors.Is(err, ErrIntentState) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.ReserveIntent(Intent{ID: "second", UID: "u"}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.ReserveIntent(Intent{ID: "third", UID: "u"}); !errors.Is(err, ErrInstanceLimit) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.CancelIntent("second", "u"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err = s.ReserveIntent(Intent{ID: "third", UID: "u"}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user