test: add e2e tests
This commit is contained in:
51
e2e-tests/addrepo_test.go
Normal file
51
e2e-tests/addrepo_test.go
Normal file
@ -0,0 +1,51 @@
|
||||
// ALR - Any Linux Repository
|
||||
// Copyright (C) 2025 Евгений Храмов
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//go:build e2e
|
||||
|
||||
package e2etests_test
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/efficientgo/e2e"
|
||||
expect "github.com/tailscale/goexpect"
|
||||
)
|
||||
|
||||
func TestE2EAlrAddRepo(t *testing.T) {
|
||||
dockerMultipleRun(
|
||||
t,
|
||||
"add-repo",
|
||||
COMMON_SYSTEMS,
|
||||
func(t *testing.T, r e2e.Runnable) {
|
||||
runTestCommands(t, r, time.Second*10, []expect.Batcher{
|
||||
&expect.BSnd{S: "alr addrepo --name alr-repo --url https://gitea.plemya-x.ru/Plemya-x/alr-repo.git ; echo ALR-ADD-REPO-RETURN-CODE $?\n"},
|
||||
&expect.BCas{C: []expect.Caser{
|
||||
&expect.Case{
|
||||
R: regexp.MustCompile(`ALR-ADD-REPO-RETURN-CODE 0\n$`),
|
||||
T: expect.OK(),
|
||||
},
|
||||
&expect.Case{
|
||||
R: regexp.MustCompile(`ALR-ADD-REPO-RETURN-CODE \d\n$`),
|
||||
T: expect.Fail(expect.NewStatus(expect.Internal, "Unexpected return code!")),
|
||||
},
|
||||
}},
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
179
e2e-tests/common_test.go
Normal file
179
e2e-tests/common_test.go
Normal file
@ -0,0 +1,179 @@
|
||||
// ALR - Any Linux Repository
|
||||
// Copyright (C) 2025 Евгений Храмов
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//go:build e2e
|
||||
|
||||
package e2etests_test
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/efficientgo/e2e"
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
expect "github.com/tailscale/goexpect"
|
||||
)
|
||||
|
||||
// DebugWriter оборачивает io.Writer и логирует все записываемые данные.
|
||||
type DebugWriter struct {
|
||||
prefix string
|
||||
writer io.Writer
|
||||
}
|
||||
|
||||
func (d *DebugWriter) Write(p []byte) (n int, err error) {
|
||||
log.Printf("%s: Writing data: %q", d.prefix, p) // Логируем данные
|
||||
return d.writer.Write(p)
|
||||
}
|
||||
|
||||
// DebugReader оборачивает io.Reader и логирует все читаемые данные.
|
||||
type DebugReader struct {
|
||||
prefix string
|
||||
reader io.Reader
|
||||
}
|
||||
|
||||
func (d *DebugReader) Read(p []byte) (n int, err error) {
|
||||
n, err = d.reader.Read(p)
|
||||
if n > 0 {
|
||||
log.Printf("%s: Read data: %q", d.prefix, p[:n]) // Логируем данные
|
||||
}
|
||||
return n, err
|
||||
}
|
||||
|
||||
func e2eSpawn(runnable e2e.Runnable, command e2e.Command, timeout time.Duration, opts ...expect.Option) (expect.Expecter, <-chan error, error, *io.PipeWriter) {
|
||||
resCh := make(chan error)
|
||||
|
||||
// Создаем pipe для stdin и stdout
|
||||
stdinReader, stdinWriter := io.Pipe()
|
||||
stdoutReader, stdoutWriter := io.Pipe()
|
||||
|
||||
debugStdinReader := &DebugReader{prefix: "STDIN", reader: stdinReader}
|
||||
debugStdoutWriter := &DebugWriter{prefix: "STDOUT", writer: stdoutWriter}
|
||||
|
||||
go func() {
|
||||
err := runnable.Exec(
|
||||
command,
|
||||
e2e.WithExecOptionStdout(debugStdoutWriter),
|
||||
e2e.WithExecOptionStdin(debugStdinReader),
|
||||
e2e.WithExecOptionStderr(debugStdoutWriter),
|
||||
)
|
||||
|
||||
resCh <- err
|
||||
}()
|
||||
|
||||
exp, chnErr, err := expect.SpawnGeneric(&expect.GenOptions{
|
||||
In: stdinWriter,
|
||||
Out: stdoutReader,
|
||||
Wait: func() error {
|
||||
return <-resCh
|
||||
},
|
||||
Close: func() error {
|
||||
stdinWriter.Close()
|
||||
stdoutReader.Close()
|
||||
return nil
|
||||
},
|
||||
Check: func() bool { return true },
|
||||
}, timeout, expect.Verbose(true), expect.VerboseWriter(os.Stdout))
|
||||
|
||||
return exp, chnErr, err, stdinWriter
|
||||
}
|
||||
|
||||
var ALL_SYSTEMS []string = []string{
|
||||
"ubuntu-24.04",
|
||||
"alt-sisyphus",
|
||||
"archlinux",
|
||||
//"alpine",
|
||||
"opensuse-leap",
|
||||
"redos-8",
|
||||
}
|
||||
|
||||
var COMMON_SYSTEMS []string = []string{
|
||||
"ubuntu-24.04",
|
||||
}
|
||||
|
||||
func init() {
|
||||
for _, id := range ALL_SYSTEMS {
|
||||
buildAlrTestImage(id)
|
||||
}
|
||||
}
|
||||
|
||||
func buildAlrTestImage(id string) {
|
||||
cmd := exec.Command(
|
||||
"docker",
|
||||
"build",
|
||||
"-t", fmt.Sprintf("alr-testimage-%s", id),
|
||||
"-f", fmt.Sprintf("images/Dockerfile.%s", id),
|
||||
".",
|
||||
)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
err := cmd.Run()
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func dockerMultipleRun(t *testing.T, name string, ids []string, f func(t *testing.T, runnable e2e.Runnable)) {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
for _, id := range ids {
|
||||
t.Run(id, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
dockerName := fmt.Sprintf("alr-test-%s-%s", name, id)
|
||||
hash := sha256.New()
|
||||
hash.Write([]byte(dockerName))
|
||||
hashSum := hash.Sum(nil)
|
||||
hashString := hex.EncodeToString(hashSum)
|
||||
truncatedHash := hashString[:8]
|
||||
e, err := e2e.New(e2e.WithVerbose(), e2e.WithName(fmt.Sprintf("alr-%s", truncatedHash)))
|
||||
assert.NoError(t, err)
|
||||
t.Cleanup(e.Close)
|
||||
imageId := fmt.Sprintf("alr-testimage-%s", id)
|
||||
runnable := e.Runnable(dockerName).Init(
|
||||
e2e.StartOptions{
|
||||
Image: imageId,
|
||||
Volumes: []string{
|
||||
"./alr:/usr/bin/alr",
|
||||
},
|
||||
},
|
||||
)
|
||||
assert.NoError(t, e2e.StartAndWaitReady(runnable))
|
||||
f(t, runnable)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func runTestCommands(t *testing.T, r e2e.Runnable, timeout time.Duration, expects []expect.Batcher) {
|
||||
exp, _, err, _ := e2eSpawn(
|
||||
r,
|
||||
e2e.NewCommand("/bin/bash"), 25*time.Second,
|
||||
expect.Verbose(true),
|
||||
)
|
||||
assert.NoError(t, err)
|
||||
_, err = exp.ExpectBatch(
|
||||
expects,
|
||||
timeout,
|
||||
)
|
||||
assert.NoError(t, err)
|
||||
}
|
43
e2e-tests/fix_test.go
Normal file
43
e2e-tests/fix_test.go
Normal file
@ -0,0 +1,43 @@
|
||||
// ALR - Any Linux Repository
|
||||
// Copyright (C) 2025 Евгений Храмов
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//go:build e2e
|
||||
|
||||
package e2etests_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/efficientgo/e2e"
|
||||
expect "github.com/tailscale/goexpect"
|
||||
)
|
||||
|
||||
func TestE2EAlrFix(t *testing.T) {
|
||||
dockerMultipleRun(
|
||||
t,
|
||||
"run-fix",
|
||||
COMMON_SYSTEMS,
|
||||
func(t *testing.T, r e2e.Runnable) {
|
||||
runTestCommands(t, r, time.Second*30, []expect.Batcher{
|
||||
&expect.BSnd{S: "alr fix\n"},
|
||||
&expect.BExp{R: `--> Done`},
|
||||
&expect.BSnd{S: "echo $?\n"},
|
||||
&expect.BExp{R: `^0\n$`},
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
4
e2e-tests/images/Dockerfile.alpine
Normal file
4
e2e-tests/images/Dockerfile.alpine
Normal file
@ -0,0 +1,4 @@
|
||||
FROM alpine:latest
|
||||
RUN adduser -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
5
e2e-tests/images/Dockerfile.alt-sisyphus
Normal file
5
e2e-tests/images/Dockerfile.alt-sisyphus
Normal file
@ -0,0 +1,5 @@
|
||||
FROM registry.altlinux.org/sisyphus/alt:latest
|
||||
RUN apt-get update && apt-get install -y ca-certificates
|
||||
RUN useradd -m -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
4
e2e-tests/images/Dockerfile.archlinux
Normal file
4
e2e-tests/images/Dockerfile.archlinux
Normal file
@ -0,0 +1,4 @@
|
||||
FROM archlinux:latest
|
||||
RUN useradd -m -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
4
e2e-tests/images/Dockerfile.opensuse-leap
Normal file
4
e2e-tests/images/Dockerfile.opensuse-leap
Normal file
@ -0,0 +1,4 @@
|
||||
FROM opensuse/leap:latest
|
||||
RUN useradd -m -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
4
e2e-tests/images/Dockerfile.redos-8
Normal file
4
e2e-tests/images/Dockerfile.redos-8
Normal file
@ -0,0 +1,4 @@
|
||||
FROM registry.red-soft.ru/ubi8/ubi:latest
|
||||
RUN useradd -m -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
5
e2e-tests/images/Dockerfile.ubuntu-24.04
Normal file
5
e2e-tests/images/Dockerfile.ubuntu-24.04
Normal file
@ -0,0 +1,5 @@
|
||||
FROM ubuntu:24.10
|
||||
RUN apt update && apt install -y ca-certificates
|
||||
RUN useradd -m -s /bin/bash alr-user
|
||||
USER alr-user
|
||||
ENTRYPOINT ["tail", "-f", "/dev/null"]
|
44
e2e-tests/version_test.go
Normal file
44
e2e-tests/version_test.go
Normal file
@ -0,0 +1,44 @@
|
||||
// ALR - Any Linux Repository
|
||||
// Copyright (C) 2025 Евгений Храмов
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//go:build e2e
|
||||
|
||||
package e2etests_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/efficientgo/e2e"
|
||||
|
||||
expect "github.com/tailscale/goexpect"
|
||||
)
|
||||
|
||||
func TestE2EAlrVersion(t *testing.T) {
|
||||
dockerMultipleRun(
|
||||
t,
|
||||
"check-version",
|
||||
COMMON_SYSTEMS,
|
||||
func(t *testing.T, r e2e.Runnable) {
|
||||
runTestCommands(t, r, time.Second*10, []expect.Batcher{
|
||||
&expect.BSnd{S: "alr version\n"},
|
||||
&expect.BExp{R: `^v\d+\.\d+\.\d+(?:-\d+-g[a-f0-9]+)?\n$`},
|
||||
&expect.BSnd{S: "echo $?\n"},
|
||||
&expect.BExp{R: `^0\n$`},
|
||||
})
|
||||
},
|
||||
)
|
||||
}
|
Reference in New Issue
Block a user