-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathjava_test.go
More file actions
216 lines (183 loc) · 6.49 KB
/
java_test.go
File metadata and controls
216 lines (183 loc) · 6.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
package tools
import (
"os"
"path/filepath"
"runtime"
"testing"
"github.com/gnodet/mvx/pkg/config"
)
func TestUseSystemTool(t *testing.T) {
// Test when MVX_USE_SYSTEM_JAVA is not set
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
if UseSystemTool("java") {
t.Error("UseSystemTool('java') should return false when MVX_USE_SYSTEM_JAVA is not set")
}
// Test when MVX_USE_SYSTEM_JAVA is set to false
os.Setenv("MVX_USE_SYSTEM_JAVA", "false")
if UseSystemTool("java") {
t.Error("UseSystemTool('java') should return false when MVX_USE_SYSTEM_JAVA=false")
}
// Test when MVX_USE_SYSTEM_JAVA is set to true
os.Setenv("MVX_USE_SYSTEM_JAVA", "true")
if !UseSystemTool("java") {
t.Error("UseSystemTool('java') should return true when MVX_USE_SYSTEM_JAVA=true")
}
// Test Maven tool
os.Unsetenv("MVX_USE_SYSTEM_MAVEN")
if UseSystemTool("maven") {
t.Error("UseSystemTool('maven') should return false when MVX_USE_SYSTEM_MAVEN is not set")
}
os.Setenv("MVX_USE_SYSTEM_MAVEN", "true")
if !UseSystemTool("maven") {
t.Error("UseSystemTool('maven') should return true when MVX_USE_SYSTEM_MAVEN=true")
}
// Clean up
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
os.Unsetenv("MVX_USE_SYSTEM_MAVEN")
}
func TestUseSystemJava(t *testing.T) {
// Test when MVX_USE_SYSTEM_JAVA is not set
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
if UseSystemTool("java") {
t.Error("UseSystemTool('java') should return false when MVX_USE_SYSTEM_JAVA is not set")
}
// Test when MVX_USE_SYSTEM_JAVA is set to false
os.Setenv("MVX_USE_SYSTEM_JAVA", "false")
if UseSystemTool("java") {
t.Error("UseSystemTool('java') should return false when MVX_USE_SYSTEM_JAVA=false")
}
// Test when MVX_USE_SYSTEM_JAVA is set to true
os.Setenv("MVX_USE_SYSTEM_JAVA", "true")
if !UseSystemTool("java") {
t.Error("UseSystemTool('java') should return true when MVX_USE_SYSTEM_JAVA=true")
}
// Clean up
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
}
func TestJavaSystemDetector(t *testing.T) {
// Save original JAVA_HOME
originalJavaHome := os.Getenv("JAVA_HOME")
defer func() {
if originalJavaHome != "" {
os.Setenv("JAVA_HOME", originalJavaHome)
} else {
os.Unsetenv("JAVA_HOME")
}
}()
// Test when JAVA_HOME is not set and java is not in PATH
os.Unsetenv("JAVA_HOME")
// Note: This test might pass if java is in PATH, which is fine
// We're testing that the generic function handles the case gracefully
javaBinaryName := BinaryJava
if runtime.GOOS == "windows" {
javaBinaryName = BinaryJava + ".exe"
}
_, _, err := getSystemToolHome(ToolJava, javaBinaryName, EnvJavaHome)
if err != nil {
// This is expected if java is not in PATH and JAVA_HOME is not set
t.Logf("getSystemToolHome() returned error as expected: %v", err)
}
// Test when JAVA_HOME points to non-existent directory
os.Setenv("JAVA_HOME", "/non/existent/path")
_, _, err = getSystemToolHome(ToolJava, javaBinaryName, EnvJavaHome)
// Note: getSystemToolHome() will fall back to PATH if JAVA_HOME is invalid
// So this test will only fail if java is also not in PATH
// This is the expected behavior - we want to be permissive and use PATH as fallback
if err != nil {
t.Logf("getSystemToolHome() returned error (java not in PATH): %v", err)
} else {
t.Logf("getSystemToolHome() succeeded by falling back to PATH despite invalid JAVA_HOME")
}
}
func TestJavaSystemDetectorVersion(t *testing.T) {
// This test requires a real Java installation, so we'll skip it if JAVA_HOME is not set
javaHome := os.Getenv("JAVA_HOME")
if javaHome == "" {
t.Skip("Skipping test because JAVA_HOME is not set")
}
// Check if Java executable exists
javaExe := filepath.Join(javaHome, "bin", "java")
if runtime.GOOS == "windows" {
javaExe += ".exe"
}
if _, err := os.Stat(javaExe); err != nil {
t.Skip("Skipping test because Java executable not found at JAVA_HOME")
}
version, err := getSystemJavaVersion(javaHome)
if err != nil {
t.Errorf("getSystemJavaVersion() failed: %v", err)
}
if version == "" {
t.Error("getSystemJavaVersion() returned empty version")
}
t.Logf("Detected Java version: %s", version)
}
func TestJavaVersionCompatibility(t *testing.T) {
tests := []struct {
systemVersion string
requestedVersion string
expected bool
}{
{"21", "21", true},
{"17", "17", true},
{"11", "11", true},
{"8", "8", true},
{"21", "17", false},
{"17", "21", false},
{"11", "8", false},
}
for _, test := range tests {
result := isJavaVersionCompatible(test.systemVersion, test.requestedVersion)
if result != test.expected {
t.Errorf("isJavaVersionCompatible(%s, %s) = %v, expected %v",
test.systemVersion, test.requestedVersion, result, test.expected)
}
}
}
func TestJavaToolWithSystemJava(t *testing.T) {
// Save original environment variables
originalUseSystemJava := os.Getenv("MVX_USE_SYSTEM_JAVA")
originalJavaHome := os.Getenv("JAVA_HOME")
defer func() {
if originalUseSystemJava != "" {
os.Setenv("MVX_USE_SYSTEM_JAVA", originalUseSystemJava)
} else {
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
}
if originalJavaHome != "" {
os.Setenv("JAVA_HOME", originalJavaHome)
} else {
os.Unsetenv("JAVA_HOME")
}
}()
// Create a mock manager
manager, err := NewManager()
if err != nil {
t.Fatalf("Failed to create manager: %v", err)
}
javaTool := NewJavaTool(manager)
// Test with MVX_USE_SYSTEM_JAVA=false (default behavior)
os.Unsetenv("MVX_USE_SYSTEM_JAVA")
os.Unsetenv("JAVA_HOME")
cfg := config.ToolConfig{
Version: "99", // Use version 99 which definitely won't be installed
Distribution: "temurin",
}
// IsInstalled should return false when no Java is installed and MVX_USE_SYSTEM_JAVA is not set
if javaTool.IsInstalled("99", cfg) {
t.Error("IsInstalled should return false when no Java is installed")
}
// Test with MVX_USE_SYSTEM_JAVA=true but no JAVA_HOME
os.Setenv("MVX_USE_SYSTEM_JAVA", "true")
os.Unsetenv("JAVA_HOME")
// Note: With standardized approach, IsInstalled will check PATH as fallback
// So this test now depends on whether Java is available in system PATH
// For now, we'll skip the strict JAVA_HOME validation test
t.Logf("Skipping strict JAVA_HOME validation test - standardized approach is more permissive")
// Test with MVX_USE_SYSTEM_JAVA=true and JAVA_HOME set to non-existent path
os.Setenv("MVX_USE_SYSTEM_JAVA", "true")
os.Setenv("JAVA_HOME", "/nonexistent/path/to/java")
// Note: With standardized approach, this will fall back to checking PATH
// The old behavior was more strict and would fail if JAVA_HOME was invalid
t.Logf("Note: Standardized approach is more permissive than old Java-specific logic")
}