good morning!!!!

Skip to content
Snippets Groups Projects
tester_test.go 4.02 KiB
Newer Older
Garet Halliday's avatar
Garet Halliday committed
package test_test

import (
	"crypto/rand"
	"encoding/hex"
Garet Halliday's avatar
Garet Halliday committed
	"fmt"
	_ "net/http/pprof"
Garet Halliday's avatar
Garet Halliday committed
	"gfx.cafe/gfx/pggat/lib/auth"
	"gfx.cafe/gfx/pggat/lib/auth/credentials"
	"gfx.cafe/gfx/pggat/lib/bouncer/backends/v0"
	"gfx.cafe/gfx/pggat/lib/gat"
Garet Halliday's avatar
Garet Halliday committed
	"gfx.cafe/gfx/pggat/lib/gat/modules/net_listener"
Garet Halliday's avatar
Garet Halliday committed
	"gfx.cafe/gfx/pggat/lib/gat/modules/raw_pools"
	"gfx.cafe/gfx/pggat/lib/gat/pool"
	"gfx.cafe/gfx/pggat/lib/gat/pool/pools/session"
	"gfx.cafe/gfx/pggat/lib/gat/pool/pools/transaction"
	"gfx.cafe/gfx/pggat/lib/gat/pool/recipe"
	"gfx.cafe/gfx/pggat/test"
	"gfx.cafe/gfx/pggat/test/tests"
Garet Halliday's avatar
Garet Halliday committed
)

Garet Halliday's avatar
Garet Halliday committed
func daisyChain(creds auth.Credentials, control recipe.Dialer, n int) (recipe.Dialer, error) {
Garet Halliday's avatar
Garet Halliday committed
	for i := 0; i < n; i++ {
		var options = pool.Options{
			Credentials: creds,
		}
		if i%2 == 0 {
			options = transaction.Apply(options)
		} else {
			options.ServerResetQuery = "DISCARD ALL"
			options = session.Apply(options)
		}

		p := pool.NewPool(options)
		p.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
			Dialer: control,
		}))

Garet Halliday's avatar
Garet Halliday committed
		m := new(raw_pools.Module)
Garet Halliday's avatar
Garet Halliday committed
		m.Add("runner", "pool", p)

Garet Halliday's avatar
Garet Halliday committed
		l := &net_listener.Module{
			Config: net_listener.Config{
				Network: "tcp",
				Address: ":0",
			},
		}
		if err := l.Start(); err != nil {
Garet Halliday's avatar
Garet Halliday committed
			return recipe.Dialer{}, err
		}
Garet Halliday's avatar
Garet Halliday committed
		port := l.Addr().(*net.TCPAddr).Port

		server := gat.NewServer(m, l)
Garet Halliday's avatar
Garet Halliday committed
		if err := server.Start(); err != nil {
			panic(err)
		}
Garet Halliday's avatar
Garet Halliday committed
		control = recipe.Dialer{
			Network: "tcp",
			Address: ":" + strconv.Itoa(port),
			AcceptOptions: backends.AcceptOptions{
				Credentials: creds,
				Database:    "pool",
			},
		}
	}

Garet Halliday's avatar
Garet Halliday committed
	return control, nil
}

func TestTester(t *testing.T) {
Garet Halliday's avatar
Garet Halliday committed
	control := recipe.Dialer{
Garet Halliday's avatar
Garet Halliday committed
		Network: "tcp",
		Address: "localhost:5432",
		AcceptOptions: backends.AcceptOptions{
Garet Halliday's avatar
Garet Halliday committed
			Credentials: credentials.Cleartext{
				Username: "postgres",
				Password: "password",
			},
			Database: "postgres",
		},
	}

	// generate random password for testing
	var raw [32]byte
	_, err := rand.Read(raw[:])
	if err != nil {
		t.Error(err)
		return
	}
	password := hex.EncodeToString(raw[:])
	creds := credentials.Cleartext{
		Username: "runner",
		Password: password,
	}

	parent, err := daisyChain(creds, control, 16)
Garet Halliday's avatar
Garet Halliday committed
	if err != nil {
		t.Error(err)
		return
	}

Garet Halliday's avatar
Garet Halliday committed
	m := new(raw_pools.Module)
	transactionPool := pool.NewPool(transaction.Apply(pool.Options{
		Credentials: creds,
	}))
	transactionPool.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
		Dialer: parent,
Garet Halliday's avatar
Garet Halliday committed
	m.Add("runner", "transaction", transactionPool)

	sessionPool := pool.NewPool(session.Apply(pool.Options{
		Credentials:      creds,
		ServerResetQuery: "discard all",
	}))
	sessionPool.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
		Dialer: parent,
Garet Halliday's avatar
Garet Halliday committed
	m.Add("runner", "session", sessionPool)

Garet Halliday's avatar
Garet Halliday committed
	l := &net_listener.Module{
		Config: net_listener.Config{
			Network: "tcp",
			Address: ":0",
		},
	}
	if err = l.Start(); err != nil {
Garet Halliday's avatar
Garet Halliday committed
	port := l.Addr().(*net.TCPAddr).Port
	server := gat.NewServer(m, l)
Garet Halliday's avatar
Garet Halliday committed

	if err = server.Start(); err != nil {
		t.Error(err)
		return
	}
Garet Halliday's avatar
Garet Halliday committed
	transactionDialer := recipe.Dialer{
		Network: "tcp",
		Address: ":" + strconv.Itoa(port),
		AcceptOptions: backends.AcceptOptions{
			Credentials: creds,
			Database:    "transaction",
		},
	}
Garet Halliday's avatar
Garet Halliday committed
	sessionDialer := recipe.Dialer{
		Network: "tcp",
		Address: ":" + strconv.Itoa(port),
		AcceptOptions: backends.AcceptOptions{
			Credentials: creds,
			Database:    "session",
		},
	}

	tester := test.NewTester(test.Config{
Garet Halliday's avatar
Garet Halliday committed
		Stress: 8,
Garet Halliday's avatar
Garet Halliday committed

Garet Halliday's avatar
Garet Halliday committed
		Modes: map[string]recipe.Dialer{
			"control":     control,
			"transaction": transactionDialer,
			"session":     sessionDialer,
Garet Halliday's avatar
Garet Halliday committed
		},
	})
	if err = tester.Run(
Garet Halliday's avatar
Garet Halliday committed
		tests.SimpleQuery,
Garet Halliday's avatar
Garet Halliday committed
		tests.Transaction,
		tests.Sync,
		tests.EQP0,
		tests.EQP1,
		tests.EQP2,
		tests.EQP3,
		tests.EQP4,
		tests.EQP5,
		tests.EQP6,
		tests.EQP7,
Garet Halliday's avatar
Garet Halliday committed
		tests.CopyOut0,
		tests.CopyOut1,
		tests.CopyIn0,
		tests.CopyIn1,
Garet Halliday's avatar
Garet Halliday committed
	); err != nil {
Garet Halliday's avatar
Garet Halliday committed
		fmt.Print(err.Error())
		t.Fail()
Garet Halliday's avatar
Garet Halliday committed
	}
}