94 lines
2.8 KiB
Go
94 lines
2.8 KiB
Go
package store
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/configread"
|
|
)
|
|
|
|
func TestCurrentGlobalSIPAndQuotaRevisionCannotChangeContent(t *testing.T) {
|
|
s, err := OpenCurrent(filepath.Join(t.TempDir(), "state.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer s.Close()
|
|
base := currentStoreSnapshot(t)
|
|
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.Fatal("same quota revision accepted different content")
|
|
}
|
|
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.Fatal("older tenant quota revision was installed")
|
|
}
|
|
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 TestCurrentSharedGlobalRevisionConflictAcrossTasks(t *testing.T) {
|
|
s, err := OpenCurrent(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.CurrentTask
|
|
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.Fatal("two tasks accepted different tenant quotas under same revision")
|
|
}
|
|
}
|