chore: Port InfluxQL test packages from Cloud

This commit copies over the comprehensive tests from Cloud.
pull/20017/head
Stuart Carnie 2020-11-13 10:36:09 +11:00
parent 1cd9d0b04a
commit 9e42444d8a
12 changed files with 7207 additions and 1 deletions

2
go.mod
View File

@ -109,7 +109,7 @@ require (
golang.org/x/tools v0.0.0-20200721032237-77f530d86f9a
google.golang.org/api v0.17.0
gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect
gopkg.in/yaml.v2 v2.3.0
gopkg.in/yaml.v2 v2.3.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71
honnef.co/go/tools v0.0.1-2020.1.4
istio.io/pkg v0.0.0-20200606170016-70c5172b9cdf

View File

@ -0,0 +1,84 @@
package v1tests
import (
"context"
"fmt"
"net/url"
"strings"
"testing"
"time"
)
// Ensure parameterized queries can be executed
func TestServer_Query_Parameterized(t *testing.T) {
t.Parallel()
s := OpenServer(t)
defer s.Close()
writes := []string{
fmt.Sprintf(`cpu,host=foo value=1.0 %d`, mustParseTime(time.RFC3339Nano, "2000-01-01T01:00:00Z").UnixNano()),
fmt.Sprintf(`cpu,host=bar value=1.0 %d`, mustParseTime(time.RFC3339Nano, "2000-01-02T01:00:00Z").UnixNano()),
}
test := NewTest("db0", "rp0")
test.writes = Writes{
&Write{data: strings.Join(writes, "\n")},
}
minTime := mustParseTime(time.RFC3339Nano, "2000-01-01T01:00:00Z").UnixNano()
maxTime := mustParseTime(time.RFC3339Nano, "2000-01-01T02:00:00Z").UnixNano()
test.addQueries([]*Query{
{
name: "parameterized time",
params: url.Values{"db": []string{"db0"}, "params": []string{fmt.Sprintf(`{"0": %d, "1": %d}`, minTime, maxTime)}},
command: `SELECT value FROM cpu WHERE time >= $0 AND time < $1`,
exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","value"],"values":[["2000-01-01T01:00:00Z",1]]}]}]}`,
},
{
name: "parameterized tag",
params: url.Values{"db": []string{"db0"}, "params": []string{`{"0": "foo"}`}},
command: `SELECT value FROM cpu WHERE host = $0`,
exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","value"],"values":[["2000-01-01T01:00:00Z",1]]}]}]}`,
},
}...)
ctx := context.Background()
test.Run(ctx, t, s)
}
// Ensure queries are properly chunked
func TestServer_Query_Chunked(t *testing.T) {
t.Parallel()
s := OpenServer(t)
defer s.Close()
writes := []string{
fmt.Sprintf(`cpu,host=foo value=1.0 %d`, mustParseTime(time.RFC3339Nano, "2000-01-01T01:00:00Z").UnixNano()),
fmt.Sprintf(`cpu,host=bar value=1.0 %d`, mustParseTime(time.RFC3339Nano, "2000-01-02T01:00:00Z").UnixNano()),
}
test := NewTest("db0", "rp0")
test.writes = Writes{
&Write{data: strings.Join(writes, "\n")},
}
test.addQueries([]*Query{
{
name: "query is chunked",
params: url.Values{"db": []string{"db0"}, "chunked": []string{"true"}, "chunk_size": []string{"1"}},
command: `SELECT value FROM cpu`,
exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","value"],"values":[["2000-01-01T01:00:00Z",1]],"partial":true}],"partial":true}]}
{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","value"],"values":[["2000-01-02T01:00:00Z",1]]}]}]}`,
},
{
name: "query is not chunked",
params: url.Values{"db": []string{"db0"}, "chunked": []string{"false"}, "chunk_size": []string{"1"}},
command: `SELECT value FROM cpu`,
exp: `{"results":[{"statement_id":0,"series":[{"name":"cpu","columns":["time","value"],"values":[["2000-01-01T01:00:00Z",1],["2000-01-02T01:00:00Z",1]]}]}]}`,
},
}...)
ctx := context.Background()
test.Run(ctx, t, s)
}

View File

@ -0,0 +1,221 @@
package v1tests
import (
"context"
"encoding/json"
"io/ioutil"
"net/http"
"net/url"
"strings"
"testing"
"time"
"github.com/influxdata/influxdb/v2"
icontext "github.com/influxdata/influxdb/v2/context"
"github.com/influxdata/influxdb/v2/tests"
"github.com/influxdata/influxdb/v2/tests/pipeline"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
"go.uber.org/zap/zaptest"
)
func OpenServer(t *testing.T, extra ...tests.PipelineOption) *tests.DefaultPipeline {
t.Helper()
defaults := []tests.PipelineOption{
tests.WithLogger(zaptest.NewLogger(t, zaptest.Level(zapcore.ErrorLevel))),
}
p := tests.NewDefaultPipeline(t, append(defaults, extra...)...)
p.MustOpen()
return p
}
type Query struct {
name string
command string
params url.Values
exp, got string
skip string
skipOthers bool // set to true to only run this test
repeat int
once bool
}
// Execute runs the command and returns an err if it fails
func (q *Query) Execute(ctx context.Context, t *testing.T, db string, c *tests.Client) (err error) {
t.Helper()
params := [][2]string{{"q", q.command}}
if qdb := q.params.Get("db"); len(qdb) > 0 {
params = append(params, [2]string{"db", qdb})
}
if epoch := q.params.Get("epoch"); len(epoch) > 0 {
params = append(params, [2]string{"epoch", epoch})
}
if parameters := q.params.Get("params"); len(parameters) > 0 {
params = append(params, [2]string{"params", parameters})
}
if chunked := q.params.Get("chunked"); len(chunked) > 0 {
params = append(params, [2]string{"chunked", chunked})
}
if chunkSize := q.params.Get("chunk_size"); len(chunkSize) > 0 {
params = append(params, [2]string{"chunk_size", chunkSize})
}
err = c.Client.Get("/query").
QueryParams(params...).
Header("Accept", "application/json").
RespFn(func(resp *http.Response) error {
b, err := ioutil.ReadAll(resp.Body)
q.got = strings.TrimSpace(string(b))
return err
}).
Do(ctx)
return
}
type Write struct {
data string
}
type Writes []*Write
type Test struct {
orgID influxdb.ID
bucketID influxdb.ID
db string
rp string
writes Writes
queries []*Query
}
func NewTest(db, rp string) Test {
return Test{
db: db,
rp: rp,
}
}
func (qt *Test) Run(ctx context.Context, t *testing.T, p *tests.DefaultPipeline) {
t.Helper()
fx, auth := qt.init(ctx, t, p)
ctx = icontext.SetAuthorizer(ctx, auth)
skipOthers := false
for _, query := range qt.queries {
skipOthers = skipOthers || query.skipOthers
}
var queries []*Query
if skipOthers {
queries = make([]*Query, 0, len(qt.queries))
for _, query := range qt.queries {
if query.skipOthers {
queries = append(queries, query)
}
}
} else {
queries = qt.queries
}
for _, query := range queries {
t.Run(query.name, func(t *testing.T) {
if query.skip != "" {
t.Skipf("SKIP:: %s", query.skip)
}
err := query.Execute(ctx, t, qt.db, fx.Admin)
assert.NoError(t, err)
assert.Equal(t, query.exp, query.got,
"%s: unexpected results\nquery: %s\nparams: %v\nexp: %s\nactual: %s\n",
query.name, query.command, query.params, query.exp, query.got)
})
}
}
func (qt *Test) addQueries(q ...*Query) {
qt.queries = append(qt.queries, q...)
}
func (qt *Test) init(ctx context.Context, t *testing.T, p *tests.DefaultPipeline) (fx pipeline.BaseFixture, auth *influxdb.Authorization) {
t.Helper()
require.Greater(t, len(qt.writes), 0)
qt.orgID = p.DefaultOrgID
qt.bucketID = p.DefaultBucketID
fx = pipeline.NewBaseFixture(t, p.Pipeline, qt.orgID, qt.bucketID)
qt.writeTestData(ctx, t, fx.Admin)
p.Flush()
writeOrg, err := influxdb.NewPermissionAtID(qt.orgID, influxdb.WriteAction, influxdb.OrgsResourceType, qt.orgID)
require.NoError(t, err)
bucketWritePerm, err := influxdb.NewPermissionAtID(qt.bucketID, influxdb.WriteAction, influxdb.BucketsResourceType, qt.orgID)
require.NoError(t, err)
bucketReadPerm, err := influxdb.NewPermissionAtID(qt.bucketID, influxdb.ReadAction, influxdb.BucketsResourceType, qt.orgID)
require.NoError(t, err)
auth = tests.MakeAuthorization(qt.orgID, p.DefaultUserID, []influxdb.Permission{*writeOrg, *bucketWritePerm, *bucketReadPerm})
ctx = icontext.SetAuthorizer(ctx, auth)
err = p.Launcher.
DBRPMappingServiceV2().
Create(ctx, &influxdb.DBRPMappingV2{
Database: qt.db,
RetentionPolicy: qt.rp,
Default: true,
OrganizationID: qt.orgID,
BucketID: qt.bucketID,
})
require.NoError(t, err)
return
}
func (qt *Test) writeTestData(ctx context.Context, t *testing.T, c *tests.Client) {
t.Helper()
for _, w := range qt.writes {
err := c.Write(ctx, qt.orgID, qt.bucketID, strings.NewReader(w.data))
require.NoError(t, err)
}
}
func maxInt64() string {
maxInt64, _ := json.Marshal(^int64(0))
return string(maxInt64)
}
func now() time.Time {
return time.Now().UTC()
}
func yesterday() time.Time {
return now().Add(-1 * time.Hour * 24)
}
func mustParseTime(layout, value string) time.Time {
tm, err := time.Parse(layout, value)
if err != nil {
panic(err)
}
return tm
}
func mustParseLocation(tzname string) *time.Location {
loc, err := time.LoadLocation(tzname)
if err != nil {
panic(err)
}
return loc
}
var LosAngeles = mustParseLocation("America/Los_Angeles")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,75 @@
This package asserts the fully compatibility between the InfluxDB v1 Influxql engine
and IDPE influxql.
There is only one file that runs as subtest all the goldenfiles located in
`./goldenfiles`
This is an example of goldenfile:
```yaml
query: "select host, inactive from mem where time >=30000000000 AND time < 50000000000"
dataset: |
mem,host=gianarb page_tables=39534592i,vmalloc_chunk=0i,write_back_tmp=0i,dirty=884736i,high_total=0i,available=11992494080i,used=3284553728i,active=7172775936i,huge_pages_free=0i,swap_total=8589930496i,vmalloc_used=38604800i,free=4928421888i,commit_limit=16853958656i,committed_as=12584218624i,mapped=939278336i,vmalloc_total=35184372087808i,write_back=0i,buffered=989163520i,wired=0i,low_free=0i,huge_page_size=2097152i,swap_cached=120016896i,swap_free=8445227008i,inactive=3461185536i,slab=542363648i,high_free=0i,shared=903233536i,sreclaimable=449650688i,total=16528056320i,cached=7325917184i,available_percent=72.55840522208482,sunreclaim=92712960i,used_percent=19.87259520664557,huge_pages_total=0i,low_total=0i 0
mem,host=gianarb slab=542392320i,shared=931356672i,vmalloc_used=38506496i,sunreclaim=92692480i,write_back=0i,total=16528056320i,commit_limit=16853958656i,huge_pages_free=0i,vmalloc_chunk=0i,active=7159382016i,huge_page_size=2097152i,swap_total=8589930496i,used=3266457600i,buffered=989843456i,wired=0i,high_free=0i,page_tables=38965248i,swap_cached=120016896i,write_back_tmp=0i,inactive=3454332928i,used_percent=19.7631078740177,committed_as=12570415104i,dirty=339968i,high_total=0i,huge_pages_total=0i,sreclaimable=449699840i,vmalloc_total=35184372087808i,free=4914728960i,cached=7357026304i,available_percent=72.49944859820032,low_free=0i,low_total=0i,swap_free=8445227008i,available=11982749696i,mapped=938016768i 20000000000
cpu,cpu=cpu-total,host=gianarb usage_user=6.102117061021656,usage_system=2.938978829389874,usage_nice=0,usage_irq=1.0709838107097638,usage_guest=0,usage_idle=89.41469489414925,usage_iowait=0.024906600249037934,usage_softirq=0.4483188044832491,usage_steal=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.711422845699912,usage_nice=0,usage_iowait=0,usage_irq=1.302605210421328,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_system=2.905811623247315,usage_idle=89.67935871744233,usage_softirq=0.4008016032064967 30000000000
cpu,cpu=cpu2,host=gianarb usage_user=5.982053838488868,usage_idle=89.73080757727861,usage_irq=0.8973080757725367,usage_softirq=0.4985044865405501,usage_steal=0,usage_guest=0,usage_system=2.8913260219364374,usage_nice=0,usage_iowait=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu1,host=gianarb usage_iowait=0,usage_irq=1.0912698412698993,usage_softirq=0.4960317460319519,usage_guest_nice=0,usage_steal=0,usage_guest=0,usage_user=6.051587301585189,usage_system=3.075396825396861,usage_idle=89.28571428573105,usage_nice=0 30000000000
cpu,cpu=cpu0,host=gianarb usage_user=6.560636182902656,usage_system=2.9821073558650495,usage_idle=88.86679920477891,usage_irq=1.0934393638174862,usage_steal=0,usage_nice=0,usage_iowait=0,usage_softirq=0.4970178926437982,usage_guest=0,usage_guest_nice=0 30000000000
mem,host=gianarb used=3279171584i,wired=0i,committed_as=12718530560i,huge_pages_total=0i,active=7167565824i,swap_total=8589930496i,vmalloc_total=35184372087808i,available=11979239424i,cached=7348174848i,buffered=989859840i,commit_limit=16853958656i,low_free=0i,vmalloc_used=38834176i,total=16528056320i,inactive=3460194304i,available_percent=72.47821033562403,high_free=0i,huge_pages_free=0i,slab=542396416i,dirty=487424i,page_tables=39669760i,swap_free=8445227008i,vmalloc_chunk=0i,write_back=0i,free=4910850048i,huge_page_size=2097152i,low_total=0i,sunreclaim=92696576i,write_back_tmp=0i,used_percent=19.84003152283547,high_total=0i,mapped=938799104i,shared=922521600i,sreclaimable=449699840i,swap_cached=120016896i 30000000000
cpu,cpu=cpu-total,host=gianarb usage_guest_nice=0,usage_user=5.682102628286863,usage_idle=89.88735919901404,usage_nice=0,usage_iowait=0.10012515644554432,usage_guest=0,usage_system=2.828535669587463,usage_irq=1.076345431789406,usage_softirq=0.4255319148935456,usage_steal=0 40000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.599999999992869,usage_steal=0,usage_guest_nice=0,usage_softirq=0.4999999999999318,usage_guest=0,usage_system=2.9999999999984537,usage_idle=89.39999999999075,usage_nice=0,usage_iowait=0.19999999999995852,usage_irq=1.2999999999994816 40000000000
result: |
name: mem
time host inactive
---- ---- --------
30000000000 gianarb 3460194304
40000000000 gianarb 3454791680
```
There are only 3 required fields:
* `query`: to specify the INFLUXQL query to run against the dataset.
* `dataset` are the data used for the query.
* `result` is the expected result returned from the query against the dataset.
## Add a new testcase
In order to `add a new test` you can create a new file with your dataset, your
query and your expected result.
## Example of dataset creation
You can use telegraf to create your own dataset. The one you see above comes
from this configuration:
```toml
[agent]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = ""
hostname = ""
omit_hostname = false
[[outputs.file]]
files = ["stdout", "./metrics.out"]
data_format = "influx"
[[inputs.mem]]
[[inputs.cpu]]
```
Configure Telegraf to collect metrics using the `mem` and `cpu` input plugins.
Additionally, configure telegraf to use the `file` plugin for output, which will
write data as InfluxDB line protocol to `metrics.out`. `metrics.out` will become
the golden file used for the unit test.
Timestamps within `metrics.out` may be normalized using the
`./cmd/goldenfilenormalizer` tool, which adjusts the first timestamp to a
specified base time and all later times relative to that. This is not mandatory,
but may simplify certain test cases, if start and end times are well defined.

View File

@ -0,0 +1,24 @@
description: |
This test suite demonstrates how to use the generated
option for producing a dataset based on TOML schema.
tests:
- query: "select sum(f0) from m0"
result: |
name: m0
time sum
---- ---
0 10
generated:
start: "1000000000000"
end: "5000000000000"
toml: |
[[measurements]]
name = "m0"
tags = [
{ name = "tag0", source = [ "host1" ] },
]
fields = [
{ name = "f0", count = 10, source = 1 },
]

View File

@ -0,0 +1,31 @@
description: |
This test suite verifies correctness of queries containing
fields in the WHERE condition. In most cases, the field
in the SELECT projection is different, to test joins across
fields.
tests:
- name: "no_aggregate"
query: "select f1 from m0 where f0 > 1 AND time >= 30000000000 AND time <= 50000000000"
result: |
name: m0
time f1
---- --
50000000000 30
- name: "aggregate"
description: |
This test verifies that an aggregate
query: "SELECT sum(f1) FROM m0 WHERE f0 >= 1"
result: |
name: m0
time sum
---- ---
0 50
dataset: |
m0,t0=tv0 f0=0i,f1=10i 30000000000
m0,t0=tv1 f0=1i,f1=20i 40000000000
m0,t0=tv1 f0=2i,f1=30i 50000000000
m1,t0=tv0 f0=0i,f1=10i 40000000000

View File

@ -0,0 +1,41 @@
tests:
- query: "select sum(used), mean(active) from mem where time >= 30000000000 AND time < 50000000000"
result: |
name: mem
time sum mean
---- --- ----
30000000000 6549852160 7164311552
dataset: |
mem,host=gianarb page_tables=39534592i,vmalloc_chunk=0i,write_back_tmp=0i,dirty=884736i,high_total=0i,available=11992494080i,used=3284553728i,active=7172775936i,huge_pages_free=0i,swap_total=8589930496i,vmalloc_used=38604800i,free=4928421888i,commit_limit=16853958656i,committed_as=12584218624i,mapped=939278336i,vmalloc_total=35184372087808i,write_back=0i,buffered=989163520i,wired=0i,low_free=0i,huge_page_size=2097152i,swap_cached=120016896i,swap_free=8445227008i,inactive=3461185536i,slab=542363648i,high_free=0i,shared=903233536i,sreclaimable=449650688i,total=16528056320i,cached=7325917184i,available_percent=72.55840522208482,sunreclaim=92712960i,used_percent=19.87259520664557,huge_pages_total=0i,low_total=0i 0
mem,host=gianarb slab=542392320i,shared=931356672i,vmalloc_used=38506496i,sunreclaim=92692480i,write_back=0i,total=16528056320i,commit_limit=16853958656i,huge_pages_free=0i,vmalloc_chunk=0i,active=7159382016i,huge_page_size=2097152i,swap_total=8589930496i,used=3266457600i,buffered=989843456i,wired=0i,high_free=0i,page_tables=38965248i,swap_cached=120016896i,write_back_tmp=0i,inactive=3454332928i,used_percent=19.7631078740177,committed_as=12570415104i,dirty=339968i,high_total=0i,huge_pages_total=0i,sreclaimable=449699840i,vmalloc_total=35184372087808i,free=4914728960i,cached=7357026304i,available_percent=72.49944859820032,low_free=0i,low_total=0i,swap_free=8445227008i,available=11982749696i,mapped=938016768i 20000000000
cpu,cpu=cpu-total,host=gianarb usage_user=6.102117061021656,usage_system=2.938978829389874,usage_nice=0,usage_irq=1.0709838107097638,usage_guest=0,usage_idle=89.41469489414925,usage_iowait=0.024906600249037934,usage_softirq=0.4483188044832491,usage_steal=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.711422845699912,usage_nice=0,usage_iowait=0,usage_irq=1.302605210421328,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_system=2.905811623247315,usage_idle=89.67935871744233,usage_softirq=0.4008016032064967 30000000000
cpu,cpu=cpu2,host=gianarb usage_user=5.982053838488868,usage_idle=89.73080757727861,usage_irq=0.8973080757725367,usage_softirq=0.4985044865405501,usage_steal=0,usage_guest=0,usage_system=2.8913260219364374,usage_nice=0,usage_iowait=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu1,host=gianarb usage_iowait=0,usage_irq=1.0912698412698993,usage_softirq=0.4960317460319519,usage_guest_nice=0,usage_steal=0,usage_guest=0,usage_user=6.051587301585189,usage_system=3.075396825396861,usage_idle=89.28571428573105,usage_nice=0 30000000000
cpu,cpu=cpu0,host=gianarb usage_user=6.560636182902656,usage_system=2.9821073558650495,usage_idle=88.86679920477891,usage_irq=1.0934393638174862,usage_steal=0,usage_nice=0,usage_iowait=0,usage_softirq=0.4970178926437982,usage_guest=0,usage_guest_nice=0 30000000000
mem,host=gianarb used=3279171584i,wired=0i,committed_as=12718530560i,huge_pages_total=0i,active=7167565824i,swap_total=8589930496i,vmalloc_total=35184372087808i,available=11979239424i,cached=7348174848i,buffered=989859840i,commit_limit=16853958656i,low_free=0i,vmalloc_used=38834176i,total=16528056320i,inactive=3460194304i,available_percent=72.47821033562403,high_free=0i,huge_pages_free=0i,slab=542396416i,dirty=487424i,page_tables=39669760i,swap_free=8445227008i,vmalloc_chunk=0i,write_back=0i,free=4910850048i,huge_page_size=2097152i,low_total=0i,sunreclaim=92696576i,write_back_tmp=0i,used_percent=19.84003152283547,high_total=0i,mapped=938799104i,shared=922521600i,sreclaimable=449699840i,swap_cached=120016896i 30000000000
cpu,cpu=cpu-total,host=gianarb usage_guest_nice=0,usage_user=5.682102628286863,usage_idle=89.88735919901404,usage_nice=0,usage_iowait=0.10012515644554432,usage_guest=0,usage_system=2.828535669587463,usage_irq=1.076345431789406,usage_softirq=0.4255319148935456,usage_steal=0 40000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.599999999992869,usage_steal=0,usage_guest_nice=0,usage_softirq=0.4999999999999318,usage_guest=0,usage_system=2.9999999999984537,usage_idle=89.39999999999075,usage_nice=0,usage_iowait=0.19999999999995852,usage_irq=1.2999999999994816 40000000000
cpu,cpu=cpu2,host=gianarb usage_guest=0,usage_guest_nice=0,usage_user=5.682951146558077,usage_system=2.8913260219341703,usage_iowait=0.09970089730813834,usage_irq=0.8973080757728201,usage_softirq=0.39880358923227005,usage_idle=90.02991026919126,usage_nice=0,usage_steal=0 40000000000
mem,host=gianarb free=4954177536i,huge_pages_total=0i,sreclaimable=449699840i,committed_as=12572475392i,dirty=532480i,swap_total=8589930496i,inactive=3454791680i,wired=0i,commit_limit=16853958656i,used_percent=19.788658222577983,vmalloc_chunk=0i,vmalloc_total=35184372087808i,used=3270680576i,cached=7313321984i,slab=542412800i,sunreclaim=92712960i,available=12022804480i,buffered=989876224i,active=7161057280i,huge_pages_free=0i,mapped=933064704i,available_percent=72.741792786921,high_total=0i,huge_page_size=2097152i,page_tables=38985728i,shared=887447552i,vmalloc_used=38621184i,write_back=0i,write_back_tmp=0i,total=16528056320i,high_free=0i,low_free=0i,low_total=0i,swap_cached=120016896i,swap_free=8445227008i 40000000000
cpu,cpu=cpu1,host=gianarb usage_user=5.923694779116283,usage_system=2.6104417670674573,usage_idle=90.0602409638421,usage_nice=0,usage_steal=0,usage_guest_nice=0,usage_iowait=0.10040160642565496,usage_irq=0.9036144578311087,usage_softirq=0.40160642570261984,usage_guest=0 40000000000
cpu,cpu=cpu0,host=gianarb usage_user=5.432595573437017,usage_system=2.816901408448739,usage_idle=90.34205231386129,usage_nice=0,usage_softirq=0.4024144869220654,usage_iowait=0,usage_irq=1.006036217302304,usage_steal=0,usage_guest=0,usage_guest_nice=0 40000000000
mem,host=gianarb free=4952854528i,cached=7313227776i,low_free=0i,low_total=0i,swap_free=8445227008i,write_back=0i,total=16528056320i,slab=542396416i,commit_limit=16853958656i,huge_page_size=2097152i,used=3272081408i,available_percent=72.7339120780537,vmalloc_used=38621184i,used_percent=19.797133701925816,committed_as=12559798272i,sunreclaim=92696576i,vmalloc_chunk=0i,sreclaimable=449699840i,swap_cached=120016896i,inactive=3454795776i,wired=0i,high_free=0i,huge_pages_free=0i,mapped=933007360i,vmalloc_total=35184372087808i,dirty=614400i,huge_pages_total=0i,page_tables=39014400i,shared=887349248i,swap_total=8589930496i,write_back_tmp=0i,available=12021501952i,buffered=989892608i,active=7161757696i,high_total=0i 50000000000
cpu,cpu=cpu-total,host=gianarb usage_softirq=0.40251572327036017,usage_guest_nice=0,usage_iowait=0.0754716981132104,usage_system=2.088050314465226,usage_idle=91.19496855345912,usage_nice=0,usage_irq=1.0062893081763293,usage_steal=0,usage_guest=0,usage_user=5.232704402510964 50000000000
cpu,cpu=cpu3,host=gianarb usage_system=1.9114688128780644,usage_nice=0,usage_iowait=0,usage_guest_nice=0,usage_user=4.225352112677345,usage_idle=92.15291750504086,usage_irq=1.3078470824950963,usage_softirq=0.4024144869215021,usage_steal=0,usage_guest=0 50000000000
cpu,cpu=cpu2,host=gianarb usage_guest=0,usage_guest_nice=0,usage_user=4.646464646464331,usage_system=2.0202020202021824,usage_nice=0,usage_iowait=0,usage_softirq=0.30303030303026995,usage_idle=92.1212121211883,usage_irq=0.9090909090908099,usage_steal=0 50000000000
cpu,cpu=cpu1,host=gianarb usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=6.432160804022921,usage_idle=89.94974874371933,usage_iowait=0.20100502512564486,usage_softirq=0.4020100502512897,usage_system=2.1105527638193067,usage_nice=0,usage_irq=0.9045226130652948 50000000000
cpu,cpu=cpu0,host=gianarb usage_guest=0,usage_guest_nice=0,usage_system=2.206619859579557,usage_idle=90.5717151454471,usage_nice=0,usage_irq=1.1033099297897786,usage_steal=0,usage_user=5.717151454361589,usage_iowait=0,usage_softirq=0.40120361083223216 50000000000
cpu,cpu=cpu-total,host=gianarb usage_iowait=0.12537612838516934,usage_irq=1.02808425275836,usage_softirq=0.37612838515565056,usage_guest=0,usage_user=4.864593781349303,usage_system=2.557673019055687,usage_idle=91.04814443328343,usage_nice=0,usage_steal=0,usage_guest_nice=0 60000000000
cpu,cpu=cpu3,host=gianarb usage_nice=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_softirq=0.3968253968255333,usage_user=5.853174603177146,usage_system=3.075396825396861,usage_idle=89.28571428573105,usage_iowait=0.19841269841269618,usage_irq=1.190476190476459 60000000000
cpu,cpu=cpu2,host=gianarb usage_idle=90.45226130652605,usage_iowait=0,usage_irq=1.00502512562801,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=5.527638190956198,usage_system=2.613065326632883,usage_nice=0,usage_softirq=0.4020100502512897 60000000000
cpu,cpu=cpu1,host=gianarb usage_irq=1.004016064257059,usage_softirq=0.40160642570276656,usage_guest=0,usage_idle=92.06827309236002,usage_nice=0,usage_iowait=0.10040160642569164,usage_steal=0,usage_guest_nice=0,usage_user=3.9156626505969085,usage_system=2.5100401606427902 60000000000
mem,host=gianarb used_percent=19.80092536373932,dirty=606208i,low_free=0i,low_total=0i,swap_free=8445227008i,total=16528056320i,buffered=989941760i,sunreclaim=92696576i,swap_cached=120016896i,swap_total=8589930496i,vmalloc_chunk=0i,available_percent=72.72972390258651,sreclaimable=449699840i,huge_page_size=2097152i,page_tables=39030784i,vmalloc_total=35184372087808i,vmalloc_used=38621184i,free=4951887872i,cached=7313518592i,mapped=933064704i,write_back=0i,committed_as=12566306816i,high_free=0i,huge_pages_total=0i,available=12020809728i,inactive=3454889984i,commit_limit=16853958656i,huge_pages_free=0i,shared=887414784i,active=7163142144i,slab=542396416i,high_total=0i,write_back_tmp=0i,used=3272708096i,wired=0i 60000000000
cpu,cpu=cpu0,host=gianarb usage_user=4.233870967743414,usage_idle=92.1370967742039,usage_irq=0.9072580645166096,usage_softirq=0.40322580645131717,usage_steal=0,usage_guest=0,usage_system=2.0161290322588776,usage_nice=0,usage_iowait=0.30241935483870275,usage_guest_nice=0 60000000000
cpu,cpu=cpu-total,host=gianarb usage_system=2.1646111250960742,usage_nice=0,usage_iowait=0.07550969041027993,usage_softirq=0.4027183488547309,usage_guest=0,usage_guest_nice=0,usage_user=5.008809463876584,usage_irq=1.031965768940087,usage_steal=0,usage_idle=91.31638560282546 70000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.8116232464903925,usage_system=2.3046092184363167,usage_irq=1.1022044088174183,usage_guest_nice=0,usage_idle=90.28056112219949,usage_nice=0,usage_iowait=0.10020040080162232,usage_softirq=0.4008016032062045,usage_steal=0,usage_guest=0 70000000000
cpu,cpu=cpu2,host=gianarb usage_idle=91.54929577468191,usage_nice=0,usage_iowait=0.20120724346075106,usage_irq=0.9054325955735942,usage_softirq=0.4024144869215021,usage_guest=0,usage_user=4.8289738430545945,usage_system=2.112676056336385,usage_guest_nice=0,usage_steal=0 70000000000
cpu,cpu=cpu1,host=gianarb usage_user=4.325955734408353,usage_system=2.2132796780681665,usage_idle=91.95171026157863,usage_nice=0,usage_softirq=0.40241448692149784,usage_steal=0,usage_guest=0,usage_iowait=0.10060362173033871,usage_irq=1.0060362173035302,usage_guest_nice=0 70000000000
cpu,cpu=cpu0,host=gianarb usage_user=4.964539007090499,usage_nice=0,usage_guest=0,usage_irq=1.114488348531155,usage_softirq=0.40526849037569845,usage_steal=0,usage_guest_nice=0,usage_system=2.0263424518750366,usage_idle=91.48936170212531,usage_iowait=0 70000000000
mem,host=gianarb total=16528056320i,used_percent=19.80218925101049,shared=887414784i,swap_total=8589930496i,low_free=0i,swap_free=8445227008i,available=12020600832i,slab=542396416i,commit_limit=16853958656i,dirty=131072i,huge_page_size=2097152i,buffered=989958144i,wired=0i,sunreclaim=92696576i,write_back=0i,used=3272916992i,cached=7313534976i,committed_as=12573659136i,high_total=0i,sreclaimable=449699840i,free=4951646208i,vmalloc_total=35184372087808i,active=7163576320i,huge_pages_total=0i,mapped=933154816i,vmalloc_used=38604800i,swap_cached=120016896i,write_back_tmp=0i,inactive=3454906368i,available_percent=72.72846001531533,high_free=0i,low_total=0i,page_tables=38998016i,huge_pages_free=0i,vmalloc_chunk=0i 70000000000

View File

@ -0,0 +1,42 @@
tests:
- query: "select host, inactive from mem where time >=30000000000 AND time < 50000000000"
result: |
name: mem
time host inactive
---- ---- --------
30000000000 gianarb 3460194304
40000000000 gianarb 3454791680
dataset: |
mem,host=gianarb page_tables=39534592i,vmalloc_chunk=0i,write_back_tmp=0i,dirty=884736i,high_total=0i,available=11992494080i,used=3284553728i,active=7172775936i,huge_pages_free=0i,swap_total=8589930496i,vmalloc_used=38604800i,free=4928421888i,commit_limit=16853958656i,committed_as=12584218624i,mapped=939278336i,vmalloc_total=35184372087808i,write_back=0i,buffered=989163520i,wired=0i,low_free=0i,huge_page_size=2097152i,swap_cached=120016896i,swap_free=8445227008i,inactive=3461185536i,slab=542363648i,high_free=0i,shared=903233536i,sreclaimable=449650688i,total=16528056320i,cached=7325917184i,available_percent=72.55840522208482,sunreclaim=92712960i,used_percent=19.87259520664557,huge_pages_total=0i,low_total=0i 0
mem,host=gianarb slab=542392320i,shared=931356672i,vmalloc_used=38506496i,sunreclaim=92692480i,write_back=0i,total=16528056320i,commit_limit=16853958656i,huge_pages_free=0i,vmalloc_chunk=0i,active=7159382016i,huge_page_size=2097152i,swap_total=8589930496i,used=3266457600i,buffered=989843456i,wired=0i,high_free=0i,page_tables=38965248i,swap_cached=120016896i,write_back_tmp=0i,inactive=3454332928i,used_percent=19.7631078740177,committed_as=12570415104i,dirty=339968i,high_total=0i,huge_pages_total=0i,sreclaimable=449699840i,vmalloc_total=35184372087808i,free=4914728960i,cached=7357026304i,available_percent=72.49944859820032,low_free=0i,low_total=0i,swap_free=8445227008i,available=11982749696i,mapped=938016768i 20000000000
cpu,cpu=cpu-total,host=gianarb usage_user=6.102117061021656,usage_system=2.938978829389874,usage_nice=0,usage_irq=1.0709838107097638,usage_guest=0,usage_idle=89.41469489414925,usage_iowait=0.024906600249037934,usage_softirq=0.4483188044832491,usage_steal=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.711422845699912,usage_nice=0,usage_iowait=0,usage_irq=1.302605210421328,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_system=2.905811623247315,usage_idle=89.67935871744233,usage_softirq=0.4008016032064967 30000000000
cpu,cpu=cpu2,host=gianarb usage_user=5.982053838488868,usage_idle=89.73080757727861,usage_irq=0.8973080757725367,usage_softirq=0.4985044865405501,usage_steal=0,usage_guest=0,usage_system=2.8913260219364374,usage_nice=0,usage_iowait=0,usage_guest_nice=0 30000000000
cpu,cpu=cpu1,host=gianarb usage_iowait=0,usage_irq=1.0912698412698993,usage_softirq=0.4960317460319519,usage_guest_nice=0,usage_steal=0,usage_guest=0,usage_user=6.051587301585189,usage_system=3.075396825396861,usage_idle=89.28571428573105,usage_nice=0 30000000000
cpu,cpu=cpu0,host=gianarb usage_user=6.560636182902656,usage_system=2.9821073558650495,usage_idle=88.86679920477891,usage_irq=1.0934393638174862,usage_steal=0,usage_nice=0,usage_iowait=0,usage_softirq=0.4970178926437982,usage_guest=0,usage_guest_nice=0 30000000000
mem,host=gianarb used=3279171584i,wired=0i,committed_as=12718530560i,huge_pages_total=0i,active=7167565824i,swap_total=8589930496i,vmalloc_total=35184372087808i,available=11979239424i,cached=7348174848i,buffered=989859840i,commit_limit=16853958656i,low_free=0i,vmalloc_used=38834176i,total=16528056320i,inactive=3460194304i,available_percent=72.47821033562403,high_free=0i,huge_pages_free=0i,slab=542396416i,dirty=487424i,page_tables=39669760i,swap_free=8445227008i,vmalloc_chunk=0i,write_back=0i,free=4910850048i,huge_page_size=2097152i,low_total=0i,sunreclaim=92696576i,write_back_tmp=0i,used_percent=19.84003152283547,high_total=0i,mapped=938799104i,shared=922521600i,sreclaimable=449699840i,swap_cached=120016896i 30000000000
cpu,cpu=cpu-total,host=gianarb usage_guest_nice=0,usage_user=5.682102628286863,usage_idle=89.88735919901404,usage_nice=0,usage_iowait=0.10012515644554432,usage_guest=0,usage_system=2.828535669587463,usage_irq=1.076345431789406,usage_softirq=0.4255319148935456,usage_steal=0 40000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.599999999992869,usage_steal=0,usage_guest_nice=0,usage_softirq=0.4999999999999318,usage_guest=0,usage_system=2.9999999999984537,usage_idle=89.39999999999075,usage_nice=0,usage_iowait=0.19999999999995852,usage_irq=1.2999999999994816 40000000000
cpu,cpu=cpu2,host=gianarb usage_guest=0,usage_guest_nice=0,usage_user=5.682951146558077,usage_system=2.8913260219341703,usage_iowait=0.09970089730813834,usage_irq=0.8973080757728201,usage_softirq=0.39880358923227005,usage_idle=90.02991026919126,usage_nice=0,usage_steal=0 40000000000
mem,host=gianarb free=4954177536i,huge_pages_total=0i,sreclaimable=449699840i,committed_as=12572475392i,dirty=532480i,swap_total=8589930496i,inactive=3454791680i,wired=0i,commit_limit=16853958656i,used_percent=19.788658222577983,vmalloc_chunk=0i,vmalloc_total=35184372087808i,used=3270680576i,cached=7313321984i,slab=542412800i,sunreclaim=92712960i,available=12022804480i,buffered=989876224i,active=7161057280i,huge_pages_free=0i,mapped=933064704i,available_percent=72.741792786921,high_total=0i,huge_page_size=2097152i,page_tables=38985728i,shared=887447552i,vmalloc_used=38621184i,write_back=0i,write_back_tmp=0i,total=16528056320i,high_free=0i,low_free=0i,low_total=0i,swap_cached=120016896i,swap_free=8445227008i 40000000000
cpu,cpu=cpu1,host=gianarb usage_user=5.923694779116283,usage_system=2.6104417670674573,usage_idle=90.0602409638421,usage_nice=0,usage_steal=0,usage_guest_nice=0,usage_iowait=0.10040160642565496,usage_irq=0.9036144578311087,usage_softirq=0.40160642570261984,usage_guest=0 40000000000
cpu,cpu=cpu0,host=gianarb usage_user=5.432595573437017,usage_system=2.816901408448739,usage_idle=90.34205231386129,usage_nice=0,usage_softirq=0.4024144869220654,usage_iowait=0,usage_irq=1.006036217302304,usage_steal=0,usage_guest=0,usage_guest_nice=0 40000000000
mem,host=gianarb free=4952854528i,cached=7313227776i,low_free=0i,low_total=0i,swap_free=8445227008i,write_back=0i,total=16528056320i,slab=542396416i,commit_limit=16853958656i,huge_page_size=2097152i,used=3272081408i,available_percent=72.7339120780537,vmalloc_used=38621184i,used_percent=19.797133701925816,committed_as=12559798272i,sunreclaim=92696576i,vmalloc_chunk=0i,sreclaimable=449699840i,swap_cached=120016896i,inactive=3454795776i,wired=0i,high_free=0i,huge_pages_free=0i,mapped=933007360i,vmalloc_total=35184372087808i,dirty=614400i,huge_pages_total=0i,page_tables=39014400i,shared=887349248i,swap_total=8589930496i,write_back_tmp=0i,available=12021501952i,buffered=989892608i,active=7161757696i,high_total=0i 50000000000
cpu,cpu=cpu-total,host=gianarb usage_softirq=0.40251572327036017,usage_guest_nice=0,usage_iowait=0.0754716981132104,usage_system=2.088050314465226,usage_idle=91.19496855345912,usage_nice=0,usage_irq=1.0062893081763293,usage_steal=0,usage_guest=0,usage_user=5.232704402510964 50000000000
cpu,cpu=cpu3,host=gianarb usage_system=1.9114688128780644,usage_nice=0,usage_iowait=0,usage_guest_nice=0,usage_user=4.225352112677345,usage_idle=92.15291750504086,usage_irq=1.3078470824950963,usage_softirq=0.4024144869215021,usage_steal=0,usage_guest=0 50000000000
cpu,cpu=cpu2,host=gianarb usage_guest=0,usage_guest_nice=0,usage_user=4.646464646464331,usage_system=2.0202020202021824,usage_nice=0,usage_iowait=0,usage_softirq=0.30303030303026995,usage_idle=92.1212121211883,usage_irq=0.9090909090908099,usage_steal=0 50000000000
cpu,cpu=cpu1,host=gianarb usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=6.432160804022921,usage_idle=89.94974874371933,usage_iowait=0.20100502512564486,usage_softirq=0.4020100502512897,usage_system=2.1105527638193067,usage_nice=0,usage_irq=0.9045226130652948 50000000000
cpu,cpu=cpu0,host=gianarb usage_guest=0,usage_guest_nice=0,usage_system=2.206619859579557,usage_idle=90.5717151454471,usage_nice=0,usage_irq=1.1033099297897786,usage_steal=0,usage_user=5.717151454361589,usage_iowait=0,usage_softirq=0.40120361083223216 50000000000
cpu,cpu=cpu-total,host=gianarb usage_iowait=0.12537612838516934,usage_irq=1.02808425275836,usage_softirq=0.37612838515565056,usage_guest=0,usage_user=4.864593781349303,usage_system=2.557673019055687,usage_idle=91.04814443328343,usage_nice=0,usage_steal=0,usage_guest_nice=0 60000000000
cpu,cpu=cpu3,host=gianarb usage_nice=0,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_softirq=0.3968253968255333,usage_user=5.853174603177146,usage_system=3.075396825396861,usage_idle=89.28571428573105,usage_iowait=0.19841269841269618,usage_irq=1.190476190476459 60000000000
cpu,cpu=cpu2,host=gianarb usage_idle=90.45226130652605,usage_iowait=0,usage_irq=1.00502512562801,usage_steal=0,usage_guest=0,usage_guest_nice=0,usage_user=5.527638190956198,usage_system=2.613065326632883,usage_nice=0,usage_softirq=0.4020100502512897 60000000000
cpu,cpu=cpu1,host=gianarb usage_irq=1.004016064257059,usage_softirq=0.40160642570276656,usage_guest=0,usage_idle=92.06827309236002,usage_nice=0,usage_iowait=0.10040160642569164,usage_steal=0,usage_guest_nice=0,usage_user=3.9156626505969085,usage_system=2.5100401606427902 60000000000
mem,host=gianarb used_percent=19.80092536373932,dirty=606208i,low_free=0i,low_total=0i,swap_free=8445227008i,total=16528056320i,buffered=989941760i,sunreclaim=92696576i,swap_cached=120016896i,swap_total=8589930496i,vmalloc_chunk=0i,available_percent=72.72972390258651,sreclaimable=449699840i,huge_page_size=2097152i,page_tables=39030784i,vmalloc_total=35184372087808i,vmalloc_used=38621184i,free=4951887872i,cached=7313518592i,mapped=933064704i,write_back=0i,committed_as=12566306816i,high_free=0i,huge_pages_total=0i,available=12020809728i,inactive=3454889984i,commit_limit=16853958656i,huge_pages_free=0i,shared=887414784i,active=7163142144i,slab=542396416i,high_total=0i,write_back_tmp=0i,used=3272708096i,wired=0i 60000000000
cpu,cpu=cpu0,host=gianarb usage_user=4.233870967743414,usage_idle=92.1370967742039,usage_irq=0.9072580645166096,usage_softirq=0.40322580645131717,usage_steal=0,usage_guest=0,usage_system=2.0161290322588776,usage_nice=0,usage_iowait=0.30241935483870275,usage_guest_nice=0 60000000000
cpu,cpu=cpu-total,host=gianarb usage_system=2.1646111250960742,usage_nice=0,usage_iowait=0.07550969041027993,usage_softirq=0.4027183488547309,usage_guest=0,usage_guest_nice=0,usage_user=5.008809463876584,usage_irq=1.031965768940087,usage_steal=0,usage_idle=91.31638560282546 70000000000
cpu,cpu=cpu3,host=gianarb usage_user=5.8116232464903925,usage_system=2.3046092184363167,usage_irq=1.1022044088174183,usage_guest_nice=0,usage_idle=90.28056112219949,usage_nice=0,usage_iowait=0.10020040080162232,usage_softirq=0.4008016032062045,usage_steal=0,usage_guest=0 70000000000
cpu,cpu=cpu2,host=gianarb usage_idle=91.54929577468191,usage_nice=0,usage_iowait=0.20120724346075106,usage_irq=0.9054325955735942,usage_softirq=0.4024144869215021,usage_guest=0,usage_user=4.8289738430545945,usage_system=2.112676056336385,usage_guest_nice=0,usage_steal=0 70000000000
cpu,cpu=cpu1,host=gianarb usage_user=4.325955734408353,usage_system=2.2132796780681665,usage_idle=91.95171026157863,usage_nice=0,usage_softirq=0.40241448692149784,usage_steal=0,usage_guest=0,usage_iowait=0.10060362173033871,usage_irq=1.0060362173035302,usage_guest_nice=0 70000000000
cpu,cpu=cpu0,host=gianarb usage_user=4.964539007090499,usage_nice=0,usage_guest=0,usage_irq=1.114488348531155,usage_softirq=0.40526849037569845,usage_steal=0,usage_guest_nice=0,usage_system=2.0263424518750366,usage_idle=91.48936170212531,usage_iowait=0 70000000000
mem,host=gianarb total=16528056320i,used_percent=19.80218925101049,shared=887414784i,swap_total=8589930496i,low_free=0i,swap_free=8445227008i,available=12020600832i,slab=542396416i,commit_limit=16853958656i,dirty=131072i,huge_page_size=2097152i,buffered=989958144i,wired=0i,sunreclaim=92696576i,write_back=0i,used=3272916992i,cached=7313534976i,committed_as=12573659136i,high_total=0i,sreclaimable=449699840i,free=4951646208i,vmalloc_total=35184372087808i,active=7163576320i,huge_pages_total=0i,mapped=933154816i,vmalloc_used=38604800i,swap_cached=120016896i,write_back_tmp=0i,inactive=3454906368i,available_percent=72.72846001531533,high_free=0i,low_total=0i,page_tables=38998016i,huge_pages_free=0i,vmalloc_chunk=0i 70000000000

View File

@ -0,0 +1,16 @@
tests:
- query: "select * from m0 where time >= 30000000000 AND time < 50000000000"
billing:
point_count: 1
result: |
name: m0
time f0 f1 t0
---- -- -- --
30000000000 0 10 tv0
40000000000 1 20 tv1
dataset: |
m0,t0=tv0 f0=0i,f1=10i 30000000000
m0,t0=tv1 f0=1i,f1=20i 40000000000
m0,t0=tv1 f0=2i,f1=30i 70000000000
m1,t0=tv0 f0=0i,f1=10i 40000000000

View File

@ -0,0 +1,84 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://influxdata.com/idpe.schema.json",
"title": "InfluxQL Test",
"description": "An InfluxQL Test Schema",
"type": "object",
"required": ["tests"],
"additionalProperties": false,
"properties": {
"description": {
"description": "An optional description of the test suite",
"type": "string"
},
"tests": {
"type": "array",
"items": {"$ref": "#/definitions/test"}
},
"dataset": {
"description": "The dataset to be used for this test",
"type": "string"
},
"generated": {
"description": "The dataset to be used for this test",
"type": "object",
"required": ["start", "end", "toml"],
"properties": {
"start": {
"description": "The start time in restricted RFC3339 or nanoseconds",
"type": "string",
"pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\d+)$"
},
"end": {
"description": "The end time in restricted RFC3339",
"type": "string",
"pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z|\\d+)$"
},
"toml": {
"description": "The TOML schema for the dataset",
"type": "string"
}
}
}
},
"oneOf": [
{"required": ["dataset"]},
{"required": ["generated"]}
],
"definitions": {
"test": {
"type": "object",
"required": ["query", "result"],
"additionalProperties": false,
"properties": {
"name": {
"description": "A name for this test",
"type": "string"
},
"description": {
"description": "An optional description of the test",
"type": "string"
},
"query": {
"description": "The InfluxQL query to under test",
"type": "string"
},
"result": {
"description": "The expected results in table format",
"type": "string"
},
"billing": {
"description": "Optional billing results",
"type": "object",
"additionalProperties": false,
"properties": {
"point_count": {
"description": "The expected number of billing records",
"type": "integer"
}
}
}
}
}
}
}

View File

@ -0,0 +1,192 @@
package v1validation
import (
"context"
"fmt"
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"testing"
"time"
"github.com/influxdata/influxdb/v2"
icontext "github.com/influxdata/influxdb/v2/context"
"github.com/influxdata/influxdb/v2/mock"
datagen "github.com/influxdata/influxdb/v2/pkg/data/gen"
"github.com/influxdata/influxdb/v2/storage/reads"
"github.com/influxdata/influxdb/v2/tests"
"github.com/influxdata/influxdb/v2/tests/pipeline"
"github.com/stretchr/testify/assert"
"go.uber.org/zap/zapcore"
"go.uber.org/zap/zaptest"
"gopkg.in/yaml.v2"
)
var skipMap = map[string]string{
// file_name_without_extension: skip_reason
}
type GeneratedDataset struct {
Start string `yaml:"start"`
End string `yaml:"end"`
Toml string `yaml:"toml"`
}
type TestSuite struct {
Tests []Test `yaml:"tests"`
Dataset string `yaml:"dataset"` // Line protocol OR
Generated *GeneratedDataset `yaml:"generated"` // TOML schema description
}
type Test struct {
Name string `yaml:"name"`
Query string `yaml:"query"`
Result string `yaml:"result"`
}
func TestGoldenFiles(t *testing.T) {
err := filepath.Walk("./goldenfiles", func(path string, info os.FileInfo, err error) error {
if info.IsDir() {
return nil
}
base := filepath.Base(path)
ext := filepath.Ext(base)
testName := strings.TrimSuffix(base, ext)
t.Run(testName, func(t *testing.T) {
if reason, ok := skipMap[testName]; ok {
t.Skip(reason)
}
gf := testSuiteFromPath(t, path)
validate(t, gf)
})
return nil
})
if err != nil {
t.Fatal(err)
}
}
// Unmarshal a TestSuite from a YAML file
func testSuiteFromPath(t *testing.T, path string) *TestSuite {
f, err := os.Open(path)
if err != nil {
t.Fatal(err)
}
b, err := ioutil.ReadAll(f)
if err != nil {
t.Fatal(err)
}
gf := &TestSuite{}
err = yaml.Unmarshal(b, gf)
if err != nil {
t.Fatal(err)
}
return gf
}
func validate(t *testing.T, gf *TestSuite) {
t.Helper()
ctx := context.Background()
p := tests.NewDefaultPipeline(t,
tests.WithLogger(zaptest.NewLogger(t, zaptest.Level(zapcore.ErrorLevel))),
)
p.MustOpen()
defer p.MustClose()
orgID := p.DefaultOrgID
bucketID := p.DefaultBucketID
fx := pipeline.NewBaseFixture(t, p.Pipeline, orgID, bucketID)
var dataset string
if gf.Generated != nil {
spec, err := datagen.NewSpecFromToml(gf.Generated.Toml)
if err != nil {
t.Fatalf("error processing TOML: %v", err)
}
tryParse := func(s string) (time.Time, error) {
if v, err := strconv.Atoi(s); err == nil {
return time.Unix(0, int64(v)), nil
}
return time.Parse(time.RFC3339, s)
}
start, err := tryParse(gf.Generated.Start)
if err != nil {
t.Fatalf("error parsing start: %v", err)
}
end, err := tryParse(gf.Generated.End)
if err != nil {
t.Fatalf("error parsing end: %v", err)
}
if end.Before(start) {
t.Fatal("error: start must be before end")
}
sg := datagen.NewSeriesGeneratorFromSpec(spec, datagen.TimeRange{
Start: start,
End: end,
})
rs := mock.NewResultSetFromSeriesGenerator(sg, mock.WithGeneratorMaxValues(10000))
var sb strings.Builder
if err := reads.ResultSetToLineProtocol(&sb, rs); err != nil {
t.Fatalf("error generating data: %v", err)
}
dataset = sb.String()
if len(dataset) == 0 {
t.Fatal("no data generated")
}
} else {
dataset = gf.Dataset
}
if err := fx.Admin.WriteBatch(dataset); err != nil {
t.Fatal(err)
}
p.Flush()
ctx = icontext.SetAuthorizer(ctx, tests.MakeAuthorization(p.DefaultOrgID, p.DefaultUserID, influxdb.OperPermissions()))
if err := p.Launcher.DBRPMappingServiceV2().Create(ctx, &influxdb.DBRPMappingV2{
Database: "mydb",
RetentionPolicy: "autogen",
Default: true,
OrganizationID: orgID,
BucketID: bucketID,
}); err != nil {
t.Fatal(err)
}
for i := range gf.Tests {
test := &gf.Tests[i]
name := test.Name
if len(name) == 0 {
name = fmt.Sprintf("query_%02d", i)
}
t.Run(name, func(t *testing.T) {
err := fx.Admin.Client.Get("/query").
QueryParams([2]string{"db", "mydb"}).
QueryParams([2]string{"q", test.Query}).
QueryParams([2]string{"epoch", "ns"}).
Header("Content-Type", "application/vnd.influxql").
Header("Accept", "text/plain").
RespFn(func(resp *http.Response) error {
b, err := ioutil.ReadAll(resp.Body)
assert.NoError(t, err)
assert.Equal(t, test.Result, string(b))
return nil
}).
Do(ctx)
if err != nil {
t.Fatal(err)
}
})
}
}