2016-03-09 22:29:02 -05:00
// Copyright 2015 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package promql
2017-08-07 17:15:38 +01:00
import (
"context"
"testing"
2018-01-09 17:44:23 +01:00
"time"
2017-08-07 17:15:38 +01:00
2020-10-29 10:43:23 +01:00
"github.com/stretchr/testify/require"
2020-10-22 11:00:08 +02:00
2017-08-10 16:28:49 +02:00
"github.com/prometheus/prometheus/pkg/labels"
"github.com/prometheus/prometheus/pkg/timestamp"
2020-02-21 12:43:30 +01:00
"github.com/prometheus/prometheus/promql/parser"
2019-08-08 19:35:39 -06:00
"github.com/prometheus/prometheus/util/teststorage"
2017-08-07 17:15:38 +01:00
)
2016-03-09 22:29:02 -05:00
2017-08-07 17:15:38 +01:00
func TestDeriv ( t * testing . T ) {
// https://github.com/prometheus/prometheus/issues/2674#issuecomment-315439393
// This requires more precision than the usual test system offers,
// so we test it by hand.
2019-08-08 19:35:39 -06:00
storage := teststorage . New ( t )
2017-08-10 16:28:49 +02:00
defer storage . Close ( )
2018-10-02 04:59:19 -07:00
opts := EngineOpts {
2020-01-28 21:38:49 +01:00
Logger : nil ,
Reg : nil ,
MaxSamples : 10000 ,
Timeout : 10 * time . Second ,
2018-10-02 04:59:19 -07:00
}
engine := NewEngine ( opts )
2017-08-07 17:15:38 +01:00
2020-07-24 19:40:51 +05:30
a := storage . Appender ( context . Background ( ) )
2017-08-10 16:28:49 +02:00
metric := labels . FromStrings ( "__name__" , "foo" )
2021-02-18 12:07:00 +00:00
a . Append ( 0 , metric , 1493712816939 , 1.0 )
a . Append ( 0 , metric , 1493712846939 , 1.0 )
2017-08-10 16:28:49 +02:00
2020-10-29 10:43:23 +01:00
require . NoError ( t , a . Commit ( ) )
2017-08-07 17:15:38 +01:00
2018-01-09 17:44:23 +01:00
query , err := engine . NewInstantQuery ( storage , "deriv(foo[30m])" , timestamp . Time ( 1493712846939 ) )
2020-10-29 10:43:23 +01:00
require . NoError ( t , err )
2018-04-27 15:11:16 +03:00
2017-08-07 17:15:38 +01:00
result := query . Exec ( context . Background ( ) )
2020-10-29 10:43:23 +01:00
require . NoError ( t , result . Err )
2018-04-27 15:11:16 +03:00
2017-08-07 17:15:38 +01:00
vec , _ := result . Vector ( )
2020-10-29 10:43:23 +01:00
require . Equal ( t , 1 , len ( vec ) , "Expected 1 result, got %d" , len ( vec ) )
require . Equal ( t , 0.0 , vec [ 0 ] . V , "Expected 0.0 as value, got %f" , vec [ 0 ] . V )
2017-08-07 17:15:38 +01:00
}
2020-02-21 12:43:30 +01:00
func TestFunctionList ( t * testing . T ) {
2020-02-25 13:57:30 +01:00
// Test that Functions and parser.Functions list the same functions.
2020-02-21 12:43:30 +01:00
for i := range FunctionCalls {
_ , ok := parser . Functions [ i ]
2020-10-29 10:43:23 +01:00
require . True ( t , ok , "function %s exists in promql package, but not in parser package" , i )
2020-02-21 12:43:30 +01:00
}
for i := range parser . Functions {
_ , ok := FunctionCalls [ i ]
2020-10-29 10:43:23 +01:00
require . True ( t , ok , "function %s exists in parser package, but not in promql package" , i )
2020-02-21 12:43:30 +01:00
}
}