package client_test import ( "bytes" "net/http/httptest" "testing" "github.com/keys-pub/keys" "github.com/keys-pub/keys-ext/http/client" "github.com/keys-pub/keys-ext/http/server" "github.com/keys-pub/keys/dstore" "github.com/keys-pub/keys/http" "github.com/keys-pub/keys/tsutil" "github.com/keys-pub/keys/users" "github.com/stretchr/testify/require" ) type env struct { clock tsutil.Clock fi server.Fire users *users.Users client http.Client logger server.Logger srv *server.Server httpServer *httptest.Server handler http.Handler } func newEnv(t *testing.T) (*env, func()) { return newEnvWithOptions(t, &envOptions{logLevel: server.NoLevel}) } type handlerFn func(w http.ResponseWriter, req *http.Request) bool type proxyHandler struct { handlerFn handlerFn handler http.Handler } func (p proxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { if !p.handlerFn(w, req) { p.handler.ServeHTTP(w, req) } } type envOptions struct { fi server.Fire clock tsutil.Clock logLevel server.LogLevel handlerFn handlerFn } func newEnvWithOptions(t *testing.T, opts *envOptions) (*env, func()) { if opts == nil { opts = &envOptions{} } if opts.clock == nil { opts.clock = tsutil.NewTestClock() } if opts.fi == nil { mem := dstore.NewMem() mem.SetClock(opts.clock) opts.fi = mem } rds := server.NewRedisTest(opts.clock) client := http.NewClient() usrs := users.New(opts.fi, keys.NewSigchains(opts.fi), users.Client(client), users.Clock(opts.clock)) serverLogger := server.NewLogger(opts.logLevel) srv := server.New(opts.fi, rds, client, opts.clock, serverLogger) srv.SetClock(opts.clock) tasks := server.NewTestTasks(srv) srv.SetTasks(tasks) srv.SetInternalAuth("testtoken") _ = srv.SetInternalKey("6a169a699f7683c04d127504a12ace3b326e8b56a61a9b315cf6b42e20d6a44a") handler := server.NewHandler(srv) if opts.handlerFn != nil { handler = proxyHandler{ handlerFn: opts.handlerFn, handler: server.NewHandler(srv), } } httpServer := httptest.NewServer(handler) srv.URL = httpServer.URL closeFn := func() { httpServer.Close() } return &env{ clock: opts.clock, fi: opts.fi, users: usrs, client: client, srv: srv, httpServer: httpServer, handler: handler, }, closeFn } func newTestClient(t *testing.T, env *env) *client.Client { cl, err := client.New(env.httpServer.URL) require.NoError(t, err) cl.SetHTTPClient(env.httpServer.Client()) cl.SetClock(env.clock) return cl } type testKeys struct { alice *keys.EdX25519Key bob *keys.EdX25519Key channel *keys.EdX25519Key channel2 *keys.EdX25519Key } var alice = keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x01}, 32))) var bob = keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0x02}, 32))) var channel = keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0xef}, 32))) var channel2 = keys.NewEdX25519KeyFromSeed(keys.Bytes32(bytes.Repeat([]byte{0xf0}, 32))) func testKeysSeeded() testKeys { return testKeys{ alice: alice, bob: bob, channel: channel, channel2: channel2, } } func testKeysRandom() testKeys { alice := keys.GenerateEdX25519Key() bob := keys.GenerateEdX25519Key() channel := keys.GenerateEdX25519Key() channel2 := keys.GenerateEdX25519Key() return testKeys{ alice: alice, bob: bob, channel: channel, channel2: channel2, } }