kubelatte-ce
Форк от sbertech/kubelatte-ce
489 строк · 9.6 Кб
1/*
2* Copyright (c) 2020, salesforce.com, inc.
3* All rights reserved.
4* SPDX-License-Identifier: BSD-3-Clause
5* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
6*/
7
8package util9
10import (11"crypto/rand"12"crypto/rsa"13"crypto/x509"14"crypto/x509/pkix"15"encoding/pem"16"fmt"17"gitverse.ru/ktrntrsv/kubelatte-ce/pkg/util/env"18"math/big"19"net"20"os"21"path/filepath"22"testing"23"time"24
25"github.com/stretchr/testify/assert"26corev1 "k8s.io/api/core/v1"27)
28
29func TestGetAnnotation(t *testing.T) {30assert.Equal(t, "annotation.io/key", GetAnnotation("annotation.io", "key"))31}
32
33func TestMergeVolumes(t *testing.T) {34target := []corev1.Volume{35{36Name: "one",37},38{39Name: "two",40},41}42added := []corev1.Volume{43{44Name: "two",45},46{47Name: "three",48},49}50merged := MergeVolumes(target, added)51
52assert.Len(t, merged, 3)53assert.Equal(t, "one", merged[0].Name)54assert.Equal(t, "two", merged[1].Name)55assert.Equal(t, "three", merged[2].Name)56}
57
58func TestMergeVolumeMounts(t *testing.T) {59target := []corev1.VolumeMount{60{61Name: "one",62},63{64Name: "two",65},66}67added := []corev1.VolumeMount{68{69Name: "one",70},71}72merged := MergeVolumeMounts(target, added)73
74assert.Len(t, merged, 2)75assert.Equal(t, "one", merged[0].Name)76assert.Equal(t, "two", merged[1].Name)77}
78
79func TestMergeVolumeMountsNoDuplicates(t *testing.T) {80target := []corev1.VolumeMount{81{82Name: "one",83},84{85Name: "two",86},87}88added := []corev1.VolumeMount{89{90Name: "three",91},92{93Name: "four",94},95}96merged := MergeVolumeMounts(target, added)97
98assert.Len(t, merged, 4)99assert.Equal(t, "one", merged[0].Name)100assert.Equal(t, "two", merged[1].Name)101assert.Equal(t, "three", merged[2].Name)102assert.Equal(t, "four", merged[3].Name)103}
104func TestDeDuplicateVolumeMounts(t *testing.T) {105target := []corev1.VolumeMount{106{107Name: "one",108},109{110Name: "three",111},112}113added := []corev1.VolumeMount{114{115Name: "three",116},117{118Name: "four",119},120}121merged := DeDuplicateVolumeMounts(target, added)122
123assert.Len(t, merged, 1)124assert.Equal(t, "four", merged[0].Name)125}
126
127func TestDeDuplicateContainers(t *testing.T) {128target := []corev1.Container{129{130Name: "one",131},132{133Name: "three",134},135}136added := []corev1.Container{137{138Name: "three",139},140{141Name: "four",142},143}144merged := DeDuplicateContainers(target, added)145
146assert.Len(t, merged, 1)147assert.Equal(t, "four", merged[0].Name)148}
149
150// TempCerts for temporary certificates
151type TempCerts struct {152certsDirectory string153certFileName string154keyFileName string155}
156
157// GenerateTestCertificates generates test certificates
158func GenerateTestCertificates() (*TempCerts, error) {159// Source - https://golang.org/src/crypto/tls/generate_cert.go160
161var err error162tempDir := os.TempDir()163if err != nil {164return nil, fmt.Errorf("failed to create a temp directory: %s", err)165}166
167certFileName := filepath.Join(tempDir, "cert.pem")168keyFileName := filepath.Join(tempDir, "key.pem")169
170var privateKey *rsa.PrivateKey171privateKey, err = rsa.GenerateKey(rand.Reader, 2048)172
173if err != nil {174return nil, fmt.Errorf("failed to generate private key: %s", err)175}176
177notBefore := time.Now()178notAfter := notBefore.Add(365 * 24 * time.Hour)179
180serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)181serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)182
183if err != nil {184return nil, fmt.Errorf("failed to generate serial number: %s", err)185}186
187template := x509.Certificate{188SerialNumber: serialNumber,189Subject: pkix.Name{190Organization: []string{"Salesforce.com"},191},192NotBefore: notBefore,193NotAfter: notAfter,194
195KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,196ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},197BasicConstraintsValid: true,198IPAddresses: []net.IP{net.IPv4(127, 0, 0, 1)},199DNSNames: []string{"localhost"},200}201
202publicKey := &privateKey.PublicKey203derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, publicKey, privateKey)204if err != nil {205return nil, fmt.Errorf("failed to create certificate: %s", err)206}207
208err = writePemBlockToFile(certFileName, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes})209if err != nil {210return nil, err211}212
213err = writePemBlockToFile(keyFileName, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)})214if err != nil {215return nil, err216}217
218return &TempCerts{219certsDirectory: tempDir,220certFileName: certFileName,221keyFileName: keyFileName,222}, nil223}
224
225func writePemBlockToFile(fileName string, pemBlock *pem.Block) error {226certOut, err := os.Create(fileName)227if err != nil {228return fmt.Errorf("failed to create %s: %s", fileName, err)229}230
231if err := pem.Encode(certOut, pemBlock); err != nil {232return fmt.Errorf("failed to write block to file: %s", err)233}234
235if err := certOut.Close(); err != nil {236return fmt.Errorf("unable to close %s: %s", fileName, err)237}238
239return nil240}
241
242func TestIsFullRole(t *testing.T) {243tests := []struct {244name string245f func()246def func()247want bool248}{249{250name: "full role",251f: func() {252env.KbltMutator = true253env.KbltValidator = true254},255def: func() {256env.KbltMutator = false257env.KbltValidator = false258},259want: true,260},261{262name: "not full role 1",263f: func() {264env.KbltMutator = true265env.KbltValidator = false266},267def: func() {268env.KbltMutator = false269env.KbltValidator = false270},271want: false,272},273{274name: "not full role 2",275f: func() {276env.KbltMutator = false277env.KbltValidator = true278},279def: func() {280env.KbltMutator = false281env.KbltValidator = false282},283want: false,284},285{286name: "not full role 3",287f: func() {288env.KbltMutator = false289env.KbltValidator = false290},291def: func() {292env.KbltMutator = false293env.KbltValidator = false294},295want: false,296},297}298for _, tt := range tests {299t.Run(tt.name, func(t *testing.T) {300tt.f()301defer tt.def()302assert.Equalf(t, tt.want, IsFullRole(), "IsFullRole()")303})304}305}
306
307func TestMergeStruct(t *testing.T) {308type args struct {309aT map[string]interface{}310aS map[string]interface{}311}312tests := []struct {313name string314args args
315want map[string]interface{}316}{317{318name: "case 1",319args: args{320aT: map[string]interface{}{321"data": map[string]interface{}{322"1": "val1",323"2": []string{324"2", "2",325},326"5": []interface{}{1, 2, 3},327},328},329aS: map[string]interface{}{330"data": map[string]interface{}{331"3": "val3",332"4": "val4",333"5": []interface{}{4, 5, 6},334},335},336},337want: map[string]interface{}{338"data": map[string]interface{}{339"1": "val1",340"2": []string{"2", "2"},341"3": "val3",342"4": "val4",343"5": []interface{}{1, 2, 3, 4, 5, 6},344},345},346},347}348for _, tt := range tests {349t.Run(tt.name, func(t *testing.T) {350assert.Equalf(t, tt.want, MergeStruct(tt.args.aT, tt.args.aS, true), "MergeStruct(%v, %v)", tt.args.aT, tt.args.aS)351})352}353}
354
355func TestMergeSlice(t *testing.T) {356type args struct {357aT []interface{}358aS []interface{}359}360tests := []struct {361name string362args args
363want []interface{}364}{365{366name: "case_1",367args: args{368aT: []interface{}{369map[string]interface{}{370"name": "pompom",371},372},373aS: []interface{}{374map[string]interface{}{375"name": "pompompo",376}},377},378want: []interface{}{379map[string]interface{}{"name": "pompom"},380map[string]interface{}{"name": "pompompo"}},381},382{383name: "case_2_same_values",384args: args{385aT: []interface{}{386map[string]interface{}{387"name": "pompom",388},389},390aS: []interface{}{391map[string]interface{}{392"name": "pompom",393}},394},395want: []interface{}{396map[string]interface{}{"name": "pompom"}},397},398{399name: "case_3_no_name",400args: args{401aT: []interface{}{402map[string]interface{}{403"momomo": "pompom",404},405},406aS: []interface{}{407map[string]interface{}{408"momomo": "pompom",409}},410},411want: []interface{}{412map[string]interface{}{"momomo": "pompom"},413map[string]interface{}{"momomo": "pompom"}},414},415{416name: "case_3_no_map",417args: args{418aT: []interface{}{1},419aS: []interface{}{1},420},421want: []interface{}{1, 1},422},423}424for _, tt := range tests {425t.Run(tt.name, func(t *testing.T) {426assert.Equalf(t, tt.want, MergeSlice(tt.args.aT, tt.args.aS), "MergeSlice(%v, %v)", tt.args.aT, tt.args.aS)427})428}429}
430
431func TestWrapString(t *testing.T) {432type args struct {433field string434render string435}436tests := []struct {437name string438args args
439want string440}{441{442name: "ok",443args: args{444field: "root",445render: "item",446},447want: "root: item",448},449}450for _, tt := range tests {451t.Run(tt.name, func(t *testing.T) {452assert.Equalf(t, tt.want, WrapString(tt.args.field, tt.args.render), "WrapString(%v, %v)", tt.args.field, tt.args.render)453})454}455}
456
457func TestWrapList(t *testing.T) {458type args struct {459field string460render string461}462tests := []struct {463name string464args args
465want string466}{467{468name: "ok",469args: args{470field: "root",471render: "-first\n-second",472},473want: "root:\n\n -first\n -second",474},475{476name: "ok2",477args: args{478field: "root",479render: "\n-first \n-second",480},481want: "root:\n\n -first \n -second",482},483}484for _, tt := range tests {485t.Run(tt.name, func(t *testing.T) {486assert.Equalf(t, tt.want, WrapList(tt.args.field, tt.args.render), "WrapList(%v, %v)", tt.args.field, tt.args.render)487})488}489}
490