Skip to content

Commit

Permalink
Refactored Integration Tests (#53)
Browse files Browse the repository at this point in the history
* Refactored Integration Tests

* Fixed linting errors

* Fixed linting errors again

* Fixed linting errors again again

* Fixed linting errors again again again

* linting is back

* linting is back again

* linting is back again again

* linting is back again again again

* linting is back again again again again
  • Loading branch information
rahulreddy15 committed Jan 23, 2025
1 parent afbfa63 commit 4da1554
Show file tree
Hide file tree
Showing 4 changed files with 348 additions and 418 deletions.
107 changes: 7 additions & 100 deletions tests/postgresql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,12 @@
package tests

import (
"bytes"
"flag"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"

"github.com/newrelic/infra-integrations-sdk/v3/log"
"github.com/newrelic/nri-postgresql/tests/simulation"
"github.com/stretchr/testify/assert"
"github.com/xeipuuv/gojsonschema"
)

var (
Expand All @@ -28,6 +22,8 @@ const (
// docker compose service names
serviceNamePostgres96 = "postgres-9-6"
serviceNamePostgresLatest = "postgres-latest-supported"
defaultBinaryPath = "/nri-postgresql"
integrationContainer = "nri-postgresql"
)

func TestMain(m *testing.M) {
Expand Down Expand Up @@ -67,11 +63,11 @@ func TestSuccessConnection(t *testing.T) {
t.Run(tc.Name, func(t *testing.T) {
t.Parallel()
args := append([]string{`-collection_list=all`}, tc.ExtraFlags...)
stdout, stderr, err := runIntegration(t, tc.Hostname, args...)
stdout, stderr, err := simulation.RunIntegration(tc.Hostname, integrationContainer, defaultBinaryPath, defaultUser, defaultPassword, defaultDB, args...)
assert.Empty(t, stderr)
assert.NoError(t, err)
assert.NotEmpty(t, stdout)
err = validateJSONSchema(tc.Schema, stdout)
err = simulation.ValidateJSONSchema(tc.Schema, stdout)
assert.NoError(t, err)
})
}
Expand All @@ -85,7 +81,7 @@ func TestMissingRequiredVars(t *testing.T) {
defaultUser, defaultPassword = origUser, origPsw
}()

_, stderr, err := runIntegration(t, serviceNamePostgresLatest)
_, stderr, err := simulation.RunIntegration(serviceNamePostgresLatest, integrationContainer, defaultBinaryPath, defaultUser, defaultPassword, defaultDB)
assert.Error(t, err)
assert.Contains(t, stderr, "invalid configuration: must specify a username and password")
}
Expand All @@ -95,98 +91,9 @@ func TestIgnoringDB(t *testing.T) {
`-collection_list=all`,
`-collection_ignore_database_list=["demo"]`,
}
stdout, stderr, err := runIntegration(t, serviceNamePostgresLatest, args...)
stdout, stderr, err := simulation.RunIntegration(serviceNamePostgresLatest, integrationContainer, defaultBinaryPath, defaultUser, defaultPassword, defaultDB, args...)
assert.NoError(t, err)
assert.Empty(t, stderr)
assert.Contains(t, stdout, `"database:postgres"`)
assert.NotContains(t, stdout, `"database:demo"`)
}

func validateJSONSchema(fileName string, input string) error {
pwd, err := os.Getwd()
if err != nil {
log.Error(err.Error())
return err
}
schemaURI := fmt.Sprintf("file://%s", filepath.Join(pwd, "testdata", fileName))
log.Info("loading schema from %s", schemaURI)
schemaLoader := gojsonschema.NewReferenceLoader(schemaURI)
documentLoader := gojsonschema.NewStringLoader(input)

result, err := gojsonschema.Validate(schemaLoader, documentLoader)
if err != nil {
return fmt.Errorf("Error loading JSON schema, error: %v", err)
}

if result.Valid() {
return nil
}
fmt.Printf("Errors for JSON schema: '%s'\n", schemaURI)
for _, desc := range result.Errors() {
fmt.Printf("\t- %s\n", desc)
}
fmt.Printf("\n")
return fmt.Errorf("The output of the integration doesn't have expected JSON format")
}

func ExecInContainer(container string, command []string, envVars ...string) (string, string, error) {
cmdLine := make([]string, 0, 3+len(command))
cmdLine = append(cmdLine, "exec", "-i")

for _, envVar := range envVars {
cmdLine = append(cmdLine, "-e", envVar)
}

cmdLine = append(cmdLine, container)
cmdLine = append(cmdLine, command...)

log.Debug("executing: docker %s", strings.Join(cmdLine, " "))

cmd := exec.Command("docker", cmdLine...)

var outbuf, errbuf bytes.Buffer
cmd.Stdout = &outbuf
cmd.Stderr = &errbuf

err := cmd.Run()
stdout := outbuf.String()
stderr := errbuf.String()

if err != nil {
return stdout, stderr, err
}

return stdout, stderr, nil
}

func runIntegration(t *testing.T, targetContainer string, args ...string) (string, string, error) {
t.Helper()

command := []string{"/nri-postgresql"}

if defaultUser != nil {
command = append(command, "-username", *defaultUser)
}
if defaultPassword != nil {
command = append(command, "-password", *defaultPassword)
}

// Always use port 5432 for integration runs
command = append(command, "-port", "5432")

if defaultDB != nil {
command = append(command, "-database", *defaultDB)
}
if targetContainer != "" {
command = append(command, "-hostname", targetContainer)
}

command = append(command, args...)

stdout, stderr, err := ExecInContainer(*container, command)
if stderr != "" {
log.Debug("Integration command Standard Error: ", stderr)
}

return stdout, stderr, err
}
Loading

0 comments on commit 4da1554

Please sign in to comment.