good morning!!!!

Skip to content
Snippets Groups Projects
Commit fd9fb8dc authored by Garet Halliday's avatar Garet Halliday
Browse files

better test runner

parent 8f01b23e
No related branches found
No related tags found
No related merge requests found
package inst
type Sync struct{}
func (Sync) instruction() {}
var _ Instruction = Sync{}
...@@ -2,6 +2,7 @@ package test ...@@ -2,6 +2,7 @@ package test
import ( import (
"errors" "errors"
"fmt"
"io" "io"
"pggat/lib/bouncer/bouncers/v2" "pggat/lib/bouncer/bouncers/v2"
...@@ -16,9 +17,6 @@ import ( ...@@ -16,9 +17,6 @@ import (
type Runner struct { type Runner struct {
config Config config Config
test Test test Test
pools map[string]*pool.Pool
control fed.Conn
} }
func MakeRunner(config Config, test Test) Runner { func MakeRunner(config Config, test Test) Runner {
...@@ -28,107 +26,111 @@ func MakeRunner(config Config, test Test) Runner { ...@@ -28,107 +26,111 @@ func MakeRunner(config Config, test Test) Runner {
} }
} }
func (T *Runner) setup() error { func (T *Runner) prepare(client *gsql.Client) []Capturer {
// get pools ready results := make([]Capturer, len(T.test.Instructions))
if T.control != nil {
_ = T.control.Close()
}
var err error
T.control, _, err = T.config.Peer.Dial()
if err != nil {
return err
}
for name, p := range T.pools {
delete(T.pools, name)
p.Close()
}
if T.pools == nil {
T.pools = make(map[string]*pool.Pool)
}
for name, options := range T.config.Modes { for i, x := range T.test.Instructions {
opts := options switch v := x.(type) {
// allowing ps sync would mess up testing case inst.SimpleQuery:
opts.ParameterStatusSync = pool.ParameterStatusSyncNone q := packets.Query(v)
p := pool.NewPool(opts) client.Do(&results[i], q.IntoPacket())
p.AddRecipe("server", recipe.NewRecipe( case inst.Sync:
recipe.Options{ client.Do(&results[i], fed.NewPacket(packets.TypeSync))
Dialer: T.config.Peer, }
},
))
T.pools[name] = p
} }
return nil return results
} }
func (T *Runner) run(pkts ...fed.Packet) error { func (T *Runner) runControl() ([]Capturer, error) {
// expected control, _, err := T.config.Peer.Dial()
var expected Capturer if err != nil {
return nil, err
{ }
var client gsql.Client defer func() {
client.Do(&expected, pkts...) _ = control.Close()
if err := client.Close(); err != nil { }()
return err
} var client gsql.Client
results := T.prepare(&client)
if err = client.Close(); err != nil {
return nil, err
}
for { for {
p, err := client.ReadPacket(true) var p fed.Packet
if err != nil { p, err = client.ReadPacket(true)
if errors.Is(err, io.EOF) { if err != nil {
break if errors.Is(err, io.EOF) {
} break
return err
} }
return nil, err
}
clientErr, serverErr := bouncers.Bounce(&client, T.control, p) clientErr, serverErr := bouncers.Bounce(&client, control, p)
if clientErr != nil { if clientErr != nil {
return clientErr return nil, clientErr
} }
if serverErr != nil { if serverErr != nil {
return serverErr return nil, serverErr
}
} }
} }
// actual return results, nil
for name, p := range T.pools { }
var result Capturer
var client gsql.Client
client.Do(&result, pkts...)
if err := client.Close(); err != nil {
return err
}
if err := p.Serve(&client, nil, [8]byte{}); err != nil && !errors.Is(err, io.EOF) { func (T *Runner) runMode(options pool.Options) ([]Capturer, error) {
return err opts := options
} // allowing ps sync would mess up testing
opts.ParameterStatusSync = pool.ParameterStatusSyncNone
p := pool.NewPool(opts)
defer p.Close()
p.AddRecipe("server", recipe.NewRecipe(
recipe.Options{
Dialer: T.config.Peer,
},
))
var client gsql.Client
results := T.prepare(&client)
if err := client.Close(); err != nil {
return nil, err
}
if err := expected.Check(&result); err != nil { if err := p.Serve(&client, nil, [8]byte{}); err != nil && !errors.Is(err, io.EOF) {
return err return nil, err
}
_ = name
} }
return nil return results, nil
} }
func (T *Runner) Run() error { func (T *Runner) Run() error {
if err := T.setup(); err != nil { // control
expected, err := T.runControl()
if err != nil {
return err return err
} }
for _, i := range T.test.Instructions { // modes
switch v := i.(type) { for name, mode := range T.config.Modes {
case inst.SimpleQuery: actual, err := T.runMode(mode)
q := packets.Query(v) if err != nil {
if err := T.run(q.IntoPacket()); err != nil { return err
}
if len(expected) != len(actual) {
return fmt.Errorf("wrong number of results! expected %d but got %d", len(expected), len(actual))
}
for i, exp := range expected {
act := actual[i]
if err = exp.Check(&act); err != nil {
return err return err
} }
} }
_ = name
} }
return nil return nil
......
...@@ -35,6 +35,8 @@ func TestTester(t *testing.T) { ...@@ -35,6 +35,8 @@ func TestTester(t *testing.T) {
}) })
if err := tester.Run( if err := tester.Run(
tests.SimpleQuery, tests.SimpleQuery,
tests.Transaction,
tests.Sync,
); err != nil { ); err != nil {
t.Error(err) t.Error(err)
} }
......
package tests
import (
"pggat/test"
"pggat/test/inst"
)
var Sync = test.Test{
Instructions: []inst.Instruction{
inst.Sync{},
inst.SimpleQuery("BEGIN;"),
inst.Sync{},
inst.SimpleQuery("END;"),
},
}
package tests
import (
"pggat/test"
"pggat/test/inst"
)
var Transaction = test.Test{
Instructions: []inst.Instruction{
inst.SimpleQuery("BEGIN;"),
inst.SimpleQuery("select 1;"),
inst.SimpleQuery("this will fail;"),
inst.SimpleQuery("select 2;"),
inst.SimpleQuery("END;"),
},
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment