kcl-lang.io/kpm@v0.8.7-0.20240520061008-9fc4c5efc8c7/pkg/settings/settings_test.go (about) 1 package settings 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "path/filepath" 8 "reflect" 9 "sync" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 "kcl-lang.io/kpm/pkg/env" 14 "kcl-lang.io/kpm/pkg/reporter" 15 "kcl-lang.io/kpm/pkg/utils" 16 ) 17 18 const testDataDir = "test_data" 19 20 func getTestDir(subDir string) string { 21 pwd, _ := os.Getwd() 22 testDir := filepath.Join(pwd, testDataDir) 23 testDir = filepath.Join(testDir, subDir) 24 25 return testDir 26 } 27 28 func TestSettingInit(t *testing.T) { 29 kpmHome, err := env.GetAbsPkgPath() 30 assert.Equal(t, err, nil) 31 settings := GetSettings() 32 assert.Equal(t, settings.ErrorEvent, (*reporter.KpmEvent)(nil)) 33 assert.Equal(t, settings.CredentialsFile, filepath.Join(kpmHome, CONFIG_JSON_PATH)) 34 } 35 36 func TestGetFullJsonPath(t *testing.T) { 37 path, err := GetFullPath("test.json") 38 assert.Equal(t, err, nil) 39 40 kpmHome, err := env.GetAbsPkgPath() 41 assert.Equal(t, err, nil) 42 assert.Equal(t, path, filepath.Join(kpmHome, "test.json")) 43 } 44 45 func TestDefaultKpmConf(t *testing.T) { 46 settings := Settings{ 47 Conf: DefaultKpmConf(), 48 } 49 assert.Equal(t, settings.DefaultOciRegistry(), "ghcr.io") 50 assert.Equal(t, settings.DefaultOciRepo(), "kcl-lang") 51 } 52 53 func TestLoadOrCreateDefaultKpmJson(t *testing.T) { 54 testDir := getTestDir("expected.json") 55 kpmPath := filepath.Join(filepath.Join(filepath.Join(filepath.Dir(testDir), ".kpm"), "config"), "kpm.json") 56 err := os.Setenv("KCL_PKG_PATH", filepath.Dir(testDir)) 57 58 assert.Equal(t, err, nil) 59 assert.Equal(t, utils.DirExists(kpmPath), false) 60 61 kpmConf, err := loadOrCreateDefaultKpmJson() 62 assert.Equal(t, kpmConf.DefaultOciRegistry, "ghcr.io") 63 assert.Equal(t, kpmConf.DefaultOciRepo, "kcl-lang") 64 assert.Equal(t, err, nil) 65 assert.Equal(t, utils.DirExists(kpmPath), true) 66 67 expectedJson, err := os.ReadFile(testDir) 68 assert.Equal(t, err, nil) 69 70 gotJson, err := os.ReadFile(kpmPath) 71 assert.Equal(t, err, nil) 72 73 var expected interface{} 74 err = json.Unmarshal(expectedJson, &expected) 75 assert.Equal(t, err, nil) 76 77 var got interface{} 78 err = json.Unmarshal(gotJson, &got) 79 assert.Equal(t, err, nil) 80 fmt.Printf("got: %v\n", got) 81 fmt.Printf("expected: %v\n", expected) 82 assert.Equal(t, reflect.DeepEqual(expected, got), true) 83 84 os.RemoveAll(kpmPath) 85 assert.Equal(t, utils.DirExists(kpmPath), false) 86 } 87 88 func TestPackageCacheLock(t *testing.T) { 89 90 settings := GetSettings() 91 assert.Equal(t, settings.ErrorEvent, (*reporter.KpmEvent)(nil)) 92 93 // create the expected result of the test. 94 // 10 times of "goroutine 1: %d" at first, and then 10 times of "goroutine 2: %d" 95 96 // If goroutine 1 get the lock first, then it will append "goroutine 1: %d" to the list. 97 goroutine_1_first_list := []string{} 98 99 for i := 0; i < 10; i++ { 100 goroutine_1_first_list = append(goroutine_1_first_list, fmt.Sprintf("goroutine 1: %d", i)) 101 } 102 103 for i := 0; i < 10; i++ { 104 goroutine_1_first_list = append(goroutine_1_first_list, fmt.Sprintf("goroutine 2: %d", i)) 105 } 106 107 // If goroutine 2 get the lock first, then it will append "goroutine 2: %d" to the list. 108 goroutine_2_first_list := []string{} 109 110 for i := 0; i < 10; i++ { 111 goroutine_2_first_list = append(goroutine_2_first_list, fmt.Sprintf("goroutine 2: %d", i)) 112 } 113 114 for i := 0; i < 10; i++ { 115 goroutine_2_first_list = append(goroutine_2_first_list, fmt.Sprintf("goroutine 1: %d", i)) 116 } 117 118 var wg sync.WaitGroup 119 wg.Add(2) 120 121 // create a list to store the result generated by 2 goroutine concurrently. 122 gotlist := []string{} 123 124 // goroutine 1: append "goroutine 1: %d" to the list 125 go func() { 126 defer wg.Done() 127 err := settings.AcquirePackageCacheLock(os.Stdout) 128 fmt.Printf("1: locked.") 129 fmt.Printf("err: %v\n", err) 130 for i := 0; i < 10; i++ { 131 gotlist = append(gotlist, fmt.Sprintf("goroutine 1: %d", i)) 132 } 133 err = settings.ReleasePackageCacheLock() 134 fmt.Printf("err: %v\n", err) 135 fmt.Printf("1: released.") 136 }() 137 138 // goroutine 2: append "goroutine 2: %d" to the list 139 go func() { 140 defer wg.Done() 141 err := settings.AcquirePackageCacheLock(os.Stdout) 142 fmt.Printf("2: locked.") 143 fmt.Printf("err: %v\n", err) 144 for i := 0; i < 10; i++ { 145 gotlist = append(gotlist, fmt.Sprintf("goroutine 2: %d", i)) 146 } 147 err = settings.ReleasePackageCacheLock() 148 fmt.Printf("err: %v\n", err) 149 fmt.Printf("2: released.") 150 }() 151 152 wg.Wait() 153 154 // Compare the gotlist and expectedlist. 155 assert.Equal(t, 156 (reflect.DeepEqual(gotlist, goroutine_1_first_list) || reflect.DeepEqual(gotlist, goroutine_2_first_list)), 157 true) 158 } 159 160 func TestSettingEnv(t *testing.T) { 161 settings := GetSettings() 162 assert.Equal(t, settings.DefaultOciRegistry(), "ghcr.io") 163 assert.Equal(t, settings.DefaultOciRepo(), "kcl-lang") 164 assert.Equal(t, settings.DefaultOciPlainHttp(), false) 165 166 err := os.Setenv("KPM_REG", "test_reg") 167 assert.Equal(t, err, nil) 168 err = os.Setenv("KPM_REPO", "test_repo") 169 assert.Equal(t, err, nil) 170 err = os.Setenv("OCI_REG_PLAIN_HTTP", "true") 171 assert.Equal(t, err, nil) 172 173 settings = GetSettings() 174 assert.Equal(t, settings.DefaultOciRegistry(), "test_reg") 175 assert.Equal(t, settings.DefaultOciRepo(), "test_repo") 176 assert.Equal(t, settings.ErrorEvent.Type(), reporter.UnknownEnv) 177 assert.Equal(t, settings.ErrorEvent.Error(), "unknown environment variable 'OCI_REG_PLAIN_HTTP=true'\ninvalid environment variable\n") 178 assert.Equal(t, settings.DefaultOciPlainHttp(), false) 179 180 err = os.Setenv("OCI_REG_PLAIN_HTTP", "on") 181 assert.Equal(t, err, nil) 182 settings = GetSettings() 183 assert.Equal(t, settings.DefaultOciPlainHttp(), true) 184 185 err = os.Setenv("OCI_REG_PLAIN_HTTP", "off") 186 assert.Equal(t, err, nil) 187 settings = GetSettings() 188 assert.Equal(t, settings.DefaultOciPlainHttp(), false) 189 }