|
@@ -5,6 +5,7 @@ import (
|
|
|
"fmt"
|
|
|
"github.com/emqx/kuiper/common"
|
|
|
"github.com/emqx/kuiper/xsql"
|
|
|
+ "github.com/emqx/kuiper/xstream"
|
|
|
"github.com/emqx/kuiper/xstream/api"
|
|
|
"github.com/emqx/kuiper/xstream/nodes"
|
|
|
"github.com/emqx/kuiper/xstream/test"
|
|
@@ -554,41 +555,14 @@ func TestSingleSQL(t *testing.T) {
|
|
|
t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.r, maps)
|
|
|
continue
|
|
|
}
|
|
|
- keys, values := tp.GetMetrics()
|
|
|
- //for i, k := range keys{
|
|
|
- // log.Printf("%s:%v", k, values[i])
|
|
|
- //}
|
|
|
- for k, v := range tt.m {
|
|
|
- var (
|
|
|
- index int
|
|
|
- key string
|
|
|
- matched bool
|
|
|
- )
|
|
|
- for index, key = range keys {
|
|
|
- if k == key {
|
|
|
- if values[index] == v {
|
|
|
- matched = true
|
|
|
- }
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- if matched {
|
|
|
- continue
|
|
|
- }
|
|
|
- //do not find
|
|
|
- if index < len(values) {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v(%t)\n\ngot=%#v(%t)\n\n", i, tt.sql, k, v, v, values[index], values[index])
|
|
|
- } else {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v\n\ngot=nil\n\n", i, tt.sql, k, v)
|
|
|
- }
|
|
|
- break
|
|
|
+ if err := compareMetrics(tp, tt.m, tt.sql); err != nil{
|
|
|
+ t.Errorf("%d. %q\n\n%v", i, tt.sql, err)
|
|
|
}
|
|
|
tp.Cancel()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func TestWindow(t *testing.T) {
|
|
|
- common.IsTesting = true
|
|
|
var tests = []struct {
|
|
|
name string
|
|
|
sql string
|
|
@@ -976,8 +950,8 @@ func TestWindow(t *testing.T) {
|
|
|
defer dropStreams(t)
|
|
|
done := make(chan struct{})
|
|
|
defer close(done)
|
|
|
- common.ResetMockTicker()
|
|
|
for i, tt := range tests {
|
|
|
+ test.ResetClock(1541152486000)
|
|
|
p := NewRuleProcessor(DbDir)
|
|
|
parser := xsql.NewParser(strings.NewReader(tt.sql))
|
|
|
var sources []*nodes.SourceNode
|
|
@@ -1017,7 +991,6 @@ func TestWindow(t *testing.T) {
|
|
|
log.Info("stream stopping")
|
|
|
return
|
|
|
}
|
|
|
- default:
|
|
|
}
|
|
|
}
|
|
|
}()
|
|
@@ -1035,31 +1008,8 @@ func TestWindow(t *testing.T) {
|
|
|
if !reflect.DeepEqual(tt.r, maps) {
|
|
|
t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.r, maps)
|
|
|
}
|
|
|
- keys, values := tp.GetMetrics()
|
|
|
- for k, v := range tt.m {
|
|
|
- var (
|
|
|
- index int
|
|
|
- key string
|
|
|
- matched bool
|
|
|
- )
|
|
|
- for index, key = range keys {
|
|
|
- if k == key {
|
|
|
- if values[index] == v {
|
|
|
- matched = true
|
|
|
- }
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- if matched {
|
|
|
- continue
|
|
|
- }
|
|
|
- //do not find
|
|
|
- if index < len(values) {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v(%t)\n\ngot=%#v(%t)\n\n", i, tt.sql, k, v, v, values[index], values[index])
|
|
|
- } else {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v\n\ngot=nil\n\n", i, tt.sql, k, v)
|
|
|
- }
|
|
|
- break
|
|
|
+ if err := compareMetrics(tp, tt.m, tt.sql); err != nil{
|
|
|
+ t.Errorf("%d. %q\n\n%v", i, tt.sql, err)
|
|
|
}
|
|
|
tp.Cancel()
|
|
|
}
|
|
@@ -1348,7 +1298,6 @@ func getEventMockSource(name string, done chan<- struct{}, size int) *nodes.Sour
|
|
|
}
|
|
|
|
|
|
func TestEventWindow(t *testing.T) {
|
|
|
- common.IsTesting = true
|
|
|
var tests = []struct {
|
|
|
name string
|
|
|
sql string
|
|
@@ -1711,31 +1660,8 @@ func TestEventWindow(t *testing.T) {
|
|
|
defer dropEventStreams(t)
|
|
|
done := make(chan struct{})
|
|
|
defer close(done)
|
|
|
- common.ResetMockTicker()
|
|
|
- //mock ticker
|
|
|
- realTicker := time.NewTicker(500 * time.Millisecond)
|
|
|
- tickerDone := make(chan bool)
|
|
|
- go func() {
|
|
|
- ticker := common.GetTicker(1000).(*common.MockTicker)
|
|
|
- timer := common.GetTimer(1000).(*common.MockTimer)
|
|
|
- for {
|
|
|
- select {
|
|
|
- case <-tickerDone:
|
|
|
- log.Infof("real ticker exiting...")
|
|
|
- return
|
|
|
- case t := <-realTicker.C:
|
|
|
- ts := common.TimeToUnixMilli(t)
|
|
|
- if ticker != nil {
|
|
|
- go ticker.DoTick(ts)
|
|
|
- }
|
|
|
- if timer != nil {
|
|
|
- go timer.DoTick(ts)
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }()
|
|
|
for i, tt := range tests {
|
|
|
+ test.ResetClock(1541152486000)
|
|
|
p := NewRuleProcessor(DbDir)
|
|
|
parser := xsql.NewParser(strings.NewReader(tt.sql))
|
|
|
var sources []*nodes.SourceNode
|
|
@@ -1781,7 +1707,6 @@ func TestEventWindow(t *testing.T) {
|
|
|
log.Info("stream stopping")
|
|
|
return
|
|
|
}
|
|
|
- default:
|
|
|
}
|
|
|
}
|
|
|
}()
|
|
@@ -1799,40 +1724,51 @@ func TestEventWindow(t *testing.T) {
|
|
|
if !reflect.DeepEqual(tt.r, maps) {
|
|
|
t.Errorf("%d. %q\n\nresult mismatch:\n\nexp=%#v\n\ngot=%#v\n\n", i, tt.sql, tt.r, maps)
|
|
|
}
|
|
|
- keys, values := tp.GetMetrics()
|
|
|
- //for i, k := range keys{
|
|
|
- // log.Printf("%s:%v", k, values[i])
|
|
|
- //}
|
|
|
- for k, v := range tt.m {
|
|
|
- var (
|
|
|
- index int
|
|
|
- key string
|
|
|
- matched bool
|
|
|
- )
|
|
|
- for index, key = range keys {
|
|
|
- if k == key {
|
|
|
- if values[index] == v {
|
|
|
+ if err := compareMetrics(tp, tt.m, tt.sql); err != nil{
|
|
|
+ t.Errorf("%d. %q\n\n%v", i, tt.sql, err)
|
|
|
+ }
|
|
|
+ tp.Cancel()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func compareMetrics(tp *xstream.TopologyNew, m map[string]interface{}, sql string) (err error) {
|
|
|
+ keys, values := tp.GetMetrics()
|
|
|
+ //for i, k := range keys{
|
|
|
+ // log.Printf("%s:%v", k, values[i])
|
|
|
+ //}
|
|
|
+ for k, v := range m {
|
|
|
+ var (
|
|
|
+ index int
|
|
|
+ key string
|
|
|
+ matched bool
|
|
|
+ )
|
|
|
+ for index, key = range keys {
|
|
|
+ if k == key {
|
|
|
+ if strings.HasSuffix(k, "process_latency_ms") {
|
|
|
+ if values[index].(int64) >= v.(int64) {
|
|
|
matched = true
|
|
|
+ continue
|
|
|
+ } else {
|
|
|
+ break
|
|
|
}
|
|
|
- break
|
|
|
}
|
|
|
+ if values[index] == v {
|
|
|
+ matched = true
|
|
|
+ }
|
|
|
+ break
|
|
|
}
|
|
|
- if matched {
|
|
|
- continue
|
|
|
- }
|
|
|
- //do not find
|
|
|
- if index < len(values) {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v(%t)\n\ngot=%#v(%t)\n\n", i, tt.sql, k, v, v, values[index], values[index])
|
|
|
- } else {
|
|
|
- t.Errorf("%d. %q\n\nmetrics mismatch for %s:\n\nexp=%#v\n\ngot=nil\n\n", i, tt.sql, k, v)
|
|
|
- }
|
|
|
- break
|
|
|
}
|
|
|
- tp.Cancel()
|
|
|
+ if matched {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ //do not find
|
|
|
+ if index < len(values) {
|
|
|
+ return fmt.Errorf("metrics mismatch for %s:\n\nexp=%#v(%t)\n\ngot=%#v(%t)\n\n", k, v, v, values[index], values[index])
|
|
|
+ } else {
|
|
|
+ return fmt.Errorf("metrics mismatch for %s:\n\nexp=%#v\n\ngot=nil\n\n", k, v)
|
|
|
+ }
|
|
|
}
|
|
|
- realTicker.Stop()
|
|
|
- tickerDone <- true
|
|
|
- close(tickerDone)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func errstring(err error) string {
|