- 新增多个源文件和目录,包括 app.rc、assets、build 脚本等 - 实现了与 MirrorChyan API 交互的客户端逻辑 - 添加了版本检查、更新检测和下载 URL 生成等功能 - 嵌入了配置模板和资源文件系统 - 提供了完整的构建和发布流程
366 lines
9.4 KiB
Go
366 lines
9.4 KiB
Go
package version
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestParseVersion(t *testing.T) {
|
|
tests := []struct {
|
|
input string
|
|
expected *ParsedVersion
|
|
hasError bool
|
|
}{
|
|
{"4.4.0.0", &ParsedVersion{4, 4, 0, 0}, false},
|
|
{"4.4.1.3", &ParsedVersion{4, 4, 1, 3}, false},
|
|
{"1.2.3", &ParsedVersion{1, 2, 3, 0}, false},
|
|
{"invalid", nil, true},
|
|
{"1.2", nil, true},
|
|
{"1.2.3.4.5", nil, true},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result, err := ParseVersion(test.input)
|
|
|
|
if test.hasError {
|
|
if err == nil {
|
|
t.Errorf("Expected error for input %s, but got none", test.input)
|
|
}
|
|
continue
|
|
}
|
|
|
|
if err != nil {
|
|
t.Errorf("Unexpected error for input %s: %v", test.input, err)
|
|
continue
|
|
}
|
|
|
|
if result.Major != test.expected.Major ||
|
|
result.Minor != test.expected.Minor ||
|
|
result.Patch != test.expected.Patch ||
|
|
result.Beta != test.expected.Beta {
|
|
t.Errorf("For input %s, expected %+v, got %+v", test.input, test.expected, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestToDisplayVersion(t *testing.T) {
|
|
tests := []struct {
|
|
version *ParsedVersion
|
|
expected string
|
|
}{
|
|
{&ParsedVersion{4, 4, 0, 0}, "v4.4.0"},
|
|
{&ParsedVersion{4, 4, 1, 3}, "v4.4.1-beta3"},
|
|
{&ParsedVersion{1, 2, 3, 0}, "v1.2.3"},
|
|
{&ParsedVersion{1, 2, 3, 5}, "v1.2.3-beta5"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.version.ToDisplayVersion()
|
|
if result != test.expected {
|
|
t.Errorf("For version %+v, expected %s, got %s", test.version, test.expected, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGetChannel(t *testing.T) {
|
|
tests := []struct {
|
|
version *ParsedVersion
|
|
expected string
|
|
}{
|
|
{&ParsedVersion{4, 4, 0, 0}, "stable"},
|
|
{&ParsedVersion{4, 4, 1, 3}, "beta"},
|
|
{&ParsedVersion{1, 2, 3, 0}, "stable"},
|
|
{&ParsedVersion{1, 2, 3, 1}, "beta"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.version.GetChannel()
|
|
if result != test.expected {
|
|
t.Errorf("For version %+v, expected channel %s, got %s", test.version, test.expected, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestIsNewer(t *testing.T) {
|
|
tests := []struct {
|
|
v1 *ParsedVersion
|
|
v2 *ParsedVersion
|
|
expected bool
|
|
}{
|
|
{&ParsedVersion{4, 4, 1, 0}, &ParsedVersion{4, 4, 0, 0}, true},
|
|
{&ParsedVersion{4, 4, 0, 0}, &ParsedVersion{4, 4, 1, 0}, false},
|
|
{&ParsedVersion{4, 4, 1, 3}, &ParsedVersion{4, 4, 1, 2}, true},
|
|
{&ParsedVersion{4, 4, 1, 2}, &ParsedVersion{4, 4, 1, 3}, false},
|
|
{&ParsedVersion{4, 4, 1, 0}, &ParsedVersion{4, 4, 1, 0}, false},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := test.v1.IsNewer(test.v2)
|
|
if result != test.expected {
|
|
t.Errorf("For %+v.IsNewer(%+v), expected %t, got %t", test.v1, test.v2, test.expected, result)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionFromFile(t *testing.T) {
|
|
// Create a temporary directory
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create resources directory
|
|
resourcesDir := filepath.Join(tempDir, "resources")
|
|
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create test version file
|
|
versionData := VersionInfo{
|
|
MainVersion: "4.4.1.3",
|
|
VersionInfo: map[string]map[string][]string{
|
|
"4.4.1.3": {
|
|
"修复BUG": {"移除崩溃弹窗机制"},
|
|
},
|
|
},
|
|
}
|
|
|
|
data, err := json.Marshal(versionData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
versionFile := filepath.Join(resourcesDir, "version.json")
|
|
if err := os.WriteFile(versionFile, data, 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create version manager with custom executable directory and logger
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version
|
|
result, err := vm.LoadVersionFromFile()
|
|
if err != nil {
|
|
t.Fatalf("Failed to load version: %v", err)
|
|
}
|
|
|
|
if result.MainVersion != "4.4.1.3" {
|
|
t.Errorf("Expected main version 4.4.1.3, got %s", result.MainVersion)
|
|
}
|
|
|
|
if len(result.VersionInfo) != 1 {
|
|
t.Errorf("Expected 1 version info entry, got %d", len(result.VersionInfo))
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionFromFileNotFound(t *testing.T) {
|
|
// Create a temporary directory without version file
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create version manager with custom executable directory and logger
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version (should now return default version instead of error)
|
|
result, err := vm.LoadVersionFromFile()
|
|
if err != nil {
|
|
t.Errorf("Expected no error with fallback mechanism, but got: %v", err)
|
|
}
|
|
|
|
// Should return default version
|
|
if result.MainVersion != "0.0.0.0" {
|
|
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
|
}
|
|
|
|
if result.VersionInfo == nil {
|
|
t.Error("Expected initialized VersionInfo map, got nil")
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionWithDefault(t *testing.T) {
|
|
// Create a temporary directory
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create version manager with custom executable directory
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version with default (no file exists)
|
|
result := vm.LoadVersionWithDefault()
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result from LoadVersionWithDefault")
|
|
}
|
|
|
|
if result.MainVersion != "0.0.0.0" {
|
|
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
|
}
|
|
|
|
if result.VersionInfo == nil {
|
|
t.Error("Expected initialized VersionInfo map, got nil")
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionWithDefaultValidFile(t *testing.T) {
|
|
// Create a temporary directory
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create resources directory
|
|
resourcesDir := filepath.Join(tempDir, "resources")
|
|
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create test version file
|
|
versionData := VersionInfo{
|
|
MainVersion: "4.4.1.3",
|
|
VersionInfo: map[string]map[string][]string{
|
|
"4.4.1.3": {
|
|
"修复BUG": {"移除崩溃弹窗机制"},
|
|
},
|
|
},
|
|
}
|
|
|
|
data, err := json.Marshal(versionData)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
versionFile := filepath.Join(resourcesDir, "version.json")
|
|
if err := os.WriteFile(versionFile, data, 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create version manager with custom executable directory
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version with default (valid file exists)
|
|
result := vm.LoadVersionWithDefault()
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result from LoadVersionWithDefault")
|
|
}
|
|
|
|
if result.MainVersion != "4.4.1.3" {
|
|
t.Errorf("Expected version 4.4.1.3, got %s", result.MainVersion)
|
|
}
|
|
|
|
if len(result.VersionInfo) != 1 {
|
|
t.Errorf("Expected 1 version info entry, got %d", len(result.VersionInfo))
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionFromFileCorrupted(t *testing.T) {
|
|
// Create a temporary directory
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create resources directory
|
|
resourcesDir := filepath.Join(tempDir, "resources")
|
|
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create corrupted version file
|
|
versionFile := filepath.Join(resourcesDir, "version.json")
|
|
if err := os.WriteFile(versionFile, []byte("invalid json content"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create version manager with custom executable directory
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version (should return default version for corrupted file)
|
|
result, err := vm.LoadVersionFromFile()
|
|
if err != nil {
|
|
t.Errorf("Expected no error with fallback mechanism for corrupted file, but got: %v", err)
|
|
}
|
|
|
|
// Should return default version
|
|
if result.MainVersion != "0.0.0.0" {
|
|
t.Errorf("Expected default version 0.0.0.0 for corrupted file, got %s", result.MainVersion)
|
|
}
|
|
|
|
if result.VersionInfo == nil {
|
|
t.Error("Expected initialized VersionInfo map for corrupted file, got nil")
|
|
}
|
|
}
|
|
|
|
func TestLoadVersionWithDefaultCorrupted(t *testing.T) {
|
|
// Create a temporary directory
|
|
tempDir, err := os.MkdirTemp("", "version_test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer os.RemoveAll(tempDir)
|
|
|
|
// Create resources directory
|
|
resourcesDir := filepath.Join(tempDir, "resources")
|
|
if err := os.MkdirAll(resourcesDir, 0755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create corrupted version file
|
|
versionFile := filepath.Join(resourcesDir, "version.json")
|
|
if err := os.WriteFile(versionFile, []byte("invalid json content"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Create version manager with custom executable directory
|
|
vm := NewVersionManager()
|
|
vm.executableDir = tempDir
|
|
|
|
// Test loading version with default (corrupted file)
|
|
result := vm.LoadVersionWithDefault()
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result from LoadVersionWithDefault for corrupted file")
|
|
}
|
|
|
|
if result.MainVersion != "0.0.0.0" {
|
|
t.Errorf("Expected default version 0.0.0.0 for corrupted file, got %s", result.MainVersion)
|
|
}
|
|
|
|
if result.VersionInfo == nil {
|
|
t.Error("Expected initialized VersionInfo map for corrupted file, got nil")
|
|
}
|
|
}
|
|
|
|
func TestCreateDefaultVersion(t *testing.T) {
|
|
vm := NewVersionManager()
|
|
|
|
result := vm.createDefaultVersion()
|
|
if result == nil {
|
|
t.Fatal("Expected non-nil result from createDefaultVersion")
|
|
}
|
|
|
|
if result.MainVersion != "0.0.0.0" {
|
|
t.Errorf("Expected default version 0.0.0.0, got %s", result.MainVersion)
|
|
}
|
|
|
|
if result.VersionInfo == nil {
|
|
t.Error("Expected initialized VersionInfo map, got nil")
|
|
}
|
|
|
|
if len(result.VersionInfo) != 0 {
|
|
t.Errorf("Expected empty VersionInfo map, got %d entries", len(result.VersionInfo))
|
|
}
|
|
} |