win32-file 0.7.2 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGES +225 -220
- data/MANIFEST +15 -13
- data/README +70 -70
- data/Rakefile +49 -52
- data/certs/djberg96_pub.pem +21 -0
- data/lib/win32-file.rb +1 -0
- data/lib/win32/file.rb +516 -516
- data/lib/win32/file/constants.rb +27 -27
- data/lib/win32/file/functions.rb +49 -49
- data/lib/win32/file/structs.rb +24 -24
- data/test/test_win32_file_link.rb +141 -141
- data/test/test_win32_file_misc.rb +16 -16
- data/test/test_win32_file_path.rb +282 -282
- data/test/test_win32_file_stat.rb +284 -284
- data/win32-file.gemspec +32 -32
- metadata +41 -17
- metadata.gz.sig +1 -0
data/lib/win32/file/constants.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
|
-
require 'ffi'
|
2
|
-
|
3
|
-
module Windows
|
4
|
-
module File
|
5
|
-
module Constants
|
6
|
-
FILE_ATTRIBUTE_NORMAL = 0x00000080
|
7
|
-
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
|
8
|
-
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
|
9
|
-
FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
|
10
|
-
FILE_SHARE_READ = 1
|
11
|
-
|
12
|
-
FILE_TYPE_UNKNOWN = 0x0000
|
13
|
-
FILE_TYPE_CHAR = 0x0002
|
14
|
-
NO_ERROR = 0
|
15
|
-
|
16
|
-
GENERIC_READ = 0x80000000
|
17
|
-
INVALID_HANDLE_VALUE = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
18
|
-
INVALID_FILE_ATTRIBUTES = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
19
|
-
IO_REPARSE_TAG_SYMLINK = 0xA000000C
|
20
|
-
OPEN_EXISTING = 3
|
21
|
-
|
22
|
-
DRIVE_REMOVABLE = 2
|
23
|
-
DRIVE_CDROM = 5
|
24
|
-
DRIVE_RAMDISK = 6
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module Windows
|
4
|
+
module File
|
5
|
+
module Constants
|
6
|
+
FILE_ATTRIBUTE_NORMAL = 0x00000080
|
7
|
+
FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
|
8
|
+
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
|
9
|
+
FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
|
10
|
+
FILE_SHARE_READ = 1
|
11
|
+
|
12
|
+
FILE_TYPE_UNKNOWN = 0x0000
|
13
|
+
FILE_TYPE_CHAR = 0x0002
|
14
|
+
NO_ERROR = 0
|
15
|
+
|
16
|
+
GENERIC_READ = 0x80000000
|
17
|
+
INVALID_HANDLE_VALUE = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
18
|
+
INVALID_FILE_ATTRIBUTES = (1 << FFI::Platform::ADDRESS_SIZE) - 1
|
19
|
+
IO_REPARSE_TAG_SYMLINK = 0xA000000C
|
20
|
+
OPEN_EXISTING = 3
|
21
|
+
|
22
|
+
DRIVE_REMOVABLE = 2
|
23
|
+
DRIVE_CDROM = 5
|
24
|
+
DRIVE_RAMDISK = 6
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/win32/file/functions.rb
CHANGED
@@ -1,49 +1,49 @@
|
|
1
|
-
module Windows
|
2
|
-
module File
|
3
|
-
module Functions
|
4
|
-
extend FFI::Library
|
5
|
-
ffi_lib :kernel32
|
6
|
-
|
7
|
-
typedef :ulong, :dword
|
8
|
-
typedef :uintptr_t, :handle
|
9
|
-
typedef :pointer, :ptr
|
10
|
-
|
11
|
-
def self.attach_pfunc(*args)
|
12
|
-
attach_function(*args)
|
13
|
-
private args[0]
|
14
|
-
end
|
15
|
-
|
16
|
-
attach_pfunc :CloseHandle, [:handle], :bool
|
17
|
-
attach_pfunc :CreateFileW, [:buffer_in, :dword, :dword, :pointer, :dword, :dword, :handle], :handle
|
18
|
-
attach_pfunc :CreateSymbolicLinkW, [:buffer_in, :buffer_in, :dword], :bool
|
19
|
-
attach_pfunc :FindFirstFileW, [:buffer_in, :pointer], :handle
|
20
|
-
attach_pfunc :GetDiskFreeSpaceW, [:buffer_in, :pointer, :pointer, :pointer, :pointer], :bool
|
21
|
-
attach_pfunc :GetDriveTypeW, [:buffer_in], :uint
|
22
|
-
attach_pfunc :GetFileType, [:handle], :dword
|
23
|
-
attach_pfunc :GetFileAttributesW, [:buffer_in], :dword
|
24
|
-
attach_pfunc :GetFinalPathNameByHandleW, [:handle, :buffer_out, :dword, :dword], :dword
|
25
|
-
attach_pfunc :GetShortPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
26
|
-
attach_pfunc :GetLongPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
27
|
-
attach_pfunc :QueryDosDeviceA, [:string, :buffer_out, :dword], :dword
|
28
|
-
|
29
|
-
ffi_lib :shlwapi
|
30
|
-
|
31
|
-
attach_pfunc :PathFindExtensionW, [:buffer_in], :pointer
|
32
|
-
attach_pfunc :PathIsRootW, [:buffer_in], :bool
|
33
|
-
attach_pfunc :PathStripPathW, [:pointer], :void
|
34
|
-
attach_pfunc :PathRemoveBackslashW, [:buffer_in], :string
|
35
|
-
attach_pfunc :PathRemoveFileSpecW, [:pointer], :bool
|
36
|
-
attach_pfunc :PathRemoveExtensionW, [:buffer_in], :void
|
37
|
-
attach_pfunc :PathStripToRootW, [:buffer_in], :bool
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class String
|
43
|
-
# Read a wide character string up until the first double null, and delete
|
44
|
-
# any remaining null characters.
|
45
|
-
def wstrip
|
46
|
-
self.force_encoding('UTF-16LE').encode('UTF-8',:invalid=>:replace,:undef=>:replace).
|
47
|
-
split("\x00")[0].encode(Encoding.default_external)
|
48
|
-
end
|
49
|
-
end
|
1
|
+
module Windows
|
2
|
+
module File
|
3
|
+
module Functions
|
4
|
+
extend FFI::Library
|
5
|
+
ffi_lib :kernel32
|
6
|
+
|
7
|
+
typedef :ulong, :dword
|
8
|
+
typedef :uintptr_t, :handle
|
9
|
+
typedef :pointer, :ptr
|
10
|
+
|
11
|
+
def self.attach_pfunc(*args)
|
12
|
+
attach_function(*args)
|
13
|
+
private args[0]
|
14
|
+
end
|
15
|
+
|
16
|
+
attach_pfunc :CloseHandle, [:handle], :bool
|
17
|
+
attach_pfunc :CreateFileW, [:buffer_in, :dword, :dword, :pointer, :dword, :dword, :handle], :handle
|
18
|
+
attach_pfunc :CreateSymbolicLinkW, [:buffer_in, :buffer_in, :dword], :bool
|
19
|
+
attach_pfunc :FindFirstFileW, [:buffer_in, :pointer], :handle
|
20
|
+
attach_pfunc :GetDiskFreeSpaceW, [:buffer_in, :pointer, :pointer, :pointer, :pointer], :bool
|
21
|
+
attach_pfunc :GetDriveTypeW, [:buffer_in], :uint
|
22
|
+
attach_pfunc :GetFileType, [:handle], :dword
|
23
|
+
attach_pfunc :GetFileAttributesW, [:buffer_in], :dword
|
24
|
+
attach_pfunc :GetFinalPathNameByHandleW, [:handle, :buffer_out, :dword, :dword], :dword
|
25
|
+
attach_pfunc :GetShortPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
26
|
+
attach_pfunc :GetLongPathNameW, [:buffer_in, :buffer_out, :dword], :dword
|
27
|
+
attach_pfunc :QueryDosDeviceA, [:string, :buffer_out, :dword], :dword
|
28
|
+
|
29
|
+
ffi_lib :shlwapi
|
30
|
+
|
31
|
+
attach_pfunc :PathFindExtensionW, [:buffer_in], :pointer
|
32
|
+
attach_pfunc :PathIsRootW, [:buffer_in], :bool
|
33
|
+
attach_pfunc :PathStripPathW, [:pointer], :void
|
34
|
+
attach_pfunc :PathRemoveBackslashW, [:buffer_in], :string
|
35
|
+
attach_pfunc :PathRemoveFileSpecW, [:pointer], :bool
|
36
|
+
attach_pfunc :PathRemoveExtensionW, [:buffer_in], :void
|
37
|
+
attach_pfunc :PathStripToRootW, [:buffer_in], :bool
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class String
|
43
|
+
# Read a wide character string up until the first double null, and delete
|
44
|
+
# any remaining null characters.
|
45
|
+
def wstrip
|
46
|
+
self.force_encoding('UTF-16LE').encode('UTF-8',:invalid=>:replace,:undef=>:replace).
|
47
|
+
split("\x00")[0].encode(Encoding.default_external)
|
48
|
+
end
|
49
|
+
end
|
data/lib/win32/file/structs.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
module Windows
|
2
|
-
module File
|
3
|
-
module Structs
|
4
|
-
class FILETIME < FFI::Struct
|
5
|
-
layout(:dwLowDateTime, :ulong, :dwHighDateTime, :ulong)
|
6
|
-
end
|
7
|
-
|
8
|
-
class WIN32_FIND_DATA < FFI::Struct
|
9
|
-
layout(
|
10
|
-
:dwFileAttributes, :ulong,
|
11
|
-
:ftCreationTime, FILETIME,
|
12
|
-
:ftLastAccessTime, FILETIME,
|
13
|
-
:ftLastWriteTime, FILETIME,
|
14
|
-
:nFileSizeHigh, :ulong,
|
15
|
-
:nFileSizeLow, :ulong,
|
16
|
-
:dwReserved0, :ulong,
|
17
|
-
:dwReserved1, :ulong,
|
18
|
-
:cFileName, [:uint8, 260*2],
|
19
|
-
:cAlternateFileName, [:uint8, 14*2]
|
20
|
-
)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
module Windows
|
2
|
+
module File
|
3
|
+
module Structs
|
4
|
+
class FILETIME < FFI::Struct
|
5
|
+
layout(:dwLowDateTime, :ulong, :dwHighDateTime, :ulong)
|
6
|
+
end
|
7
|
+
|
8
|
+
class WIN32_FIND_DATA < FFI::Struct
|
9
|
+
layout(
|
10
|
+
:dwFileAttributes, :ulong,
|
11
|
+
:ftCreationTime, FILETIME,
|
12
|
+
:ftLastAccessTime, FILETIME,
|
13
|
+
:ftLastWriteTime, FILETIME,
|
14
|
+
:nFileSizeHigh, :ulong,
|
15
|
+
:nFileSizeLow, :ulong,
|
16
|
+
:dwReserved0, :ulong,
|
17
|
+
:dwReserved1, :ulong,
|
18
|
+
:cFileName, [:uint8, 260*2],
|
19
|
+
:cAlternateFileName, [:uint8, 14*2]
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,141 +1,141 @@
|
|
1
|
-
#############################################################################
|
2
|
-
# test_win32_file_link.rb
|
3
|
-
#
|
4
|
-
# Test case for the link related methods of win32-file. You should run this
|
5
|
-
# test via the 'rake test' or 'rake test:link' task.
|
6
|
-
#############################################################################
|
7
|
-
require 'test-unit'
|
8
|
-
require 'win32/security'
|
9
|
-
require 'win32/file'
|
10
|
-
|
11
|
-
class TC_Win32_File_Link < Test::Unit::TestCase
|
12
|
-
def self.startup
|
13
|
-
Dir.chdir(File.expand_path(File.dirname(__FILE__)))
|
14
|
-
@@file = File.join(Dir.pwd, 'link_test.txt')
|
15
|
-
File.open(@@file, 'w'){ |fh| fh.puts "This is a link test." }
|
16
|
-
end
|
17
|
-
|
18
|
-
def setup
|
19
|
-
@link = "this_is_a_symlink"
|
20
|
-
@file = "link_test.txt"
|
21
|
-
@admin = Win32::Security.elevated_security?
|
22
|
-
end
|
23
|
-
|
24
|
-
test "symlink basic functionality" do
|
25
|
-
assert_respond_to(File, :symlink)
|
26
|
-
end
|
27
|
-
|
28
|
-
test "symlink to a file works as expected" do
|
29
|
-
omit_unless(@admin)
|
30
|
-
assert_nothing_raised{ File.symlink(@@file, @link) }
|
31
|
-
assert_true(File.exist?(@link))
|
32
|
-
assert_true(File.symlink?(@link))
|
33
|
-
end
|
34
|
-
|
35
|
-
test "symlink method returns zero" do
|
36
|
-
omit_unless(@admin)
|
37
|
-
assert_equal(0, File.symlink(@@file, @link))
|
38
|
-
end
|
39
|
-
|
40
|
-
test "symlink requires two arguments" do
|
41
|
-
assert_raise(ArgumentError){ File.symlink }
|
42
|
-
assert_raise(ArgumentError){ File.symlink(@link) }
|
43
|
-
assert_raise(ArgumentError){ File.symlink(@@file, @link, @link) }
|
44
|
-
end
|
45
|
-
|
46
|
-
test "symlink fails if link already exists" do
|
47
|
-
omit_unless(@admin)
|
48
|
-
File.symlink(@@file, @link)
|
49
|
-
assert_raise(SystemCallError){ File.symlink(@@file, @link) }
|
50
|
-
end
|
51
|
-
|
52
|
-
test "symlink does not fail if target does not exist" do
|
53
|
-
omit_unless(@admin)
|
54
|
-
assert_nothing_raised{ File.symlink('bogus.txt', @link) }
|
55
|
-
end
|
56
|
-
|
57
|
-
test "symlink? basic functionality" do
|
58
|
-
assert_respond_to(File, :symlink?)
|
59
|
-
assert_boolean(File.symlink?(@@file))
|
60
|
-
end
|
61
|
-
|
62
|
-
test "symlink? returns expected result" do
|
63
|
-
omit_unless(@admin)
|
64
|
-
File.symlink(@@file, @link)
|
65
|
-
assert_true(File.symlink?(@link))
|
66
|
-
assert_false(File.symlink?(@file))
|
67
|
-
end
|
68
|
-
|
69
|
-
test "symlink? requires one argument only" do
|
70
|
-
assert_raise(ArgumentError){ File.symlink? }
|
71
|
-
assert_raise(ArgumentError){ File.symlink?(@@file, @@file) }
|
72
|
-
end
|
73
|
-
|
74
|
-
test "readlink basic functionality" do
|
75
|
-
assert_respond_to(File, :readlink)
|
76
|
-
end
|
77
|
-
|
78
|
-
test "readlink returns the expected value when reading a symlink" do
|
79
|
-
omit_unless(@admin)
|
80
|
-
File.symlink(@file, @link)
|
81
|
-
expected = File.expand_path(@file).tr("/", "\\")
|
82
|
-
assert_equal(expected, File.readlink(@link))
|
83
|
-
end
|
84
|
-
|
85
|
-
test "readlink raises an error when reading a regular file" do
|
86
|
-
assert_raise(Errno::EINVAL){ File.readlink(@@file) }
|
87
|
-
end
|
88
|
-
|
89
|
-
test "readlink requires one argument only" do
|
90
|
-
assert_raise(ArgumentError){ File.readlink }
|
91
|
-
assert_raise(ArgumentError){ File.readlink(@link, @link) }
|
92
|
-
end
|
93
|
-
|
94
|
-
test "readlink raises an error if the file is not found" do
|
95
|
-
assert_raise(Errno::ENOENT){ File.readlink('bogus.txt') }
|
96
|
-
end
|
97
|
-
|
98
|
-
test "realdirpath basic functionality" do
|
99
|
-
assert_respond_to(File, :realdirpath)
|
100
|
-
end
|
101
|
-
|
102
|
-
test "realdirpath returns the expected value for a regular file" do
|
103
|
-
assert_equal(Dir.pwd, File.realdirpath(Dir.pwd))
|
104
|
-
assert_equal(@@file, File.realdirpath(@@file).tr("/", "\\"))
|
105
|
-
end
|
106
|
-
|
107
|
-
test "realdirpath returns the expected value for a symlink" do
|
108
|
-
omit_unless(@admin)
|
109
|
-
File.symlink(@@file, @link)
|
110
|
-
expected = File.expand_path(@file).tr("/", "\\")
|
111
|
-
assert_equal(expected, File.realdirpath(@link))
|
112
|
-
end
|
113
|
-
|
114
|
-
test "realpath basic functionality" do
|
115
|
-
assert_respond_to(File, :realpath)
|
116
|
-
end
|
117
|
-
|
118
|
-
test "realpath returns the expected value for a regular file" do
|
119
|
-
assert_equal(Dir.pwd, File.realpath(Dir.pwd))
|
120
|
-
assert_equal(@@file, File.realpath(@@file).tr("/", "\\"))
|
121
|
-
end
|
122
|
-
|
123
|
-
test "realpath returns the expected value for a symlink" do
|
124
|
-
omit_unless(@admin)
|
125
|
-
File.symlink(@@file, @link)
|
126
|
-
expected = File.expand_path(@file).tr("/", "\\")
|
127
|
-
assert_equal(expected, File.realpath(@link))
|
128
|
-
end
|
129
|
-
|
130
|
-
def teardown
|
131
|
-
File.delete(@link) rescue nil # Necessary for dangling links
|
132
|
-
@link = nil
|
133
|
-
@admin = nil
|
134
|
-
@file = nil
|
135
|
-
end
|
136
|
-
|
137
|
-
def self.shutdown
|
138
|
-
File.delete(@@file) if File.exist?(@@file)
|
139
|
-
@@file = nil
|
140
|
-
end
|
141
|
-
end
|
1
|
+
#############################################################################
|
2
|
+
# test_win32_file_link.rb
|
3
|
+
#
|
4
|
+
# Test case for the link related methods of win32-file. You should run this
|
5
|
+
# test via the 'rake test' or 'rake test:link' task.
|
6
|
+
#############################################################################
|
7
|
+
require 'test-unit'
|
8
|
+
require 'win32/security'
|
9
|
+
require 'win32/file'
|
10
|
+
|
11
|
+
class TC_Win32_File_Link < Test::Unit::TestCase
|
12
|
+
def self.startup
|
13
|
+
Dir.chdir(File.expand_path(File.dirname(__FILE__)))
|
14
|
+
@@file = File.join(Dir.pwd, 'link_test.txt')
|
15
|
+
File.open(@@file, 'w'){ |fh| fh.puts "This is a link test." }
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup
|
19
|
+
@link = "this_is_a_symlink"
|
20
|
+
@file = "link_test.txt"
|
21
|
+
@admin = Win32::Security.elevated_security?
|
22
|
+
end
|
23
|
+
|
24
|
+
test "symlink basic functionality" do
|
25
|
+
assert_respond_to(File, :symlink)
|
26
|
+
end
|
27
|
+
|
28
|
+
test "symlink to a file works as expected" do
|
29
|
+
omit_unless(@admin)
|
30
|
+
assert_nothing_raised{ File.symlink(@@file, @link) }
|
31
|
+
assert_true(File.exist?(@link))
|
32
|
+
assert_true(File.symlink?(@link))
|
33
|
+
end
|
34
|
+
|
35
|
+
test "symlink method returns zero" do
|
36
|
+
omit_unless(@admin)
|
37
|
+
assert_equal(0, File.symlink(@@file, @link))
|
38
|
+
end
|
39
|
+
|
40
|
+
test "symlink requires two arguments" do
|
41
|
+
assert_raise(ArgumentError){ File.symlink }
|
42
|
+
assert_raise(ArgumentError){ File.symlink(@link) }
|
43
|
+
assert_raise(ArgumentError){ File.symlink(@@file, @link, @link) }
|
44
|
+
end
|
45
|
+
|
46
|
+
test "symlink fails if link already exists" do
|
47
|
+
omit_unless(@admin)
|
48
|
+
File.symlink(@@file, @link)
|
49
|
+
assert_raise(SystemCallError){ File.symlink(@@file, @link) }
|
50
|
+
end
|
51
|
+
|
52
|
+
test "symlink does not fail if target does not exist" do
|
53
|
+
omit_unless(@admin)
|
54
|
+
assert_nothing_raised{ File.symlink('bogus.txt', @link) }
|
55
|
+
end
|
56
|
+
|
57
|
+
test "symlink? basic functionality" do
|
58
|
+
assert_respond_to(File, :symlink?)
|
59
|
+
assert_boolean(File.symlink?(@@file))
|
60
|
+
end
|
61
|
+
|
62
|
+
test "symlink? returns expected result" do
|
63
|
+
omit_unless(@admin)
|
64
|
+
File.symlink(@@file, @link)
|
65
|
+
assert_true(File.symlink?(@link))
|
66
|
+
assert_false(File.symlink?(@file))
|
67
|
+
end
|
68
|
+
|
69
|
+
test "symlink? requires one argument only" do
|
70
|
+
assert_raise(ArgumentError){ File.symlink? }
|
71
|
+
assert_raise(ArgumentError){ File.symlink?(@@file, @@file) }
|
72
|
+
end
|
73
|
+
|
74
|
+
test "readlink basic functionality" do
|
75
|
+
assert_respond_to(File, :readlink)
|
76
|
+
end
|
77
|
+
|
78
|
+
test "readlink returns the expected value when reading a symlink" do
|
79
|
+
omit_unless(@admin)
|
80
|
+
File.symlink(@file, @link)
|
81
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
82
|
+
assert_equal(expected, File.readlink(@link))
|
83
|
+
end
|
84
|
+
|
85
|
+
test "readlink raises an error when reading a regular file" do
|
86
|
+
assert_raise(Errno::EINVAL){ File.readlink(@@file) }
|
87
|
+
end
|
88
|
+
|
89
|
+
test "readlink requires one argument only" do
|
90
|
+
assert_raise(ArgumentError){ File.readlink }
|
91
|
+
assert_raise(ArgumentError){ File.readlink(@link, @link) }
|
92
|
+
end
|
93
|
+
|
94
|
+
test "readlink raises an error if the file is not found" do
|
95
|
+
assert_raise(Errno::ENOENT){ File.readlink('bogus.txt') }
|
96
|
+
end
|
97
|
+
|
98
|
+
test "realdirpath basic functionality" do
|
99
|
+
assert_respond_to(File, :realdirpath)
|
100
|
+
end
|
101
|
+
|
102
|
+
test "realdirpath returns the expected value for a regular file" do
|
103
|
+
assert_equal(Dir.pwd, File.realdirpath(Dir.pwd))
|
104
|
+
assert_equal(@@file, File.realdirpath(@@file).tr("/", "\\"))
|
105
|
+
end
|
106
|
+
|
107
|
+
test "realdirpath returns the expected value for a symlink" do
|
108
|
+
omit_unless(@admin)
|
109
|
+
File.symlink(@@file, @link)
|
110
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
111
|
+
assert_equal(expected, File.realdirpath(@link))
|
112
|
+
end
|
113
|
+
|
114
|
+
test "realpath basic functionality" do
|
115
|
+
assert_respond_to(File, :realpath)
|
116
|
+
end
|
117
|
+
|
118
|
+
test "realpath returns the expected value for a regular file" do
|
119
|
+
assert_equal(Dir.pwd, File.realpath(Dir.pwd))
|
120
|
+
assert_equal(@@file, File.realpath(@@file).tr("/", "\\"))
|
121
|
+
end
|
122
|
+
|
123
|
+
test "realpath returns the expected value for a symlink" do
|
124
|
+
omit_unless(@admin)
|
125
|
+
File.symlink(@@file, @link)
|
126
|
+
expected = File.expand_path(@file).tr("/", "\\")
|
127
|
+
assert_equal(expected, File.realpath(@link))
|
128
|
+
end
|
129
|
+
|
130
|
+
def teardown
|
131
|
+
File.delete(@link) rescue nil # Necessary for dangling links
|
132
|
+
@link = nil
|
133
|
+
@admin = nil
|
134
|
+
@file = nil
|
135
|
+
end
|
136
|
+
|
137
|
+
def self.shutdown
|
138
|
+
File.delete(@@file) if File.exist?(@@file)
|
139
|
+
@@file = nil
|
140
|
+
end
|
141
|
+
end
|