255 lines
5.9 KiB
Go
255 lines
5.9 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestRepoFileExists(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
var statPath string
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
statPath = name
|
|
if name == "/existing/path" {
|
|
return nil, nil // exists
|
|
}
|
|
return nil, os.ErrNotExist
|
|
}
|
|
|
|
if !repoFileExists("/nonexistent", "/existing/path") {
|
|
t.Error("expected true when at least one path exists")
|
|
}
|
|
if statPath != "/existing/path" {
|
|
t.Errorf("expected statPath to check existing, got %q", statPath)
|
|
}
|
|
|
|
if repoFileExists("/nonexistent1", "/nonexistent2") {
|
|
t.Error("expected false when no paths exist")
|
|
}
|
|
}
|
|
|
|
func TestWriteDNFRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
var runArgv []string
|
|
var runInput []byte
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
runArgv = argv
|
|
runInput = opts.Input
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
|
|
writeDNFRepo("adoptium", "Adoptium", "http://baseurl", "http://gpgkey")
|
|
|
|
if len(runArgv) < 2 || runArgv[0] != "tee" || runArgv[1] != "/etc/yum.repos.d/adoptium.repo" {
|
|
t.Errorf("unexpected run command: %v", runArgv)
|
|
}
|
|
content := string(runInput)
|
|
if !strings.Contains(content, "[adoptium]") || !strings.Contains(content, "gpgkey=http://gpgkey") {
|
|
t.Errorf("unexpected repo file content: %s", content)
|
|
}
|
|
}
|
|
|
|
func TestSetupDockerRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
// Case 1: DNF
|
|
pkgMgr = "dnf"
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
var runArgv []string
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
runArgv = argv
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
setupDockerRepo()
|
|
cmdStr := strings.Join(runArgv, " ")
|
|
if runArgv[0] != "dnf" || !strings.Contains(cmdStr, "docker-ce.repo") {
|
|
t.Errorf("unexpected run command for DNF Docker setup: %v", runArgv)
|
|
}
|
|
|
|
// Case 2: APT
|
|
pkgMgr = "apt-get"
|
|
var runShellCmds []string
|
|
runShell = func(cmd string, opts CmdOpts) CmdResult {
|
|
runShellCmds = append(runShellCmds, cmd)
|
|
if strings.Contains(cmd, "VERSION_CODENAME") {
|
|
return CmdResult{ExitCode: 0, Stdout: []byte("jammy")}
|
|
}
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
runArgv = argv
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
archName = "x86_64"
|
|
setupDockerRepo()
|
|
|
|
if len(runShellCmds) < 2 {
|
|
t.Fatalf("expected at least 2 shell commands, got %v", runShellCmds)
|
|
}
|
|
if !strings.Contains(runShellCmds[0], "docker.gpg") {
|
|
t.Errorf("expected GPG key command, got %q", runShellCmds[0])
|
|
}
|
|
}
|
|
|
|
func TestSetupGHRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
// Case 1: DNF
|
|
pkgMgr = "dnf"
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
var runArgv []string
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
runArgv = argv
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
setupGHRepo()
|
|
cmdStr := strings.Join(runArgv, " ")
|
|
if runArgv[0] != "dnf" || !strings.Contains(cmdStr, "gh-cli.repo") {
|
|
t.Errorf("unexpected run command for DNF GH setup: %v", runArgv)
|
|
}
|
|
}
|
|
|
|
func TestSetupChromeRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
pkgMgr = "dnf"
|
|
archName = "aarch64" // Chrome doesn't support aarch64 on linux, should warn and skip
|
|
var warned bool
|
|
issuesMu.Lock()
|
|
issues = nil
|
|
issuesMu.Unlock()
|
|
setupChromeRepo()
|
|
issuesMu.Lock()
|
|
for _, iss := range issues {
|
|
if strings.Contains(iss, "Google Chrome has no Linux build") {
|
|
warned = true
|
|
}
|
|
}
|
|
issuesMu.Unlock()
|
|
if !warned {
|
|
t.Error("expected warning for aarch64 Linux Chrome setup")
|
|
}
|
|
}
|
|
|
|
func TestSetupVivaldiRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
pkgMgr = "dnf"
|
|
archName = "aarch64" // Vivaldi doesn't support aarch64 on linux, should warn and skip
|
|
var warned bool
|
|
setupVivaldiRepo()
|
|
issuesMu.Lock()
|
|
for _, iss := range issues {
|
|
if strings.Contains(iss, "Vivaldi repo on this arch is not supported") {
|
|
warned = true
|
|
}
|
|
}
|
|
issuesMu.Unlock()
|
|
if !warned {
|
|
t.Error("expected warning for aarch64 Linux Vivaldi setup")
|
|
}
|
|
}
|
|
|
|
func TestSetupTemurinRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
pkgMgr = "dnf"
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
var runArgv []string
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
runArgv = argv
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
setupTemurinRepo()
|
|
if len(runArgv) < 2 || runArgv[0] != "tee" || !strings.Contains(runArgv[1], "Adoptium.repo") {
|
|
t.Errorf("unexpected run command for Temurin setup: %v", runArgv)
|
|
}
|
|
}
|
|
|
|
func TestSetupDotnetRepo(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
pkgMgr = "apt-get"
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
var runShellCmd string
|
|
runShell = func(cmd string, opts CmdOpts) CmdResult {
|
|
runShellCmd = cmd
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
setupDotnetRepo()
|
|
if !strings.Contains(runShellCmd, "packages-microsoft-prod.deb") {
|
|
t.Errorf("expected wget/dpkg call for Dotnet, got %q", runShellCmd)
|
|
}
|
|
}
|
|
|
|
func TestRepoGroups(t *testing.T) {
|
|
groups := repoGroups()
|
|
if len(groups) != 6 {
|
|
t.Errorf("expected 6 repo groups, got %d", len(groups))
|
|
}
|
|
}
|
|
|
|
func TestReposAdditionalEdgeCases(t *testing.T) {
|
|
defer resetMocks()
|
|
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
pkgMgr = "dnf"
|
|
setupGHRepo()
|
|
|
|
archName = "x86_64"
|
|
setupChromeRepo()
|
|
setupVivaldiRepo()
|
|
setupTemurinRepo()
|
|
|
|
pkgMgr = "apt-get"
|
|
setupGHRepo()
|
|
setupChromeRepo()
|
|
setupVivaldiRepo()
|
|
setupTemurinRepo()
|
|
setupDotnetRepo()
|
|
|
|
pkgMgr = "dnf"
|
|
setupDotnetRepo()
|
|
|
|
resetMocks()
|
|
pkgMgr = "apt-get"
|
|
archName = "x86_64"
|
|
osStat = func(name string) (os.FileInfo, error) {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
var shellCmds []string
|
|
runShell = func(cmd string, opts CmdOpts) CmdResult {
|
|
shellCmds = append(shellCmds, cmd)
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
var cmdCalls [][]string
|
|
runCmd = func(argv []string, opts CmdOpts) CmdResult {
|
|
cmdCalls = append(cmdCalls, argv)
|
|
return CmdResult{ExitCode: 0}
|
|
}
|
|
|
|
setupGHRepo()
|
|
setupChromeRepo()
|
|
setupVivaldiRepo()
|
|
setupTemurinRepo()
|
|
|
|
if len(shellCmds) < 4 {
|
|
t.Errorf("expected at least 4 shell commands for APT setup, got %d", len(shellCmds))
|
|
}
|
|
}
|
|
|