mirror of https://github.com/knative/func.git
148 lines
4.4 KiB
Go
148 lines
4.4 KiB
Go
package tekton
|
|
|
|
import (
|
|
"archive/tar"
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
apiErrors "k8s.io/apimachinery/pkg/api/errors"
|
|
"k8s.io/apimachinery/pkg/api/resource"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
fn "knative.dev/func/pkg/functions"
|
|
)
|
|
|
|
func TestSourcesAsTarStream(t *testing.T) {
|
|
root := filepath.Join("testdata", "fn-src")
|
|
|
|
if err := os.Mkdir(filepath.Join(root, ".git"), 0755); err != nil && !errors.Is(err, os.ErrExist) {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(root, ".git", "a.txt"), []byte("hello"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
rc := sourcesAsTarStream(fn.Function{Root: root})
|
|
t.Cleanup(func() { _ = rc.Close() })
|
|
|
|
var helloTxtContent []byte
|
|
var symlinkFound bool
|
|
tr := tar.NewReader(rc)
|
|
for {
|
|
hdr, err := tr.Next()
|
|
if err != nil {
|
|
if errors.Is(err, io.EOF) {
|
|
break
|
|
}
|
|
t.Fatal(err)
|
|
}
|
|
if hdr.Name == "source/bin/release/a.out" {
|
|
t.Error("stream contains file that should have been ignored")
|
|
}
|
|
if strings.HasPrefix(hdr.Name, "source/.git") {
|
|
t.Errorf(".git files were included: %q", hdr.Name)
|
|
}
|
|
if hdr.Name == "source/hello.txt" {
|
|
helloTxtContent, err = io.ReadAll(tr)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
if hdr.Name == "source/hello.txt.lnk" {
|
|
symlinkFound = true
|
|
if hdr.Linkname != "hello.txt" {
|
|
t.Errorf("bad symlink target: %q", hdr.Linkname)
|
|
}
|
|
}
|
|
}
|
|
if helloTxtContent == nil {
|
|
t.Error("the hello.txt file is missing in the stream")
|
|
} else {
|
|
if string(helloTxtContent) != "Hello World!\n" {
|
|
t.Error("the hello.txt file has incorrect content")
|
|
}
|
|
}
|
|
if !symlinkFound {
|
|
t.Error("symlink missing in the stream")
|
|
}
|
|
}
|
|
|
|
func Test_createPipelinePersistentVolumeClaim(t *testing.T) {
|
|
type mockType func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error)
|
|
|
|
type args struct {
|
|
ctx context.Context
|
|
f fn.Function
|
|
namespace string
|
|
labels map[string]string
|
|
size string
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
mock mockType
|
|
wantErr bool
|
|
}{
|
|
{
|
|
name: "returns error if pvc creation failed",
|
|
args: args{
|
|
ctx: context.Background(),
|
|
f: fn.Function{},
|
|
namespace: "test-ns",
|
|
labels: nil,
|
|
size: DefaultPersistentVolumeClaimSize.String(),
|
|
},
|
|
mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) {
|
|
return errors.New("creation of pvc failed")
|
|
},
|
|
wantErr: true,
|
|
},
|
|
{
|
|
name: "returns nil if pvc already exists",
|
|
args: args{
|
|
ctx: context.Background(),
|
|
f: fn.Function{},
|
|
namespace: "test-ns",
|
|
labels: nil,
|
|
size: DefaultPersistentVolumeClaimSize.String(),
|
|
},
|
|
mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) {
|
|
return &apiErrors.StatusError{ErrStatus: metav1.Status{Reason: metav1.StatusReasonAlreadyExists}}
|
|
},
|
|
wantErr: false,
|
|
},
|
|
{
|
|
name: "returns err if namespace not defined and default returns an err",
|
|
args: args{
|
|
ctx: context.Background(),
|
|
f: fn.Function{},
|
|
namespace: "",
|
|
labels: nil,
|
|
size: DefaultPersistentVolumeClaimSize.String(),
|
|
},
|
|
mock: func(ctx context.Context, name, namespaceOverride string, labels map[string]string, annotations map[string]string, accessMode corev1.PersistentVolumeAccessMode, resourceRequest resource.Quantity) (err error) {
|
|
return errors.New("no namespace defined")
|
|
},
|
|
wantErr: true,
|
|
},
|
|
}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) { // save current function and restore it at the end
|
|
old := createPersistentVolumeClaim
|
|
defer func() { createPersistentVolumeClaim = old }()
|
|
|
|
createPersistentVolumeClaim = tt.mock
|
|
tt.args.f.Build.PVCSize = tt.args.size
|
|
if err := createPipelinePersistentVolumeClaim(tt.args.ctx, tt.args.f, tt.args.namespace, tt.args.labels); (err != nil) != tt.wantErr {
|
|
t.Errorf("createPipelinePersistentVolumeClaim() error = %v, wantErr %v", err, tt.wantErr)
|
|
}
|
|
})
|
|
}
|
|
}
|