aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-08-08 17:56:05 +0200
committerGitHub <noreply@github.com>2024-08-08 17:56:05 +0200
commita7fe9eec731253610ec2fc8cf6a39d19d46ce80a (patch)
tree2807c377304b51e2c2d20942d9887e1327071149
parent4b9ca39522baf31f41b2f5cf52671677f146161b (diff)
parentd93f3c63d8d8a8dd279960b3aa2948e4a2dea1bf (diff)
Merge pull request #4037 from Kelimion/symlink_test
Allow symlink test to work irrespective of git settings.
-rwxr-xr-xcore/sys/windows/kernel32.odin4
-rw-r--r--core/sys/windows/types.odin6
l---------tests/core/os/dir/alink.txt1
-rw-r--r--tests/core/os/os.odin56
4 files changed, 51 insertions, 16 deletions
diff --git a/core/sys/windows/kernel32.odin b/core/sys/windows/kernel32.odin
index f2ca2e507..2f2ebbf17 100755
--- a/core/sys/windows/kernel32.odin
+++ b/core/sys/windows/kernel32.odin
@@ -85,6 +85,10 @@ foreign kernel32 {
lpTargetFileName: LPCWSTR,
lpSecurityAttributes: LPSECURITY_ATTRIBUTES) -> BOOL ---
+ CreateSymbolicLinkW :: proc(lpSymlinkFileName: LPCWSTR,
+ lpTargetFileName: LPCWSTR,
+ dwFlags: SYMBOLIC_LINK_FLAGS) -> BOOLEAN ---
+
GetFileInformationByHandleEx :: proc(hFile: HANDLE,
fileInfoClass: FILE_INFO_BY_HANDLE_CLASS,
lpFileInformation: LPVOID,
diff --git a/core/sys/windows/types.odin b/core/sys/windows/types.odin
index e10e53cf9..bd75f3ebc 100644
--- a/core/sys/windows/types.odin
+++ b/core/sys/windows/types.odin
@@ -1276,6 +1276,12 @@ FOF_NO_UI :: (FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI |
FILEOP_FLAGS :: WORD
+SYMBOLIC_LINK_FLAG :: enum DWORD {
+ DIRECTORY = 0,
+ ALLOW_UNPRIVILGED_CREATE = 1,
+}
+SYMBOLIC_LINK_FLAGS :: bit_set[SYMBOLIC_LINK_FLAG; DWORD]
+
DEVMODEW :: struct {
dmDeviceName: [32]wchar_t,
dmSpecVersion: WORD,
diff --git a/tests/core/os/dir/alink.txt b/tests/core/os/dir/alink.txt
deleted file mode 120000
index 1891a26c0..000000000
--- a/tests/core/os/dir/alink.txt
+++ /dev/null
@@ -1 +0,0 @@
-./a.txt \ No newline at end of file
diff --git a/tests/core/os/os.odin b/tests/core/os/os.odin
index 97ceaeb1e..c7a0dce4c 100644
--- a/tests/core/os/os.odin
+++ b/tests/core/os/os.odin
@@ -1,12 +1,35 @@
-package tests_core_os
+package test_core_os
+import "core:c/libc"
+import win32 "core:sys/windows"
import "core:os"
import "core:slice"
-
import "core:testing"
+import "core:log"
+
+_ :: libc
+_ :: win32
@(test)
read_dir :: proc(t: ^testing.T) {
+ when ODIN_OS == .Windows {
+ link := win32.utf8_to_wstring(#directory + "dir/alink.txt")
+ target := win32.utf8_to_wstring(#directory + "dir/a.txt")
+ sym_err := win32.CreateSymbolicLinkW(link, target, {.ALLOW_UNPRIVILGED_CREATE})
+
+ if !sym_err {
+ log.infof("Unable to create symlink, skipping test. Error: %v", win32.GetLastError())
+ return
+ }
+ } else {
+ sym_err := libc.system("ln -s " + #directory + "dir/a.txt " + #directory + "dir/alink.txt")
+ if sym_err != 0 {
+ log.infof("Unable to create symlink, skipping test. Error: %v", sym_err)
+ return
+ }
+ }
+ defer os.remove(#directory + "dir/alink.txt")
+
fd, err := os.open(#directory + "/dir")
testing.expect_value(t, err, nil)
defer os.close(fd)
@@ -19,17 +42,20 @@ read_dir :: proc(t: ^testing.T) {
testing.expect_value(t, len(dir), 3)
- testing.expect_value(t, dir[0].name, "alink.txt")
- testing.expect(t, !dir[0].is_dir, "is a directory")
- when ODIN_OS == .Windows {
- testing.expect(t, dir[0].mode & os.File_Mode_Sym_Link != 0, "not a symlink")
- } else {
- testing.expect(t, os.S_ISLNK(auto_cast dir[0].mode), "not a symlink")
+ if len(dir) > 0 {
+ testing.expect_value(t, dir[0].name, "alink.txt")
+ testing.expect(t, !dir[0].is_dir, "is a directory")
+ when ODIN_OS == .Windows {
+ testing.expect(t, dir[0].mode & os.File_Mode_Sym_Link != 0, "not a symlink")
+ } else {
+ testing.expect(t, os.S_ISLNK(auto_cast dir[0].mode), "not a symlink")
+ }
}
-
- testing.expect_value(t, dir[1].name, "b.txt")
-
- testing.expect_value(t, dir[2].name, "sub")
- testing.expect(t, dir[2].is_dir, "is not a directory")
-}
-
+ if len(dir) > 1 {
+ testing.expect_value(t, dir[1].name, "b.txt")
+ }
+ if len(dir) > 2 {
+ testing.expect_value(t, dir[2].name, "sub")
+ testing.expect(t, dir[2].is_dir, "is not a directory")
+ }
+} \ No newline at end of file