70 lines
1.9 KiB
Go
70 lines
1.9 KiB
Go
package store
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/configread"
|
|
)
|
|
|
|
func TestLocalSIPPendingContentSurvivesRestartAndForeignOwnerIsRejected(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "dispatcher.db")
|
|
s, err := Open(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
raw, err := os.ReadFile("../../contracts/schema/examples/config-read-sip-no-revision.json")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var source configread.SIP
|
|
if err = json.Unmarshal(raw, &source); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
first, err := s.PrepareSIP(source)
|
|
if err != nil || first.Revision != 1 {
|
|
t.Fatalf("first generation: %+v %v", first, err)
|
|
}
|
|
if err = s.Close(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
s, err = Open(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer s.Close()
|
|
same, err := s.PrepareSIP(source)
|
|
if err != nil || same.Revision != 1 {
|
|
t.Fatalf("restart changed pending generation: %+v %v", same, err)
|
|
}
|
|
source.Trunks = json.RawMessage(`[] `)
|
|
// Encoding whitespace is normalized and is not different content.
|
|
same, err = s.PrepareSIP(source)
|
|
if err != nil || same.Revision != 1 {
|
|
t.Fatalf("equivalent snapshot changed generation: %+v %v", same, err)
|
|
}
|
|
raw, err = os.ReadFile("../../contracts/schema/examples/config-read-sip.json")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var full configread.SIP
|
|
if err = json.Unmarshal(raw, &full); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
source.Trunks = full.Trunks
|
|
changed, err := s.PrepareSIP(source)
|
|
if err != nil || changed.Revision != 2 {
|
|
t.Fatalf("pending changed content not assigned new generation: %+v %v", changed, err)
|
|
}
|
|
foreign := source
|
|
foreign.DispatcherID = "4f3aac93-1b25-46b7-a9d7-83d29f5b86e1"
|
|
if _, err = s.PrepareSIP(foreign); err == nil {
|
|
t.Fatal("foreign owner reused store")
|
|
}
|
|
if _, pending, err := s.SIPState(source.DispatcherID); err != nil || pending != 2 {
|
|
t.Fatalf("foreign request modified pending state: %d %v", pending, err)
|
|
}
|
|
}
|