Files
go-sip/internal/store/global_revision_test.go
T

99 lines
3.0 KiB
Go

package store
import (
"bytes"
"encoding/json"
"path/filepath"
"strings"
"testing"
"git.ipao.vip/rogee/go-sip/internal/configread"
)
func TestInternalSIPGenerationRemainsVerifiedWhileQuotaRevisionIsMetadata(t *testing.T) {
s, err := Open(filepath.Join(t.TempDir(), "state.db"))
if err != nil {
t.Fatal(err)
}
defer s.Close()
base := currentStoreSnapshot(t)
base.Quota.QuotaRevision = 3
if err := s.SaveSnapshot(base); err != nil {
t.Fatal(err)
}
changedSIP := base
changedSIP.SIP.Trunks = []byte(strings.Replace(string(base.SIP.Trunks), `"dial_prefix":""`, `"dial_prefix":"9"`, 1))
if string(changedSIP.SIP.Trunks) == string(base.SIP.Trunks) {
t.Fatal("test SIP change fixture failed")
}
if err := s.SaveSnapshot(changedSIP); err == nil {
t.Fatal("same SIP revision accepted different content")
}
changedQuota := base
changedQuota.Quota.MaxConcurrentCalls++
if err := s.SaveSnapshot(changedQuota); err != nil {
t.Fatalf("current quota with unchanged source revision rejected: %v", err)
}
regressed := base
regressed.SIP.Revision--
if err := s.SaveSnapshot(regressed); err == nil {
t.Fatal("older SIP revision was installed")
}
regressed = base
regressed.Quota.QuotaRevision--
if err := s.SaveSnapshot(regressed); err != nil {
t.Fatalf("current quota with lower source revision rejected: %v", err)
}
loaded, err := s.ReadSnapshot(base.Task.DispatcherID, base.Task.TenantID, base.Task.TaskID)
if err != nil {
t.Fatal(err)
}
originalSIP, err := json.Marshal(base.SIP)
if err != nil {
t.Fatal(err)
}
storedSIP, err := json.Marshal(loaded.SIP)
if err != nil {
t.Fatal(err)
}
if !bytes.Equal(storedSIP, originalSIP) || loaded.Quota.MaxConcurrentCalls != base.Quota.MaxConcurrentCalls {
t.Fatalf("rejected update changed durable snapshot: %+v", loaded.SIP)
}
}
func TestTenantQuotaRefreshUpdatesAllTaskBindings(t *testing.T) {
s, err := Open(filepath.Join(t.TempDir(), "state.db"))
if err != nil {
t.Fatal(err)
}
defer s.Close()
first := currentStoreSnapshot(t)
if err := s.SaveSnapshot(first); err != nil {
t.Fatal(err)
}
second := first
var task configread.Task
raw := []byte(strings.Replace(string(first.Task.Raw), `"task_id":"task-asr"`, `"task_id":"task-second"`, 1))
if string(raw) == string(first.Task.Raw) {
t.Fatal("test task clone fixture failed")
}
if err := json.Unmarshal(raw, &task); err != nil {
t.Fatal(err)
}
second.Task = task
second.SIP.Trunks = []byte(strings.Replace(string(first.SIP.Trunks), `"dial_prefix":""`, `"dial_prefix":"9"`, 1))
if err := s.SaveSnapshot(second); err == nil {
t.Fatal("two tasks accepted different SIP contents under same global revision")
}
second = first
second.Task = task
second.Quota.MaxConcurrentCalls++
if err := s.SaveSnapshot(second); err != nil {
t.Fatalf("latest quota rejected on another task under the same source revision: %v", err)
}
current, err := s.ReadSnapshot(currentDispatcherID, first.Task.TenantID, first.Task.TaskID)
if err != nil || current.Quota != second.Quota {
t.Fatalf("another task retained stale tenant quota: %+v %v", current.Quota, err)
}
}