This repository has been archived on 2025-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
Files
drone-runner-podman/engine/util_test.go
2023-10-07 19:32:06 -05:00

112 lines
2.1 KiB
Go

// Copyright 2019 Drone.IO Inc. All rights reserved.
// Use of this source code is governed by the Polyform License
// that can be found in the LICENSE file.
package engine
import (
"bytes"
"context"
"io"
"strconv"
"strings"
"testing"
"time"
"github.com/sirupsen/logrus"
)
func TestChansToReader(t *testing.T) {
ctx := context.Background()
stdout := make(chan string, 1000)
stderr := make(chan string, 1000)
logs := NewChansReadClose(ctx, stdout, stderr)
mockLogs := []string{
"this is a log 1\n",
"this is a log 2\n",
"this is a log 3\n",
"this is a log 4\n",
"this is a log 5\n",
"this is a log 6\n",
"this is a log 7\n",
"this is a log 8\n",
"this is a log 9\n",
"this is a log 10\n",
"this is a log 11\n",
"this is a log 12\n",
}
go func(mock []string) {
for i := range mock {
time.Sleep(500 * time.Millisecond)
if i%3 == 0 {
stderr <- "err " + mock[i]
continue
}
stdout <- "out " + mock[i]
}
logs.Close()
}(mockLogs)
output := bytes.NewBuffer([]byte{})
n, err := io.Copy(output, logs)
if err != nil {
logrus.Errorf("failed to copy reader to ouput [error=%s]", err.Error())
t.Fail()
}
logrus.Infof("[bytes=%d] [logs=%s]\n",
n, output.String(),
)
splitResult := strings.Split(output.String(), "\n")
for i := range mockLogs {
if i%3 == 0 {
if !checkStrErr(i, splitResult[i]) {
logrus.Errorf("logs do not match\n\t[expect=%s]\n\t[got=%s]",
"err "+mockLogs[i], splitResult[i],
)
t.Fail()
}
continue
}
if !checkStrOut(i, splitResult[i]) {
logrus.Errorf("logs do not match\n\t[expect=%s]\n\t[got=%s]",
"out "+mockLogs[i], splitResult[i],
)
t.Fail()
}
}
}
func checkStrErr(line int, strerr string) bool {
if strerr[:3] != "err" {
return false
}
return checkStr(line, strerr)
}
func checkStrOut(line int, strout string) bool {
if strout[:3] != "out" {
return false
}
return checkStr(line, strout)
}
func checkStr(line int, str string) bool {
split := strings.Split(str, " ")
n, err := strconv.Atoi(split[len(split)-1])
if err != nil {
panic(err)
}
return line+1 == n
}