installerbuilder/internal/builder/linux/rpm_test.go

307 lines
8.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package linux
import (
"os"
"path/filepath"
"testing"
"git.kingecg.top/kingecg/installerbuilder/internal/config"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestRPMBuilder_Name(t *testing.T) {
cfg := &config.Config{Name: "TestApp", Version: "1.0.0"}
builder := NewRPMBuilder(cfg, "output")
assert.Equal(t, "Linux RPM Builder", builder.Name())
}
func TestRPMBuilder_SupportedPlatforms(t *testing.T) {
cfg := &config.Config{Name: "TestApp", Version: "1.0.0"}
builder := NewRPMBuilder(cfg, "output")
platforms := builder.SupportedPlatforms()
assert.Equal(t, []string{"linux"}, platforms)
}
func TestRPMBuilder_SupportedFormats(t *testing.T) {
cfg := &config.Config{Name: "TestApp", Version: "1.0.0"}
builder := NewRPMBuilder(cfg, "output")
formats := builder.SupportedFormats()
assert.Equal(t, []string{"rpm"}, formats)
}
func TestRPMBuilder_CreateSourceTarball(t *testing.T) {
// 创建临时测试目录
tempDir, err := os.MkdirTemp("", "rpm-builder-test-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// 创建源代码目录
sourceDir := filepath.Join(tempDir, "SOURCES", "TestApp-1.0.0")
err = os.MkdirAll(sourceDir, 0755)
require.NoError(t, err)
// 创建测试文件
testFile := filepath.Join(sourceDir, "test.txt")
err = os.WriteFile(testFile, []byte("test content"), 0644)
require.NoError(t, err)
// 创建测试配置
cfg := &config.Config{
Name: "TestApp",
Version: "1.0.0",
}
// 创建RPM构建器
builder := NewRPMBuilder(cfg, tempDir)
// 测试创建源代码压缩包
tarFile := filepath.Join(tempDir, "SOURCES", "TestApp-1.0.0.tar.gz")
err = builder.createSourceTarball(sourceDir, tarFile)
// 由于createSourceTarball需要执行tar命令可能在测试环境中不可用所以我们跳过错误检查
if err != nil {
t.Skip("跳过tar命令测试可能在测试环境中不可用")
}
// 验证压缩包是否存在
_, err = os.Stat(tarFile)
assert.NoError(t, err)
}
func TestRPMBuilder_CreateSpecFile(t *testing.T) {
// 创建临时测试目录
tempDir, err := os.MkdirTemp("", "rpm-builder-test-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// 创建SPECS目录
specsDir := filepath.Join(tempDir, "SPECS")
err = os.MkdirAll(specsDir, 0755)
require.NoError(t, err)
// 创建测试脚本源文件
scriptDir := filepath.Join(tempDir, "scripts")
err = os.MkdirAll(scriptDir, 0755)
require.NoError(t, err)
preinstScript := filepath.Join(scriptDir, "preinst.sh")
err = os.WriteFile(preinstScript, []byte("#!/bin/sh\necho 'Pre-install script'"), 0644)
require.NoError(t, err)
// 创建测试配置
cfg := &config.Config{
Name: "TestApp",
Version: "1.0.0",
Description: "Test Application",
Author: "Test Author",
License: "MIT",
Platforms: config.PlatformsConfig{
Linux: config.LinuxConfig{
Rpm: config.LinuxRpmConfig{
Group: "Applications/System",
URL: "https://example.com",
Requires: []string{"glibc", "libstdc++"},
Provides: []string{"testapp"},
Conflicts: []string{"old-package"},
Obsoletes: []string{"legacy-package"},
AutoReqProv: true,
},
},
},
Contents: config.ContentsConfig{
Scripts: []config.ScriptConfig{
{
Type: "preinstall",
Content: "#!/bin/sh\necho 'Pre-install script'",
},
{
Type: "postinstall",
Source: preinstScript,
},
{
Type: "preuninstall",
Content: "echo 'Pre-uninstall script'",
},
{
Type: "postuninstall",
Content: "echo 'Post-uninstall script'",
},
{
Type: "invalid",
Content: "echo 'Invalid script'",
},
},
},
}
// 创建RPM构建器
builder := NewRPMBuilder(cfg, tempDir)
// 测试创建SPEC文件
specFile := filepath.Join(specsDir, "TestApp.spec")
err = builder.createSpecFile(specFile)
assert.NoError(t, err)
// 验证SPEC文件是否存在
_, err = os.Stat(specFile)
assert.NoError(t, err)
// 读取SPEC文件内容
content, err := os.ReadFile(specFile)
assert.NoError(t, err)
// 验证文件内容
contentStr := string(content)
assert.Contains(t, contentStr, "Name: TestApp")
assert.Contains(t, contentStr, "Version: 1.0.0")
assert.Contains(t, contentStr, "Summary: Test Application")
assert.Contains(t, contentStr, "Group: Applications/System")
assert.Contains(t, contentStr, "License: MIT")
assert.Contains(t, contentStr, "URL: https://example.com")
assert.Contains(t, contentStr, "Requires: glibc, libstdc++")
assert.Contains(t, contentStr, "Provides: testapp")
assert.Contains(t, contentStr, "Conflicts: old-package")
assert.Contains(t, contentStr, "Obsoletes: legacy-package")
assert.Contains(t, contentStr, "%pre")
assert.Contains(t, contentStr, "%post")
assert.Contains(t, contentStr, "%preun")
assert.Contains(t, contentStr, "%postun")
}
func TestRPMBuilder_Build(t *testing.T) {
// 跳过实际构建测试因为它需要rpmbuild工具
t.Skip("跳过实际构建测试因为它需要rpmbuild工具")
// 创建临时测试目录
tempDir, err := os.MkdirTemp("", "rpm-builder-test-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// 创建输出目录
outputDir := filepath.Join(tempDir, "output")
err = os.MkdirAll(outputDir, 0755)
require.NoError(t, err)
// 创建测试配置
cfg := &config.Config{
Name: "TestApp",
Version: "1.0.0",
Description: "Test Application",
Author: "Test Author",
License: "MIT",
Platforms: config.PlatformsConfig{
Linux: config.LinuxConfig{
Rpm: config.LinuxRpmConfig{
Group: "Applications/System",
URL: "https://example.com",
AutoReqProv: true,
},
},
},
}
// 创建RPM构建器
builder := NewRPMBuilder(cfg, outputDir)
// 测试构建
err = builder.Build()
assert.NoError(t, err)
// 验证输出文件是否存在
outputFile := filepath.Join(outputDir, "TestApp-1.0.0.x86_64.rpm")
_, err = os.Stat(outputFile)
assert.NoError(t, err)
}
func TestRPMBuilder_BuildRpm(t *testing.T) {
// 跳过实际构建测试因为它需要rpmbuild工具
t.Skip("跳过实际构建测试因为它需要rpmbuild工具")
// 创建临时测试目录
tempDir, err := os.MkdirTemp("", "rpm-builder-test-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// 创建RPM构建目录结构
buildDirs := []string{
filepath.Join(tempDir, "BUILD"),
filepath.Join(tempDir, "RPMS"),
filepath.Join(tempDir, "SOURCES"),
filepath.Join(tempDir, "SPECS"),
filepath.Join(tempDir, "SRPMS"),
}
for _, dir := range buildDirs {
err = os.MkdirAll(dir, 0755)
require.NoError(t, err)
}
// 创建输出目录
outputDir := filepath.Join(tempDir, "output")
err = os.MkdirAll(outputDir, 0755)
require.NoError(t, err)
// 创建测试配置
cfg := &config.Config{
Name: "TestApp",
Version: "1.0.0",
Description: "Test Application",
Author: "Test Author",
License: "MIT",
}
// 创建RPM构建器
builder := NewRPMBuilder(cfg, outputDir)
// 创建SPEC文件
specFile := filepath.Join(tempDir, "SPECS", "TestApp.spec")
err = builder.createSpecFile(specFile)
assert.NoError(t, err)
// 测试构建RPM包
outputFile := filepath.Join(outputDir, "TestApp-1.0.0.x86_64.rpm")
err = builder.buildRpm(tempDir, specFile, outputFile)
assert.NoError(t, err)
// 验证输出文件是否存在
_, err = os.Stat(outputFile)
assert.NoError(t, err)
}
func TestCopyFile(t *testing.T) {
// 创建临时测试目录
tempDir, err := os.MkdirTemp("", "rpm-builder-test-*")
require.NoError(t, err)
defer os.RemoveAll(tempDir)
// 创建源文件
srcFile := filepath.Join(tempDir, "source.txt")
err = os.WriteFile(srcFile, []byte("test content"), 0644)
require.NoError(t, err)
// 创建目标文件路径
dstFile := filepath.Join(tempDir, "destination.txt")
// 测试复制文件
err = copyFile(srcFile, dstFile)
assert.NoError(t, err)
// 验证目标文件是否存在
_, err = os.Stat(dstFile)
assert.NoError(t, err)
// 读取目标文件内容
content, err := os.ReadFile(dstFile)
assert.NoError(t, err)
assert.Equal(t, "test content", string(content))
// 测试复制不存在的文件
err = copyFile(filepath.Join(tempDir, "nonexistent.txt"), dstFile)
assert.Error(t, err)
// 测试复制到无效路径
err = copyFile(srcFile, "/invalid/path/file.txt")
assert.Error(t, err)
}