github.com/criteo/command-launcher@v0.0.0-20230407142452-fb616f546e98/internal/repository/default-pkg-repository_test.go (about)

     1  package repository
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/criteo/command-launcher/internal/helper"
    11  	"github.com/criteo/command-launcher/internal/remote"
    12  	"github.com/stretchr/testify/assert"
    13  )
    14  
    15  func TestLocalRepository(t *testing.T) {
    16  	localRepoPath := strings.ReplaceAll(filepath.Join(t.TempDir(), "local-repo-test"), "\\", "/")
    17  	err := os.Mkdir(localRepoPath, 0755)
    18  	assert.Nil(t, err)
    19  
    20  	regFile, err := os.Create(filepath.Join(localRepoPath, "registry.json"))
    21  	assert.Nil(t, err)
    22  	defer regFile.Close()
    23  	regFile.WriteString(fmt.Sprintf(`{
    24  		"ls": {
    25  			"pkgName": "ls",
    26  			"version": "0.0.2",
    27  			"cmds": [
    28  				{"name": "ls",
    29  				"category": "",
    30  				"type": "executable",
    31  				"group": "",
    32  				"short": "A wrapper of linux command 'ls'",
    33  				"long": "A wrapper of linux command 'ls'",
    34  				"executable": "ls",
    35  				"args": ["-l", "-a"],
    36  				"docFile": "",
    37  				"docLink": "",
    38  				"validArgs": null,
    39  				"validArgsCmd": null,
    40  				"requiredFlags": null,
    41  				"pkgDir": "%s/%s"}
    42  			]
    43  		}
    44  	}`, localRepoPath, "ls-0.0.2"))
    45  
    46  	reg, err := newJsonRepoIndex("dropin", filepath.Join(localRepoPath, "registry.json"))
    47  	assert.Nil(t, err)
    48  
    49  	localRepo, err := CreateLocalRepository("default", localRepoPath, reg)
    50  	assert.Nil(t, err)
    51  
    52  	ls, err := localRepo.Command("ls", "", "ls")
    53  	assert.Nil(t, err)
    54  	assert.Equal(t, "ls", ls.Name())
    55  	assert.Equal(t, "executable", ls.Type())
    56  
    57  	cmds := localRepo.InstalledCommands()
    58  	assert.Equal(t, 1, len(cmds))
    59  	assert.Equal(t, "ls", cmds[0].Name())
    60  
    61  	pkgs := localRepo.InstalledPackages()
    62  	assert.Equal(t, 1, len(pkgs))
    63  	assert.Equal(t, "ls", pkgs[0].Name())
    64  	assert.Equal(t, "0.0.2", pkgs[0].Version())
    65  
    66  	execCmds := localRepo.InstalledExecutableCommands()
    67  	assert.Equal(t, 1, len(execCmds))
    68  	assert.Equal(t, "ls", execCmds[0].Name())
    69  
    70  	groupCmds := localRepo.InstalledGroupCommands()
    71  	assert.Equal(t, 0, len(groupCmds))
    72  
    73  }
    74  
    75  func TestInstallCommand(t *testing.T) {
    76  	// init remote
    77  	basePath := filepath.Join(t.TempDir(), "remote-test")
    78  	err := os.Mkdir(basePath, 0755)
    79  	assert.Nil(t, err)
    80  
    81  	indexPath := filepath.Join(basePath, "index.json")
    82  	err = helper.CopyLocalFile("../remote/assets/remote/basic-index.json", indexPath, false)
    83  	assert.Nil(t, err)
    84  
    85  	err = helper.CopyLocalFile("../remote/assets/ls-0.0.3.pkg", filepath.Join(basePath, "ls-0.0.3.pkg"), false)
    86  	assert.Nil(t, err)
    87  
    88  	err = helper.CopyLocalFile("../remote/assets/ls-0.0.2.pkg", filepath.Join(basePath, "ls-0.0.2.pkg"), false)
    89  	assert.Nil(t, err)
    90  
    91  	remoteRepo := remote.CreateRemoteRepository(fmt.Sprintf("file://%s", basePath))
    92  	remoteRepo.Fetch()
    93  
    94  	// init local repo
    95  	localRepoPath := filepath.Join(t.TempDir(), "local-repo-test")
    96  	err = os.Mkdir(localRepoPath, 0755)
    97  	assert.Nil(t, err)
    98  
    99  	reg, err := newJsonRepoIndex("dropin", filepath.Join(localRepoPath, "registry.json"))
   100  	assert.Nil(t, err)
   101  
   102  	localRepo, err := CreateLocalRepository("default", localRepoPath, reg)
   103  	assert.Nil(t, err)
   104  	assert.Equal(t, 0, len(localRepo.InstalledCommands()))
   105  
   106  	// install package
   107  	lsPkg, err := remoteRepo.Package("ls", "0.0.2")
   108  	assert.Nil(t, err)
   109  	err = localRepo.Install(lsPkg)
   110  	assert.Nil(t, err)
   111  
   112  	installedCmds := localRepo.InstalledCommands()
   113  	assert.Equal(t, 1, len(installedCmds))
   114  	assert.Equal(t, "ls", installedCmds[0].Name())
   115  
   116  	installedPkgs := localRepo.InstalledPackages()
   117  	assert.Equal(t, 1, len(installedPkgs))
   118  	assert.Equal(t, "ls", installedPkgs[0].Name())
   119  	assert.Equal(t, "0.0.2", installedPkgs[0].Version())
   120  
   121  	pkgManifest, err := localRepo.Package("ls")
   122  	assert.Nil(t, err)
   123  	assert.Equal(t, "ls", pkgManifest.Name())
   124  	assert.Equal(t, "0.0.2", pkgManifest.Version())
   125  
   126  	// upadte it
   127  	lsV3, err := remoteRepo.Package("ls", "0.0.3")
   128  	assert.Nil(t, err)
   129  
   130  	err = localRepo.Update(lsV3)
   131  	assert.Nil(t, err)
   132  
   133  	pkgManifest, err = localRepo.Package("ls")
   134  	assert.Nil(t, err)
   135  	assert.Equal(t, "ls", pkgManifest.Name())
   136  	assert.Equal(t, "0.0.3", pkgManifest.Version())
   137  
   138  	// now uninstall it
   139  	err = localRepo.Uninstall("ls")
   140  	assert.Nil(t, err)
   141  	assert.Equal(t, 0, len(localRepo.InstalledCommands()))
   142  }
   143  
   144  func Test_Load(t *testing.T) {
   145  	pathname, err := filepath.Abs("assets/simple_dropins/")
   146  	if err == nil {
   147  		fmt.Println("Absolute:", pathname)
   148  	}
   149  
   150  	reg, err := newDefaultRepoIndex("default")
   151  	assert.Nil(t, err)
   152  
   153  	repo, err := CreateLocalRepository("default", pathname, reg)
   154  	assert.Nil(t, err)
   155  
   156  	assert.Equal(t, 1, len(repo.InstalledGroupCommands()))
   157  	assert.Equal(t, 1, len(repo.InstalledExecutableCommands()))
   158  
   159  	assert.Equal(t, "wf", repo.InstalledGroupCommands()[0].Name())
   160  	assert.Equal(t, "debug-cdt-env", repo.InstalledExecutableCommands()[0].Name())
   161  }
   162  
   163  func Test_Load_Unexist_Folder(t *testing.T) {
   164  	pathname, err := filepath.Abs("assets/simple_dropins_not_exist/")
   165  	if err == nil {
   166  		fmt.Println("Absolute:", pathname)
   167  	}
   168  
   169  	reg, err := newDefaultRepoIndex("default")
   170  	assert.Nil(t, err)
   171  
   172  	repo, err := CreateLocalRepository("default", pathname, reg)
   173  	assert.Nil(t, err)
   174  
   175  	assert.Equal(t, 0, len(repo.InstalledGroupCommands()))
   176  	assert.Equal(t, 0, len(repo.InstalledExecutableCommands()))
   177  }
   178  
   179  func Test_Load_Malformat_Manifest(t *testing.T) {
   180  	pathname, err := filepath.Abs("assets/dropins_wrong_manifest_format/")
   181  	if err == nil {
   182  		fmt.Println("Absolute:", pathname)
   183  	}
   184  
   185  	reg, err := newDefaultRepoIndex("default")
   186  	assert.Nil(t, err)
   187  
   188  	repo, err := CreateLocalRepository("default", pathname, reg)
   189  	assert.Nil(t, err)
   190  
   191  	assert.Equal(t, 0, len(repo.InstalledGroupCommands()))
   192  	assert.Equal(t, 0, len(repo.InstalledExecutableCommands()))
   193  
   194  }
   195  
   196  func Test_Load_Multiple_Pkgs(t *testing.T) {
   197  	pathname, err := filepath.Abs("assets/dropins_multiple_pkgs/")
   198  	if err == nil {
   199  		fmt.Println("Absolute:", pathname)
   200  	}
   201  
   202  	reg, err := newDefaultRepoIndex("default")
   203  	assert.Nil(t, err)
   204  
   205  	repo, err := CreateLocalRepository("default", pathname, reg)
   206  	assert.Nil(t, err)
   207  
   208  	assert.Equal(t, 2, len(repo.InstalledGroupCommands()))
   209  	assert.Equal(t, 2, len(repo.InstalledExecutableCommands()))
   210  }
   211  
   212  func Test_Load_Symlink(t *testing.T) {
   213  	pathname, err := filepath.Abs("assets/symlink_dropins/")
   214  	if err == nil {
   215  		fmt.Println("Absolute:", pathname)
   216  	}
   217  
   218  	reg, err := newDefaultRepoIndex("default")
   219  	assert.Nil(t, err)
   220  
   221  	repo, err := CreateLocalRepository("default", pathname, reg)
   222  	assert.Nil(t, err)
   223  
   224  	assert.Equal(t, 1, len(repo.InstalledGroupCommands()))
   225  	assert.Equal(t, 1, len(repo.InstalledExecutableCommands()))
   226  
   227  	assert.Equal(t, "wf", repo.InstalledGroupCommands()[0].Name())
   228  	assert.Equal(t, "debug-cdt-env", repo.InstalledExecutableCommands()[0].Name())
   229  }