Skip to content

Commit e21a88d

Browse files
committed
Add OS detection logic methods
1 parent 9b56bdb commit e21a88d

3 files changed

Lines changed: 206 additions & 5 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Use the `failOnExit` function to specify whether a command non-zero exit value (
3737
@BuildCommand
3838
public void startServer() throws Exception {
3939
final List<String> cmds;
40-
if (System.getProperty("os.name").toLowerCase().contains("win")) {
40+
if (ExecOperation.isWindows()) {
4141
cmds = List.of("cmd", "/c", "stop.bat");
4242
} else {
4343
cmds = List.of("./stop.sh");

src/main/java/rife/bld/extension/ExecOperation.java

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.ArrayList;
2727
import java.util.Collection;
2828
import java.util.List;
29+
import java.util.Locale;
2930
import java.util.concurrent.TimeUnit;
3031
import java.util.logging.Level;
3132
import java.util.logging.Logger;
@@ -38,11 +39,63 @@
3839
*/
3940
public class ExecOperation extends AbstractOperation<ExecOperation> {
4041
private static final Logger LOGGER = Logger.getLogger(ExecOperation.class.getName());
42+
private static final String OS_NAME = getOSName(); // cached
4143
private final List<String> args_ = new ArrayList<>();
4244
private boolean failOnExit_ = true;
4345
private int timeout_ = 30;
4446
private File workDir_;
4547

48+
/**
49+
* Determines if the operating system is Linux.
50+
*
51+
* @return true if the operating system is Linux, false otherwise.
52+
*/
53+
public static boolean isLinux() {
54+
return isLinux(OS_NAME);
55+
}
56+
57+
/**
58+
* Determines if the current operating system is macOS.
59+
*
60+
* @return true if the OS is macOS, false otherwise.
61+
*/
62+
public static boolean isMacOS() {
63+
return isMacOS(OS_NAME);
64+
}
65+
66+
/**
67+
* Determines if the current operating system is Windows.
68+
*
69+
* @return true if the operating system is Windows, false otherwise.
70+
*/
71+
public static boolean isWindows() {
72+
return isWindows(OS_NAME);
73+
}
74+
75+
private static String getOSName() {
76+
var osName = System.getProperty("os.name");
77+
return normalizeOSName(osName);
78+
}
79+
80+
static String normalizeOSName(String osName) {
81+
return osName != null ? osName.toLowerCase(Locale.ENGLISH) : "";
82+
}
83+
84+
static boolean isLinux(String osName) {
85+
var normalized = normalizeOSName(osName);
86+
return normalized.contains("linux") || normalized.contains("unix");
87+
}
88+
89+
static boolean isMacOS(String osName) {
90+
var normalized = normalizeOSName(osName);
91+
return normalized.contains("mac") || normalized.contains("darwin") || normalized.contains("osx");
92+
}
93+
94+
static boolean isWindows(String osName) {
95+
String normalized = normalizeOSName(osName);
96+
return normalized.contains("windows") || normalized.startsWith("win");
97+
}
98+
4699
/**
47100
* Executes the command.
48101
*/
@@ -200,7 +253,6 @@ public ExecOperation workDir(Path dir) {
200253
return workDir(dir.toFile());
201254
}
202255

203-
204256
/**
205257
* Configures the working directory.
206258
*

src/test/java/rife/bld/extension/ExecOperationTest.java

Lines changed: 152 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,20 @@
3232

3333
import java.io.File;
3434
import java.util.List;
35-
import java.util.Locale;
3635
import java.util.logging.Level;
3736
import java.util.logging.Logger;
3837

3938
import static org.assertj.core.api.Assertions.assertThat;
4039
import static org.assertj.core.api.Assertions.assertThatCode;
40+
import static org.junit.jupiter.api.Assertions.assertFalse;
41+
import static org.junit.jupiter.api.Assertions.assertTrue;
4142

4243
@ExtendWith(LoggingExtension.class)
4344
class ExecOperationTest {
4445
private static final String BAR = "bar";
4546
private static final String CAT_COMMAND = "cat";
4647
private static final String ECHO_COMMAND = "echo";
4748
private static final String FOO = "foo";
48-
private static final boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase(Locale.US).contains("win");
4949

5050
@SuppressWarnings("LoggerInitializedWithForeignClass")
5151
private static final Logger LOGGER = Logger.getLogger(ExecOperation.class.getName());
@@ -73,7 +73,7 @@ private ExecOperation createBasicExecOperation() {
7373
}
7474

7575
private List<String> getPlatformSpecificCommand(List<String> windowsCommand, List<String> unixCommand) {
76-
return IS_WINDOWS ? windowsCommand : unixCommand;
76+
return ExecOperation.isWindows() ? windowsCommand : unixCommand;
7777
}
7878

7979
@Nested
@@ -309,4 +309,153 @@ void workDirAsString() {
309309
.doesNotThrowAnyException();
310310
}
311311
}
312+
313+
@Nested
314+
@DisplayName("OS Tests")
315+
class OsTests {
316+
@Nested
317+
@DisplayName("OS Detection Tests")
318+
class OsDetectionTests {
319+
@Test
320+
@EnabledOnOs(OS.LINUX)
321+
void verifyIsLinux() {
322+
assertTrue(ExecOperation.isLinux());
323+
assertFalse(ExecOperation.isWindows());
324+
assertFalse(ExecOperation.isMacOS());
325+
}
326+
327+
@Test
328+
@EnabledOnOs(OS.MAC)
329+
void verifyIsMacOS() {
330+
assertTrue(ExecOperation.isMacOS());
331+
assertFalse(ExecOperation.isLinux());
332+
assertFalse(ExecOperation.isWindows());
333+
}
334+
335+
@Test
336+
@EnabledOnOs(OS.WINDOWS)
337+
void verifyIsWindows() {
338+
assertTrue(ExecOperation.isWindows());
339+
assertFalse(ExecOperation.isLinux());
340+
assertFalse(ExecOperation.isMacOS());
341+
}
342+
}
343+
344+
@Nested
345+
@DisplayName("Linux Detection Tests")
346+
class LinuxDetectionTests {
347+
@Test
348+
void detectsLinux() {
349+
assertTrue(ExecOperation.isLinux("Linux"));
350+
}
351+
352+
@Test
353+
void detectsUnix() {
354+
assertTrue(ExecOperation.isLinux("Unix"));
355+
}
356+
357+
@Test
358+
void detectsLinuxCaseInsensitive() {
359+
assertTrue(ExecOperation.isLinux("linux"));
360+
}
361+
362+
@Test
363+
void detectsUnixVariants() {
364+
assertTrue(ExecOperation.isLinux("freebsd unix"));
365+
}
366+
367+
@Test
368+
void rejectsNonLinux() {
369+
assertFalse(ExecOperation.isLinux("Windows 10"));
370+
assertFalse(ExecOperation.isLinux("Mac OS X"));
371+
}
372+
}
373+
374+
@Nested
375+
@DisplayName("MacOS Detection Tests")
376+
class MacOSDetectionTests {
377+
@Test
378+
void detectsMacOSX() {
379+
assertTrue(ExecOperation.isMacOS("Mac OS X"));
380+
}
381+
382+
@Test
383+
void detectsMacOS() {
384+
assertTrue(ExecOperation.isMacOS("macOS"));
385+
}
386+
387+
@Test
388+
void detectsDarwin() {
389+
assertTrue(ExecOperation.isMacOS("Darwin"));
390+
}
391+
392+
@Test
393+
void detectsMacCaseInsensitive() {
394+
assertTrue(ExecOperation.isMacOS("MAC OS X"));
395+
assertTrue(ExecOperation.isMacOS("MACOS"));
396+
}
397+
398+
@Test
399+
void rejectsNonMac() {
400+
assertFalse(ExecOperation.isMacOS("Windows 10"));
401+
assertFalse(ExecOperation.isMacOS("Linux"));
402+
}
403+
}
404+
405+
@Nested
406+
@DisplayName("Windows Detection Tests")
407+
class WindowsDetectionTests {
408+
@Test
409+
void detectsWindows() {
410+
assertTrue(ExecOperation.isWindows("windows 10"));
411+
}
412+
413+
@Test
414+
void detectsWindows11() {
415+
assertTrue(ExecOperation.isWindows("windows 11"));
416+
}
417+
418+
@Test
419+
void detectsWindowsServer() {
420+
assertTrue(ExecOperation.isWindows("windows server 2022"));
421+
}
422+
423+
@Test
424+
void detectsWindowsCaseInsensitive() {
425+
assertTrue(ExecOperation.isWindows("windows"));
426+
}
427+
428+
@Test
429+
void rejectsNonWindows() {
430+
assertFalse(ExecOperation.isWindows("Mac OS X"));
431+
assertFalse(ExecOperation.isWindows("Linux"));
432+
assertFalse(ExecOperation.isWindows("darwin")); // "win" should not match "darwin"
433+
}
434+
}
435+
436+
@Nested
437+
@DisplayName("Edge Cases Tests")
438+
class EdgeCaseTests {
439+
@Test
440+
void handlesEmptyOsName() {
441+
assertFalse(ExecOperation.isLinux(""));
442+
assertFalse(ExecOperation.isMacOS(""));
443+
assertFalse(ExecOperation.isWindows(""));
444+
}
445+
446+
@Test
447+
void handlesUnknownOS() {
448+
assertFalse(ExecOperation.isLinux("someunknownos"));
449+
assertFalse(ExecOperation.isMacOS("someunknownos"));
450+
assertFalse(ExecOperation.isWindows("someunknownos"));
451+
}
452+
453+
@Test
454+
void handlesPartialMatches() {
455+
assertFalse(ExecOperation.isWindows("darwin"));
456+
assertFalse(ExecOperation.isMacOS("linux"));
457+
assertFalse(ExecOperation.isLinux("windows"));
458+
}
459+
}
460+
}
312461
}

0 commit comments

Comments
 (0)