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  }