good morning!!!!

Skip to content
Snippets Groups Projects
tester_test.go 3.2 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"
Garet Halliday's avatar
Garet Halliday committed
	"testing"

	"pggat/lib/auth/credentials"
	"pggat/lib/bouncer/backends/v0"
	"pggat/lib/bouncer/frontends/v0"
	"pggat/lib/gat"
Garet Halliday's avatar
Garet Halliday committed
	"pggat/lib/gat/pool"
Garet Halliday's avatar
Garet Halliday committed
	"pggat/lib/gat/pool/dialer"
Garet Halliday's avatar
Garet Halliday committed
	"pggat/lib/gat/pool/pools/session"
	"pggat/lib/gat/pool/pools/transaction"
	"pggat/lib/gat/pool/recipe"
Garet Halliday's avatar
Garet Halliday committed
	"pggat/test"
	"pggat/test/tests"
)

func TestTester(t *testing.T) {
	control := dialer.Net{
		Network: "tcp",
		Address: "localhost:5432",
		AcceptOptions: backends.AcceptOptions{
			Credentials: credentials.Cleartext{
				Username: "postgres",
				Password: "password",
Garet Halliday's avatar
Garet Halliday committed
			},
			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,
	}

		var g gat.PoolsMap
		p := pool.NewPool(transaction.Apply(pool.Options{
			Credentials: creds,
		}))
		p.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
			Dialer: control,
		}))
		g.Add("runner", "pool", p)

		listener, err := gat.Listen("tcp", ":0", frontends.AcceptOptions{})
		if err != nil {
			t.Error(err)
			return
		}
		port := listener.Listener.Addr().(*net.TCPAddr).Port

		go func() {
			err := gat.Serve(listener, &g)
			if err != nil {
				t.Error(err)
			}
		}()

		control = dialer.Net{
			Network: "tcp",
			Address: ":" + strconv.Itoa(port),
			AcceptOptions: backends.AcceptOptions{
				Credentials: creds,
				Database:    "pool",
			},
		}
	}

	var g gat.PoolsMap

	transactionPool := pool.NewPool(transaction.Apply(pool.Options{
		Credentials: creds,
	}))
	transactionPool.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
		Dialer: control,
	}))
	g.Add("runner", "transaction", transactionPool)

	sessionPool := pool.NewPool(session.Apply(pool.Options{
		Credentials:      creds,
		ServerResetQuery: "discard all",
	}))
	sessionPool.AddRecipe("runner", recipe.NewRecipe(recipe.Options{
		Dialer: control,
	}))
	g.Add("runner", "session", sessionPool)

	listener, err := gat.Listen("tcp", ":0", frontends.AcceptOptions{})
	if err != nil {
		t.Error(err)
		return
	}
	port := listener.Listener.Addr().(*net.TCPAddr).Port

	go func() {
		err := gat.Serve(listener, &g)
		if err != nil {
			t.Error(err)
		}
	}()

	transactionDialer := dialer.Net{
		Network: "tcp",
		Address: ":" + strconv.Itoa(port),
		AcceptOptions: backends.AcceptOptions{
			Credentials: creds,
			Database:    "transaction",
		},
	}
	sessionDialer := dialer.Net{
		Network: "tcp",
		Address: ":" + strconv.Itoa(port),
		AcceptOptions: backends.AcceptOptions{
			Credentials: creds,
			Database:    "session",
		},
	}

	tester := test.NewTester(test.Config{
		Modes: map[string]dialer.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,
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
	}
}