Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: add integration tests for "pebble run" #497

Merged
merged 15 commits into from
Sep 23, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions internals/testintegration/pebble_another_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//go:build integration

package testintegration_test
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved

import (
"testing"

. "github.com/canonical/pebble/internals/testintegration"
)

func TestPebbleSomethingElse(t *testing.T) {
pebbleDir := t.TempDir()
CreateLayer(t, pebbleDir, "001-simple-layer.yaml", DefaultLayerYAML)
_ = PebbleRun(t, pebbleDir)
// do something
}
51 changes: 51 additions & 0 deletions internals/testintegration/pebble_run_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
//go:build integration

package testintegration_test

import (
"fmt"
"os"
"testing"

. "github.com/canonical/pebble/internals/testintegration"
)

func TestMain(m *testing.M) {
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
if err := Setup(); err != nil {
fmt.Println("Setup failed with error:", err)
os.Exit(1)
}

exitVal := m.Run()
os.Exit(exitVal)
}

func TestPebbleRunWithSimpleLayer(t *testing.T) {
pebbleDir := t.TempDir()

layerYAML := `
services:
demo-service:
override: replace
command: sleep 1000
startup: enabled
demo-service2:
override: replace
command: sleep 1000
startup: enabled
`[1:]
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
CreateLayer(t, pebbleDir, "001-simple-layer.yaml", layerYAML)

logs := PebbleRun(t, pebbleDir)

expected := []string{
"Started daemon",
"Service \"demo-service\" starting",
"Service \"demo-service2\" starting",
"Started default services with change",
}
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved

if foundAll, notFound := AllKeywordsFoundInLogs(logs, expected); !foundAll {
t.Errorf("Expected keywords not found in logs: %v", notFound)
}
}
105 changes: 105 additions & 0 deletions internals/testintegration/utils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
//go:build integration

package testintegration

import (
"bufio"
"fmt"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
"time"
)

var DefaultLayerYAML string = `
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
services:
demo-service:
override: replace
command: sleep 1000
startup: enabled
`[1:]

func Setup() error {
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
cmd := exec.Command("go", "build", "./cmd/pebble")
cmd.Dir = getRootDir()
return cmd.Run()
}

func getRootDir() string {
wd, _ := os.Getwd()
return filepath.Join(wd, "../../")
}

func AllKeywordsFoundInLogs(logs []string, keywords []string) (bool, []string) {
var notFound []string

for _, keyword := range keywords {
keywordFound := false
for _, log := range logs {
if strings.Contains(log, keyword) {
keywordFound = true
break
}
}
if !keywordFound {
notFound = append(notFound, keyword)
}
}

return len(notFound) == 0, notFound
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
}

func CreateLayer(t *testing.T, pebbleDir string, layerFileName string, layerYAML string) {
layersDir := filepath.Join(pebbleDir, "layers")
err := os.MkdirAll(layersDir, 0755)
if err != nil {
t.Fatalf("Error creating layers directory: pipe: %v", err)
}

layerPath := filepath.Join(layersDir, layerFileName)
err = os.WriteFile(layerPath, []byte(layerYAML), 0755)
if err != nil {
t.Fatalf("Error creating layers file: %v", err)
}
}

func PebbleRun(t *testing.T, pebbleDir string) []string {
cmd := exec.Command("./pebble", "run")
cmd.Dir = getRootDir()
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
cmd.Env = append(os.Environ(), fmt.Sprintf("PEBBLE=%s", pebbleDir))

stderrPipe, err := cmd.StderrPipe()
if err != nil {
t.Fatalf("Error creating stderr pipe: %v", err)
}

err = cmd.Start()
defer cmd.Process.Kill()
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
t.Fatalf("Error starting 'pebble run': %v", err)
}
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved

var logs []string

lastOutputTime := time.Now()

go func() {
scanner := bufio.NewScanner(stderrPipe)
for scanner.Scan() {
lastOutputTime = time.Now()
line := scanner.Text()
logs = append(logs, line)
IronCore864 marked this conversation as resolved.
Show resolved Hide resolved
}
}()

for {
time.Sleep(100 * time.Millisecond)
if time.Since(lastOutputTime) > 1*time.Second {
break
}
}

return logs
}
Loading