mirror of
https://github.com/safing/portbase
synced 2025-09-01 18:19:57 +00:00
103 lines
2.5 KiB
Go
103 lines
2.5 KiB
Go
// Copyright Safing ICS Technologies GmbH. Use of this source code is governed by the AGPL license that can be found in the LICENSE file.
|
|
|
|
package database
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
)
|
|
|
|
var subTestWg sync.WaitGroup
|
|
|
|
func waitForSubs(t *testing.T, sub *Subscription, highest int) {
|
|
defer subTestWg.Done()
|
|
expecting := 1
|
|
var subbedModel Model
|
|
forLoop:
|
|
for {
|
|
select {
|
|
case subbedModel = <-sub.Created:
|
|
case subbedModel = <-sub.Updated:
|
|
}
|
|
t.Logf("got model from subscription: %s", subbedModel.GetKey().String())
|
|
if !strings.HasPrefix(subbedModel.GetKey().Name(), "sub") {
|
|
// not a model that we use for testing, other tests might be interfering
|
|
continue forLoop
|
|
}
|
|
number, err := strconv.Atoi(strings.TrimPrefix(subbedModel.GetKey().Name(), "sub"))
|
|
if err != nil || number != expecting {
|
|
t.Errorf("test subscription: got unexpected model %s, expected sub%d", subbedModel.GetKey().String(), expecting)
|
|
continue forLoop
|
|
}
|
|
if number == highest {
|
|
return
|
|
}
|
|
expecting++
|
|
}
|
|
}
|
|
|
|
func TestSubscriptions(t *testing.T) {
|
|
|
|
// create subscription
|
|
sub := NewSubscription()
|
|
|
|
// FIRST TEST
|
|
|
|
subTestWg.Add(1)
|
|
go waitForSubs(t, sub, 3)
|
|
sub.Subscribe("/Tests/")
|
|
t.Log(sub.String())
|
|
|
|
(&(TestingModel{})).CreateInNamespace("", "sub1")
|
|
(&(TestingModel{})).CreateInNamespace("A", "sub2")
|
|
(&(TestingModel{})).CreateInNamespace("A/B/C/D/E", "sub3")
|
|
|
|
subTestWg.Wait()
|
|
|
|
// SECOND TEST
|
|
|
|
subTestWg.Add(1)
|
|
go waitForSubs(t, sub, 3)
|
|
sub.Unsubscribe("/Tests/")
|
|
sub.Subscribe("/Tests/A/****")
|
|
t.Log(sub.String())
|
|
|
|
(&(TestingModel{})).CreateInNamespace("", "subX")
|
|
(&(TestingModel{})).CreateInNamespace("A", "sub1")
|
|
(&(TestingModel{})).CreateInNamespace("A/B/C/D", "sub2")
|
|
(&(TestingModel{})).CreateInNamespace("A/B/C/D/E", "subX")
|
|
(&(TestingModel{})).CreateInNamespace("A", "sub3")
|
|
|
|
subTestWg.Wait()
|
|
|
|
// THIRD TEST
|
|
|
|
subTestWg.Add(1)
|
|
go waitForSubs(t, sub, 3)
|
|
sub.Unsubscribe("/Tests/A/****")
|
|
sub.Subscribe("/Tests/TestingModel:sub1")
|
|
sub.Subscribe("/Tests/TestingModel:sub1/TestingModel")
|
|
t.Log(sub.String())
|
|
|
|
(&(TestingModel{})).CreateInNamespace("", "sub1")
|
|
(&(TestingModel{})).CreateInNamespace("", "subX")
|
|
(&(TestingModel{})).CreateInNamespace("TestingModel:sub1", "sub2")
|
|
(&(TestingModel{})).CreateInNamespace("TestingModel:sub1/A", "subX")
|
|
(&(TestingModel{})).CreateInNamespace("TestingModel:sub1", "sub3")
|
|
|
|
subTestWg.Wait()
|
|
|
|
// FINAL STUFF
|
|
|
|
model := &TestingModel{}
|
|
model.CreateInNamespace("Invalid", "subX")
|
|
model.Save()
|
|
|
|
sub.Destroy()
|
|
|
|
// time.Sleep(1 * time.Second)
|
|
// pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
|
|
|
|
}
|