Skip to content

Commit

Permalink
fix: reset mock server state between tests
Browse files Browse the repository at this point in the history
  • Loading branch information
mefellows committed Jun 20, 2021
1 parent 86753f6 commit cdaa611
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 18 deletions.
39 changes: 23 additions & 16 deletions consumer/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ type MockServerConfig struct {
TLSConfig *tls.Config
}

// validateConfig validates the configuration for the consumer test
func (p *httpMockProvider) validateConfig() error {
// configure validates the configuration for the consumer test
func (p *httpMockProvider) configure() error {
log.Println("[DEBUG] pact setup")
dir, _ := os.Getwd()

Expand All @@ -110,17 +110,6 @@ func (p *httpMockProvider) validateConfig() error {
p.config.ClientTimeout = 10 * time.Second
}

var pErr error
if p.config.AllowedMockServerPorts != "" && p.config.Port <= 0 {
p.config.Port, pErr = utils.FindPortInRange(p.config.AllowedMockServerPorts)
} else if p.config.Port <= 0 {
p.config.Port, pErr = utils.GetFreePort()
}

if pErr != nil {
return fmt.Errorf("error: unable to find free port, mock server will fail to start")
}

p.mockserver = native.NewHTTPMockServer(p.config.Consumer, p.config.Provider)
switch p.specificationVersion {
case models.V2:
Expand All @@ -139,15 +128,26 @@ func (p *httpMockProvider) validateConfig() error {
func (p *httpMockProvider) ExecuteTest(integrationTest func(MockServerConfig) error) error {
log.Println("[DEBUG] pact verify")

port, err := p.mockserver.Start(fmt.Sprintf("%s:%d", p.config.Host, p.config.Port), p.config.TLS)
defer p.mockserver.CleanupMockServer(p.config.Port)
var err error
if p.config.AllowedMockServerPorts != "" && p.config.Port <= 0 {
p.config.Port, err = utils.FindPortInRange(p.config.AllowedMockServerPorts)
} else if p.config.Port <= 0 {
p.config.Port, err = 0, nil
}

if err != nil {
return fmt.Errorf("error: unable to find free port, mock server will fail to start")
}

p.config.Port, err = p.mockserver.Start(fmt.Sprintf("%s:%d", p.config.Host, p.config.Port), p.config.TLS)
defer p.reset()
if err != nil {
return err
}

// Run the integration test
err = integrationTest(MockServerConfig{
Port: port,
Port: p.config.Port,
Host: p.config.Host,
TLSConfig: GetTLSConfigForTLSMockServer(),
})
Expand All @@ -170,6 +170,13 @@ func (p *httpMockProvider) ExecuteTest(integrationTest func(MockServerConfig) er
return p.writePact()
}

// Clear state between tests
func (p *httpMockProvider) reset() {
p.mockserver.CleanupMockServer(p.config.Port)
p.config.Port = 0
p.configure()
}

// TODO: pretty print this to make it really easy to understand the problems
// See existing Pact/Ruby code examples
func (p *httpMockProvider) displayMismatches(mismatches []native.MismatchedRequest) {
Expand Down
2 changes: 1 addition & 1 deletion consumer/http_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func NewV2Pact(config MockHTTPProviderConfig) (*HTTPMockProviderV2, error) {
specificationVersion: models.V2,
},
}
err := provider.validateConfig()
err := provider.configure()

if err != nil {
return nil, err
Expand Down
2 changes: 1 addition & 1 deletion consumer/http_v3.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func NewV3Pact(config MockHTTPProviderConfig) (*HTTPMockProviderV3, error) {
specificationVersion: models.V3,
},
}
err := provider.validateConfig()
err := provider.configure()

if err != nil {
return nil, err
Expand Down

0 comments on commit cdaa611

Please sign in to comment.