github.com/grafana/tanka@v0.26.1-0.20240506093700-c22cfc35c21a/pkg/tanka/find_test.go (about) 1 package tanka 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func BenchmarkFindEnvsFromSinglePath(b *testing.B) { 13 tempDir, envPaths := buildLargeEnvironmentDirForFindTest(b) 14 require.Len(b, envPaths, 105) // 100 static + 5 inline 15 16 b.ResetTimer() 17 for i := 0; i < b.N; i++ { 18 envs, err := FindEnvs(tempDir, FindOpts{}) 19 require.Len(b, envs, 200) 20 require.NoError(b, err) 21 } 22 } 23 24 func BenchmarkFindEnvsFromPaths(b *testing.B) { 25 _, envPaths := buildLargeEnvironmentDirForFindTest(b) 26 require.Len(b, envPaths, 105) // 100 static + 5 inline 27 28 b.ResetTimer() 29 for i := 0; i < b.N; i++ { 30 envs, err := FindEnvsFromPaths(envPaths, FindOpts{}) 31 require.Len(b, envs, 200) 32 require.NoError(b, err) 33 } 34 } 35 36 // create a directory with lots of inline and static environments 37 func buildLargeEnvironmentDirForFindTest(t testing.TB) (string, []string) { 38 t.Helper() 39 40 // create a temp dir 41 tempDir := t.TempDir() 42 require.NoError(t, os.WriteFile(filepath.Join(tempDir, "jsonnetfile.json"), []byte(`{}`), 0644)) 43 var envPaths []string 44 45 // create 100 static envs: 5 indent levels (dir-0, dir-0/dir-1, etc) + 20 static envs each) 46 // create 100 inline envs: 5 indent levels (dir-0, dir-0/dir-1, etc) + 1 inline env dir in each with 20 envs each) 47 for indent := range [5]struct{}{} { 48 // create indented dir 49 envDir := tempDir 50 for i := 0; i < indent; i++ { 51 envDir = filepath.Join(envDir, fmt.Sprintf("dir-%d", indent)) 52 } 53 54 // create 20 static envs 55 for id := range [20]struct{}{} { 56 staticEnvDir := filepath.Join(envDir, fmt.Sprintf("static-%d", id)) 57 staticEnvFile := filepath.Join(staticEnvDir, "main.jsonnet") 58 envPaths = append(envPaths, staticEnvDir) 59 require.NoError(t, os.MkdirAll(staticEnvDir, 0755)) 60 require.NoError(t, os.WriteFile(staticEnvFile, []byte(`{}`), 0644)) 61 require.NoError(t, os.WriteFile(filepath.Join(staticEnvDir, "spec.json"), []byte(fmt.Sprintf(`{ 62 "apiVersion": "tanka.dev/v1alpha1", 63 "kind": "Environment", 64 "metadata": { 65 "name": "%[1]s", 66 "labels": {} 67 }, 68 "spec": { 69 "apiServer": "https://192.168.0.1", 70 "namespace": "blabla", 71 "cluster": "blabla" 72 } 73 }`, staticEnvDir)), 0644)) 74 } 75 76 inlineEnvDir := filepath.Join(envDir, "inline") 77 inlineEnvFile := filepath.Join(inlineEnvDir, "main.jsonnet") 78 envPaths = append(envPaths, inlineEnvDir) 79 require.NoError(t, os.MkdirAll(inlineEnvDir, 0755)) 80 require.NoError(t, os.WriteFile(inlineEnvFile, []byte(fmt.Sprintf(`[ 81 { 82 "apiVersion": "tanka.dev/v1alpha1", 83 "kind": "Environment", 84 "metadata": { 85 "name": "%[1]s/%%s", 86 "labels": {} 87 }, 88 "spec": { 89 "apiServer": "https://192.168.0.1", 90 "namespace": "blabla", 91 "cluster": "blabla", 92 } 93 } for i in std.range(0, 19) 94 ]`, inlineEnvDir)), 0644)) 95 } 96 97 return tempDir, envPaths 98 }