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  }