Skip to content

Commit

Permalink
Integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Albert Callarisa committed Jul 21, 2022
1 parent bbeb14d commit 0fb53b8
Show file tree
Hide file tree
Showing 7 changed files with 183 additions and 10 deletions.
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.18

require (
github.com/hashicorp/vault/api v1.7.2
github.com/stretchr/testify v1.8.0
github.com/urfave/cli/v2 v2.10.3
)

Expand All @@ -12,6 +13,7 @@ require (
github.com/armon/go-radix v1.0.0 // indirect
github.com/cenkalti/backoff/v3 v3.0.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.7.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/golang/snappy v0.0.4 // indirect
Expand Down Expand Up @@ -43,10 +45,10 @@ require (
github.com/mitchellh/reflectwalk v1.0.0 // indirect
github.com/oklog/run v1.0.0 // indirect
github.com/pierrec/lz4 v2.5.2+incompatible // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rogpeppe/go-internal v1.8.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryanuber/go-glob v1.0.0 // indirect
github.com/stretchr/testify v1.7.1 // indirect
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
go.uber.org/atomic v1.9.0 // indirect
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
Expand All @@ -58,4 +60,5 @@ require (
google.golang.org/grpc v1.41.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/square/go-jose.v2 v2.5.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
8 changes: 6 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -209,15 +209,17 @@ github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIH
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/urfave/cli/v2 v2.10.3 h1:oi571Fxz5aHugfBAJd5nkwSk3fzATXtMlpxdLylSCMo=
github.com/urfave/cli/v2 v2.10.3/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo=
Expand Down Expand Up @@ -320,6 +322,7 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w=
Expand All @@ -331,5 +334,6 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
6 changes: 3 additions & 3 deletions pkg/buckets.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
)

func ListBucketsAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

buckets, err := repo.ListBuckets()
if err != nil {
Expand All @@ -27,7 +27,7 @@ func ListBucketsAction(c *cli.Context) error {
}

func CreateBucketsAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

err := repo.CreateBucket(c.String("id"))
if err != nil {
Expand All @@ -38,7 +38,7 @@ func CreateBucketsAction(c *cli.Context) error {
}

func DeleteBucketsAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

err := repo.DeleteBucket(c.String("id"))
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion pkg/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type Repository struct {
client *vault.Client
}

func newVaultRepository(address, token string) *Repository {
func NewVaultRepository(address, token string) *Repository {
config := vault.DefaultConfig()
config.Address = address
client, err := vault.NewClient(config)
Expand Down
6 changes: 3 additions & 3 deletions pkg/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
)

func ListUsersAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

users, err := repo.ListUsers()
if err != nil {
Expand All @@ -27,7 +27,7 @@ func ListUsersAction(c *cli.Context) error {
}

func CreateUsersAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

err := repo.CreateUser(c.String("id"), c.StringSlice("token"), c.StringSlice("bucket"))
if err != nil {
Expand All @@ -38,7 +38,7 @@ func CreateUsersAction(c *cli.Context) error {
}

func DeleteUsersAction(c *cli.Context) error {
repo := newVaultRepository(c.String("vault_address"), c.String("vault_token"))
repo := NewVaultRepository(c.String("vault_address"), c.String("vault_token"))

err := repo.DeleteUser(c.String("id"))
if err != nil {
Expand Down
49 changes: 49 additions & 0 deletions test/integration_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package test

import (
"fmt"
"io/ioutil"
"net/http"
"testing"
"time"

"github.com/stretchr/testify/require"
)

func TestHappyPath(t *testing.T) {
suite := newSuite(t)
defer suite.teardown()

repo := suite.repo()

require.NoError(t, repo.CreateBucket("testBucket"))
require.NoError(t, repo.CreateUser("testUser", []string{"testToken"}, []string{"testBucket"}))

time.Sleep(2 * time.Second)
client := suite.httpClient()

res, err := client.Get(fmt.Sprintf("http://host.docker.internal:%v", suite.fakeServerPort))
require.NoError(t, err)
require.Equal(t, 200, res.StatusCode)
first := body(t, res)
for _, cookie := range res.Cookies() {
require.NotEqual(t, "test-cookie", cookie.Name)
}

res, err = client.Get(fmt.Sprintf("http://host.docker.internal:%v", suite.fakeServerPort))
require.NoError(t, err)
require.Equal(t, 200, res.StatusCode)
second := body(t, res)
for _, cookie := range res.Cookies() {
require.NotEqual(t, "test-cookie", cookie.Name)
}

require.Equal(t, first, second)
}

func body(t *testing.T, res *http.Response) string {
all, err := ioutil.ReadAll(res.Body)
require.NoError(t, err)
res.Body.Close()
return string(all)
}
117 changes: 117 additions & 0 deletions test/suite_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package test

import (
"fmt"
"math/rand"
"net"
"net/http"
"net/url"
"os/exec"
"strconv"
"strings"
"testing"

fitm "github.com/acroca/fitm/pkg"
"github.com/stretchr/testify/require"
)

type Suite struct {
t *testing.T

vaultContainer string
localVaultAddr string

mitmContainer string
mitmPort string

fakeServerPort int
}

func newSuite(t *testing.T) *Suite {
suite := &Suite{
t: t,
}
suite.network()
suite.runVault()
suite.runMitm()
suite.runFakeServer()
return suite
}

func (s *Suite) repo() *fitm.Repository {
return fitm.NewVaultRepository(s.localVaultAddr, "myroot")
}

func (s *Suite) httpClient() *http.Client {
localMitmURL := &url.URL{
Scheme: "http",
Host: fmt.Sprintf("localhost:%v", s.mitmPort),
User: url.UserPassword("testBucket", "testToken"),
}

return &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyURL(localMitmURL),
},
}
}

func (s *Suite) teardown() {
s.cmd(s.t, "docker rm -f "+s.vaultContainer+" "+s.mitmContainer)
s.cmd(s.t, "docker network rm fitm_test")
}

func (s *Suite) network() {
s.cmd(s.t, "docker network create fitm_test")
}

func (s *Suite) runVault() {
s.vaultContainer = s.cmd(s.t, "docker run --name fitm_test_vault --network fitm_test -d --cap-add=IPC_LOCK -p 8200 -e VAULT_DEV_ROOT_TOKEN_ID=myroot vault:1.9.4")

vaultAddr := s.cmd(s.t, "docker port "+s.vaultContainer+" 8200")
mappedVaultPort := strings.Split(string(vaultAddr), ":")[1]

s.localVaultAddr = fmt.Sprintf("http://localhost:%v", mappedVaultPort)
}

func (s *Suite) runMitm() {
mitmImage := s.cmd(s.t, "docker build ../proxy -q")
s.mitmContainer = s.cmd(s.t, "docker run -d -p 8080 --add-host=host.docker.internal:host-gateway --network fitm_test -e VAULT_ADDRESS=http://fitm_test_vault:8200 "+mitmImage)

defer func() {
}()

mitmAddr := s.cmd(s.t, "docker port "+s.mitmContainer+" 8080")
s.mitmPort = strings.Split(string(mitmAddr), ":")[1]
}

func (s *Suite) runFakeServer() {
listener, err := net.Listen("tcp", "127.0.0.1:0")
require.NoError(s.t, err)
s.fakeServerPort = listener.Addr().(*net.TCPAddr).Port

go http.Serve(listener, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
s.t.Log(r.Header)

number := 0

currentCookie, err := r.Cookie("test-cookie")
if err == http.ErrNoCookie {
number = rand.Intn(10000000)
} else {
number, err = strconv.Atoi(currentCookie.Value)
require.NoError(s.t, err)
}
w.Header().Add("Set-Cookie", fmt.Sprintf("test-cookie=%v,", number))

w.WriteHeader(200)
w.Write([]byte(strconv.Itoa(number)))
}))
}

func (s *Suite) cmd(t *testing.T, c string) string {
parts := strings.Split(c, " ")
res, err := exec.Command(parts[0], parts[1:]...).Output()
require.NoError(t, err)
return strings.TrimSpace(string(res))
}

0 comments on commit 0fb53b8

Please sign in to comment.