kubelatte-ce
Форк от sbertech/kubelatte-ce
513 строк · 10.0 Кб
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/synapse/kubelatte/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 TestGetFunctionName(t *testing.T) {308type args struct {309i interface{}310}311tests := []struct {312name string313args args
314want string315}{316{317name: "ok",318args: args{i: SomeFuncName},319want: "gitverse.ru/synapse/kubelatte/pkg/util.SomeFuncName",320},321}322for _, tt := range tests {323t.Run(tt.name, func(t *testing.T) {324assert.Equalf(t, tt.want, GetFunctionName(tt.args.i), "GetFunctionName(%v)", tt.args.i)325})326}327}
328
329func SomeFuncName() {}330
331func TestMergeStruct(t *testing.T) {332type args struct {333aT map[string]interface{}334aS map[string]interface{}335}336tests := []struct {337name string338args args
339want map[string]interface{}340}{341{342name: "case 1",343args: args{344aT: map[string]interface{}{345"data": map[string]interface{}{346"1": "val1",347"2": []string{348"2", "2",349},350"5": []interface{}{1, 2, 3},351},352},353aS: map[string]interface{}{354"data": map[string]interface{}{355"3": "val3",356"4": "val4",357"5": []interface{}{4, 5, 6},358},359},360},361want: map[string]interface{}{362"data": map[string]interface{}{363"1": "val1",364"2": []string{"2", "2"},365"3": "val3",366"4": "val4",367"5": []interface{}{1, 2, 3, 4, 5, 6},368},369},370},371}372for _, tt := range tests {373t.Run(tt.name, func(t *testing.T) {374assert.Equalf(t, tt.want, MergeStruct(tt.args.aT, tt.args.aS, true), "MergeStruct(%v, %v)", tt.args.aT, tt.args.aS)375})376}377}
378
379func TestMergeSlice(t *testing.T) {380type args struct {381aT []interface{}382aS []interface{}383}384tests := []struct {385name string386args args
387want []interface{}388}{389{390name: "case_1",391args: args{392aT: []interface{}{393map[string]interface{}{394"name": "pompom",395},396},397aS: []interface{}{398map[string]interface{}{399"name": "pompompo",400}},401},402want: []interface{}{403map[string]interface{}{"name": "pompom"},404map[string]interface{}{"name": "pompompo"}},405},406{407name: "case_2_same_values",408args: args{409aT: []interface{}{410map[string]interface{}{411"name": "pompom",412},413},414aS: []interface{}{415map[string]interface{}{416"name": "pompom",417}},418},419want: []interface{}{420map[string]interface{}{"name": "pompom"}},421},422{423name: "case_3_no_name",424args: args{425aT: []interface{}{426map[string]interface{}{427"momomo": "pompom",428},429},430aS: []interface{}{431map[string]interface{}{432"momomo": "pompom",433}},434},435want: []interface{}{436map[string]interface{}{"momomo": "pompom"},437map[string]interface{}{"momomo": "pompom"}},438},439{440name: "case_3_no_map",441args: args{442aT: []interface{}{1},443aS: []interface{}{1},444},445want: []interface{}{1, 1},446},447}448for _, tt := range tests {449t.Run(tt.name, func(t *testing.T) {450assert.Equalf(t, tt.want, MergeSlice(tt.args.aT, tt.args.aS), "MergeSlice(%v, %v)", tt.args.aT, tt.args.aS)451})452}453}
454
455func TestWrapString(t *testing.T) {456type args struct {457field string458render string459}460tests := []struct {461name string462args args
463want string464}{465{466name: "ok",467args: args{468field: "root",469render: "item",470},471want: "root: item",472},473}474for _, tt := range tests {475t.Run(tt.name, func(t *testing.T) {476assert.Equalf(t, tt.want, WrapString(tt.args.field, tt.args.render), "WrapString(%v, %v)", tt.args.field, tt.args.render)477})478}479}
480
481func TestWrapList(t *testing.T) {482type args struct {483field string484render string485}486tests := []struct {487name string488args args
489want string490}{491{492name: "ok",493args: args{494field: "root",495render: "-first\n-second",496},497want: "root:\n\n -first\n -second",498},499{500name: "ok2",501args: args{502field: "root",503render: "\n-first \n-second",504},505want: "root:\n\n -first \n -second",506},507}508for _, tt := range tests {509t.Run(tt.name, func(t *testing.T) {510assert.Equalf(t, tt.want, WrapList(tt.args.field, tt.args.render), "WrapList(%v, %v)", tt.args.field, tt.args.render)511})512}513}
514