-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
170 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
.PHONY: test-unit | ||
test-unit: | ||
tox | ||
|
||
.PHONY: test-integration | ||
test-integration: | ||
go test -v ./test/integration/... |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# Integration tests | ||
|
||
Integration tests exercise the OpenShift Ansible playbooks by performing | ||
simulated installations in Docker containers. | ||
|
||
## Running the tests | ||
|
||
From the repository root, run with: | ||
|
||
``` | ||
make test-integration | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
package test | ||
|
||
import ( | ||
"bytes" | ||
"os" | ||
"os/exec" | ||
"path/filepath" | ||
"strings" | ||
"syscall" | ||
"testing" | ||
) | ||
|
||
// A PlaybookTest executes a given Ansible playbook and checks the exit code and | ||
// output contents. | ||
type PlaybookTest struct { | ||
// inputs | ||
Path string | ||
// expected outputs | ||
ExitCode int | ||
Output []string // zero or more strings that should be in the output | ||
} | ||
|
||
// Run runs the PlaybookTest. | ||
func (p PlaybookTest) Run(t *testing.T) { | ||
// A PlaybookTest is intended to be run in parallel with other tests. | ||
t.Parallel() | ||
|
||
cmd := exec.Command("ansible-playbook", p.Path) | ||
cmd.Env = append(os.Environ(), "ANSIBLE_FORCE_COLOR=1") | ||
b, err := cmd.CombinedOutput() | ||
|
||
// Check exit code. | ||
if (err == nil) && (p.ExitCode != 0) { | ||
p.checkExitCode(t, 0, p.ExitCode, cmd, b) | ||
} | ||
if (err != nil) && (p.ExitCode == 0) { | ||
got, ok := getExitCode(err) | ||
if !ok { | ||
t.Logf("unexpected error (%T): %[1]v", err) | ||
p.logCmdAndOutput(t, cmd, b) | ||
t.FailNow() | ||
} | ||
p.checkExitCode(t, got, p.ExitCode, cmd, b) | ||
} | ||
|
||
// Check output contents. | ||
var missing []string | ||
for _, s := range p.Output { | ||
if !bytes.Contains(b, []byte(s)) { | ||
missing = append(missing, s) | ||
} | ||
} | ||
if len(missing) > 0 { | ||
t.Logf("missing in output: %q", missing) | ||
p.logCmdAndOutput(t, cmd, b) | ||
t.FailNow() | ||
} | ||
} | ||
|
||
// getExitCode returns an exit code and true if the exit code could be taken | ||
// from err, false otherwise. | ||
// The implementation is GOOS-specific, and currently only supports Linux. | ||
func getExitCode(err error) (int, bool) { | ||
exitErr, ok := err.(*exec.ExitError) | ||
if !ok { | ||
return -1, false | ||
} | ||
waitStatus, ok := exitErr.Sys().(syscall.WaitStatus) | ||
if !ok { | ||
return -1, false | ||
} | ||
return waitStatus.ExitStatus(), true | ||
} | ||
|
||
// checkExitCode marks the test as failed when got is different than want. | ||
func (p PlaybookTest) checkExitCode(t *testing.T, got, want int, cmd *exec.Cmd, output []byte) { | ||
if got == want { | ||
return | ||
} | ||
t.Logf("got exit code %v, want %v", got, want) | ||
p.logCmdAndOutput(t, cmd, output) | ||
t.FailNow() | ||
} | ||
|
||
// logCmdAndOutput logs how to re-run a command and a summary of the output of | ||
// its last execution for debugging. | ||
func (p PlaybookTest) logCmdAndOutput(t *testing.T, cmd *exec.Cmd, output []byte) { | ||
const maxLines = 10 | ||
lines := bytes.Split(bytes.TrimRight(output, "\n"), []byte("\n")) | ||
if len(lines) > maxLines { | ||
lines = append([][]byte{[]byte("...")}, lines[len(lines)-maxLines:len(lines)]...) | ||
} | ||
output = bytes.Join(lines, []byte("\n")) | ||
dir, err := filepath.Abs(cmd.Dir) | ||
if err != nil { | ||
panic(err) | ||
} | ||
t.Logf("\n$ (cd %s && %s)\n%s", dir, strings.Join(cmd.Args, " "), output) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package test | ||
|
||
import "testing" | ||
|
||
// TestPing and TestFail below are just examples of tests that involve running | ||
// 'ansible-playbook' with a given playbook and verifying the outcome. Real | ||
// tests look similar, but call more interesting playbooks. | ||
|
||
func TestPing(t *testing.T) { | ||
PlaybookTest{ | ||
Path: "test_ping.yml", | ||
Output: []string{"[test ping]"}, | ||
}.Run(t) | ||
} | ||
|
||
func TestFail(t *testing.T) { | ||
PlaybookTest{ | ||
Path: "test_fail.yml", | ||
ExitCode: 2, | ||
Output: []string{"[test fail]", `"msg": "Failed as requested from task"`}, | ||
}.Run(t) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
# This is just a placeholder playbook. Our aim is to make it: | ||
# 1. Build one or more Docker images with a certain interesting state; | ||
# 2. Ensure one or more containers (with random names) are running with the | ||
# latest build of the image; | ||
# 3. Run the byo OpenShift installation playbook targeting the container. | ||
- hosts: localhost | ||
gather_facts: no | ||
tasks: | ||
- name: test fail | ||
fail: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
# This is just a placeholder playbook. Our aim is to make it: | ||
# 1. Build one or more Docker images with a certain interesting state; | ||
# 2. Ensure one or more containers (with random names) are running with the | ||
# latest build of the image; | ||
# 3. Run the byo OpenShift installation playbook targeting the container. | ||
- hosts: localhost | ||
gather_facts: no | ||
tasks: | ||
- name: test ping | ||
ping: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters