etcutils 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +22 -0
- data/.travis.yml +19 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +20 -0
- data/LICENSE +20 -0
- data/README.md +335 -0
- data/Rakefile +16 -0
- data/etcutils.gemspec +27 -0
- data/ext/etcutils/etcutils.c +1398 -0
- data/ext/etcutils/etcutils.h +189 -0
- data/ext/etcutils/extconf.rb +51 -0
- data/ext/etcutils/group.c +192 -0
- data/ext/etcutils/passwd.c +297 -0
- data/lib/etcutils.rb +4 -0
- data/lib/etcutils/version.rb +3 -0
- data/tests/README +141 -0
- data/tests/etcutils_test_helper.rb +8 -0
- data/tests/root/etc_utils.rb +5 -0
- data/tests/root/gshadow_tests.rb +153 -0
- data/tests/root/locking.rb +23 -0
- data/tests/root/shadow_tests.rb +161 -0
- data/tests/test_etc_utils.rb +107 -0
- data/tests/test_eu_locking.rb +15 -0
- data/tests/test_eu_next_uid_next_gid.rb +32 -0
- data/tests/test_eu_sgetpwent.rb +91 -0
- data/tests/test_group_class.rb +128 -0
- data/tests/test_passwd_class.rb +125 -0
- data/tests/user/etc_utils.rb +6 -0
- data/tests/user/locking.rb +7 -0
- metadata +119 -0
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'etcutils_test_helper'
|
2
|
+
require "#{$eu_user}/etc_utils"
|
3
|
+
|
4
|
+
class EtcUtilsTest < Test::Unit::TestCase
|
5
|
+
SG_MAP = Hash.new.tap do |h|
|
6
|
+
h[:pw] = { :file => PASSWD, :ext => 'd' }
|
7
|
+
h[:gr] = { :file => GROUP, :ext => 'p' }
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_constants
|
11
|
+
assert_equal(EtcUtils, EU)
|
12
|
+
assert_equal('1.0.0', EU::VERSION)
|
13
|
+
|
14
|
+
# User DB Files
|
15
|
+
[:passwd, :group, :shadow, :gshadow].each do |m|
|
16
|
+
a = m.to_s.downcase
|
17
|
+
if File.exists?(f = "/etc/#{a}")
|
18
|
+
assert_equal(eval("EU::#{a.upcase}"), f)
|
19
|
+
assert EU.send("has_#{a}?"), "EtcUtils.has_#{a}? should be true."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
assert_equal(EU::SHELL, '/bin/bash')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_reflective_methods
|
27
|
+
assert_not_nil(EU.me, "EU.me should not be nil")
|
28
|
+
assert_equal(EU.me.class, EtcUtils::Passwd, "EU.me should return EtcUtils::Passwd class")
|
29
|
+
assert_equal(EU.me.uid, EU.getlogin.uid)
|
30
|
+
end
|
31
|
+
|
32
|
+
# This could fail if there are less than 5 entries in either /etc/group or /etc/passwd
|
33
|
+
# This could also fail if the user cannot read from these files
|
34
|
+
def test_pw_gr_star_ent
|
35
|
+
assert_nothing_raised do
|
36
|
+
EU.setXXent
|
37
|
+
end
|
38
|
+
|
39
|
+
assert_not_nil EU.getpwent, "Should be able to read from /etc/passwd"
|
40
|
+
assert_not_nil EU.getgrent, "Should be able to read from /etc/group"
|
41
|
+
3.times do
|
42
|
+
EU.getpwent
|
43
|
+
EU.getgrent
|
44
|
+
end
|
45
|
+
|
46
|
+
assert_not_equal(0, (EU.getpwent).uid, "EU.getpwent should iterate through /etc/passwd")
|
47
|
+
assert_not_equal(0, (EU.getgrent).gid, "EU.getgrent should iterate through /etc/group")
|
48
|
+
|
49
|
+
assert_nothing_raised do
|
50
|
+
EU.setXXent
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_equal(0, (EU.getpwent).uid, "EU.setXXent should reset all user DB files (/etc/passwd)")
|
54
|
+
assert_equal(0, (EU.getgrent).gid, "EU.setXXent should reset all user DB files (/etc/group)")
|
55
|
+
|
56
|
+
assert_nothing_raised do
|
57
|
+
EU.endXXent
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_eu_find_pwd
|
62
|
+
assert_block("EU.setpwent should reset /etc/passwd") do
|
63
|
+
2.times do
|
64
|
+
assert_nothing_raised { setpwent }
|
65
|
+
assert_not_nil(u = find_pwd(0))
|
66
|
+
assert_equal(0, u.uid, "EU.find_pwd(0) should only return User with ID zero")
|
67
|
+
assert_nothing_raised { endpwent }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_to_entry
|
73
|
+
r = find_pwd(0).to_entry
|
74
|
+
assert_equal(r.chomp, r, "#to_entry should not have a trailing newline")
|
75
|
+
end
|
76
|
+
SG_MAP.keys.each do |xx|
|
77
|
+
define_method("test_fget#{xx}ent_cp#{SG_MAP[xx][:file].gsub('/','_')}") {
|
78
|
+
begin
|
79
|
+
tmp_fn = "/tmp/_fget#{xx}ent_test"
|
80
|
+
assert_nothing_raised do
|
81
|
+
fh = File.open(SG_MAP[xx][:file], 'r')
|
82
|
+
File.open(tmp_fn, File::RDWR|File::CREAT, 0600) { |tmp_fh|
|
83
|
+
while ( ent = EtcUtils.send("fget#{xx}ent", fh) )
|
84
|
+
ent.fputs(tmp_fh)
|
85
|
+
end
|
86
|
+
}
|
87
|
+
fh.close
|
88
|
+
assert FileUtils.compare_file(SG_MAP[xx][:file], tmp_fn) == true, "DIFF FAILED: #{SG_MAP[xx][:file]} <=> #{tmp_fn}\n" << `diff #{SG_MAP[xx][:file]} #{tmp_fn}`
|
89
|
+
end
|
90
|
+
ensure
|
91
|
+
FileUtils.remove_file(tmp_fn);
|
92
|
+
end
|
93
|
+
}
|
94
|
+
|
95
|
+
define_method("test_get#{xx}") {
|
96
|
+
assert_nothing_raised do
|
97
|
+
EtcUtils.send("set#{xx}ent")
|
98
|
+
while ( ent = EtcUtils.send("get#{xx}ent")); nil; end
|
99
|
+
end
|
100
|
+
}
|
101
|
+
|
102
|
+
m = "find_#{xx}#{SG_MAP[xx][:ext]}"
|
103
|
+
define_method("test_#{m}_typeerr") { assert_raise TypeError do; EtcUtils.send(m,{}); end }
|
104
|
+
define_method("test_#{m}_find_int") { assert_equal(EtcUtils.send(m, 0).name, "root", "EU.find_#{xx}#{SG_MAP[xx][:ent]}(0) should find root by ID") }
|
105
|
+
define_method("test_#{m}_find_str") { assert_equal(EtcUtils.send(m, 'root').name, "root", "EU.find_#{xx}#{SG_MAP[xx][:ent]}('root') should find root by name") }
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
if EU.can_lockfile?
|
2
|
+
require 'etcutils_test_helper'
|
3
|
+
class EULockingTest < Test::Unit::TestCase
|
4
|
+
require "#{$eu_user}/locking"
|
5
|
+
|
6
|
+
def test_methods
|
7
|
+
assert EU.respond_to?(:lock), "Should respond to lock"
|
8
|
+
assert EU.respond_to?(:lckpwdf), "Should respond to lckpwdf"
|
9
|
+
|
10
|
+
assert EU.respond_to?(:locked?), "Should respond to locked?"
|
11
|
+
assert EU.respond_to?(:unlock), "Should respond to unlock"
|
12
|
+
assert EU.respond_to?(:ulckpwdf), "Should respond to ulckpwdf"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'etcutils_test_helper'
|
2
|
+
|
3
|
+
class Test::Unit::TestCase
|
4
|
+
[:uid, :gid].each do |m|
|
5
|
+
Class.new do
|
6
|
+
define_method("test_next_#{m}"){
|
7
|
+
assert(EU.send("next_#{m}"), "EU.next_#{m} should return next available #{m}")
|
8
|
+
assert_not_equal(EU.send("next_#{m}"), EU.send("next_#{m}"), "EU.next_#{m} should never return the same #{m}")
|
9
|
+
}
|
10
|
+
|
11
|
+
# #next_{u,g}id=x should always return x even if {U,G}ID x is assigned
|
12
|
+
# Weird #send bug where EU.send("next_uid=",0) != EU.next_uid=0
|
13
|
+
define_method("test_next_#{m}_equals"){
|
14
|
+
assert_equal(0, eval("EU.next_#{m}=0"), "EU.next_#{m}=x should return x")
|
15
|
+
}
|
16
|
+
|
17
|
+
define_method("test_next_#{m}_params"){
|
18
|
+
assert_not_equal(0, EU.send("next_#{m}", 0), "EU.next_#{m}(x) should return next available #{m} if x is unavailable")
|
19
|
+
assert_equal(9999, EU.send("next_#{m}", 9999), "EU.next_#{m}(x) should return #{m} if x is available")
|
20
|
+
}
|
21
|
+
|
22
|
+
define_method("test_next_#{m}_raises"){
|
23
|
+
assert_raise ArgumentError do
|
24
|
+
EU.send("next_#{m}", 65534)
|
25
|
+
end
|
26
|
+
assert_raise ArgumentError do
|
27
|
+
EU.send("next_#{m}=", -1)
|
28
|
+
end
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'etcutils_test_helper'
|
2
|
+
|
3
|
+
module EUGetPW
|
4
|
+
def self.uid
|
5
|
+
@free_uid ||= EUGetPW._free_uid
|
6
|
+
end
|
7
|
+
|
8
|
+
def self._free_uid
|
9
|
+
id = 9999
|
10
|
+
while EU.find_pwd(id) || EU.find_grp(id)
|
11
|
+
id+=1
|
12
|
+
end
|
13
|
+
return id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class EUsgetpwentTest < Test::Unit::TestCase
|
18
|
+
include EUGetPW
|
19
|
+
|
20
|
+
def setup
|
21
|
+
@uid = EUGetPW.uid
|
22
|
+
@username = "testuser#{@uid}"
|
23
|
+
|
24
|
+
@taken_uid = EU.getpwent.uid
|
25
|
+
@taken_gid = EU.getgrent.gid
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_eu_known_sgetpwent
|
29
|
+
r = find_pwd(0).to_entry
|
30
|
+
assert_equal(r, sgetpwent(r).to_entry, "EU.sgetpwent(r) should equal (r = find_pwd(x).to_entry)")
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_eu_changed_sgetpwent
|
34
|
+
r = find_pwd(0)
|
35
|
+
r.gecos = "Not #{r.gecos || r.name}"
|
36
|
+
r.directory = "/home/etc_utils"
|
37
|
+
r.passwd = "password"
|
38
|
+
r.shell = "/bin/false"
|
39
|
+
ent = sgetpwent(r.to_entry)
|
40
|
+
assert_not_equal(find_pwd(0).to_entry, ent.to_entry, "EU.sgetpwent should respect most attribute changes")
|
41
|
+
assert_equal(r.gecos, ent.gecos, "EU.sgetpwent should respect #gecos changes")
|
42
|
+
assert_equal(r.directory, ent.directory, "EU.sgetpwent should respect #directory changes")
|
43
|
+
assert_equal(r.passwd, ent.passwd, "EU.sgetpwent should respect #directory changes")
|
44
|
+
assert_equal(r.shell, ent.shell, "EU.sgetpwent should respect #shell changes")
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_eu_new_sgetpwent
|
48
|
+
if RUBY_PLATFORM =~ /darwin/
|
49
|
+
new = "#{@username}:*:#{EUGetPW.uid}:#{EUGetPW.uid}::0:0:Test User:/home/testuser:/bin/bash"
|
50
|
+
else
|
51
|
+
new = "#{@username}:x:#{EUGetPW.uid}:#{EUGetPW.uid}:Test User:/home/testuser:/bin/bash"
|
52
|
+
end
|
53
|
+
|
54
|
+
ent = EU.sgetpwent(new)
|
55
|
+
assert_equal(@username, ent.name, "EU.sgetpwent should have the same name")
|
56
|
+
assert_equal(@uid, ent.uid, "EU.sgetpwent should return UID when available")
|
57
|
+
assert_equal(@uid, ent.gid, "EU.sgetpwent should return GID when available")
|
58
|
+
|
59
|
+
ent = EU.sgetpwent(new.gsub(/#{EUGetPW.uid}/,''))
|
60
|
+
e = EU.next_uid(9999) - 1
|
61
|
+
assert_equal(e, ent.uid, "EU.sgetpwent should return UID when available")
|
62
|
+
assert_equal(e, ent.gid, "EU.sgetpwent should return GID when available")
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_eu_raise_sgetpwent
|
66
|
+
assert_raise ArgumentError do
|
67
|
+
if RUBY_PLATFORM =~ /darwin/
|
68
|
+
EU.sgetpwent(":*:1000:1000::0:0:Test User:/home/testuser:/bin/bash")
|
69
|
+
else
|
70
|
+
EU.sgetpwent(":x:1000:1000:Test User:/home/testuser:/bin/bash")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Should raise rb_eSystemCallError if system calls fail (see README)
|
75
|
+
#
|
76
|
+
#assert_raise Errno::ENOENT do
|
77
|
+
# EU.sgetpwent("testuser:x:1000:1000:Test User:/fake/path/testuser:/bin/bash")
|
78
|
+
#end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_eu_conflict_sgetpwent
|
82
|
+
if RUBY_PLATFORM =~ /darwin/
|
83
|
+
new = "#{@username}:*:#{@taken_uid}:#{@taken_gid}::0:0:Test User:/Users/test:/bin/bash"
|
84
|
+
else
|
85
|
+
new = "#{@username}:x:#{@taken_uid}:#{@taken_gid}:Test User:/home/testuser:/bin/bash"
|
86
|
+
end
|
87
|
+
ent = EU.sgetpwent(new)
|
88
|
+
assert_not_equal(@taken_uid, ent.uid, "EU.sgetpwent should return next availabile UID when conflict")
|
89
|
+
assert_not_equal(@taken_gid, ent.gid, "EU.sgetpwent should return next availabile GID when conflict")
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'etcutils_test_helper'
|
2
|
+
|
3
|
+
class GroupClassTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
##
|
6
|
+
# Module Specific Methods
|
7
|
+
#
|
8
|
+
|
9
|
+
def test_set_end_ent
|
10
|
+
assert_nothing_raised do
|
11
|
+
EU.setgrent
|
12
|
+
end
|
13
|
+
|
14
|
+
assert_nothing_raised do
|
15
|
+
EU.endgrent
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_find
|
20
|
+
assert_nil EtcUtils.find_grp("testuser"), "EU.find_grp should return nil if user does not exist"
|
21
|
+
assert_equal("root", EtcUtils.find_grp("root").name, "EU.find_grp(str) should return user if it exists")
|
22
|
+
assert_equal("root", EtcUtils.find_grp(0).name, "EU.find_grp(int) should return user if it exists")
|
23
|
+
assert_nothing_raised do
|
24
|
+
EU.setgrent
|
25
|
+
end
|
26
|
+
assert_equal(getgrnam('root').name, getgrent.name, "EU.getgrnam('root') and EU.getgrent should return the same user")
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_sgetgrent
|
30
|
+
assert sgetgrent(find_grp('root').to_entry).name.eql? "root"
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_getgrent_while
|
34
|
+
assert_nothing_raised do
|
35
|
+
EtcUtils.setgrent
|
36
|
+
while ( ent = EtcUtils.getgrent ); nil; end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_fgetgrent_and_putgrent
|
41
|
+
tmp_fn = "/tmp/_fgetsgent_test"
|
42
|
+
assert_nothing_raised do
|
43
|
+
fh = File.open('/etc/group', 'r')
|
44
|
+
File.open(tmp_fn, File::RDWR|File::CREAT, 0600) { |tmp_fh|
|
45
|
+
while ( ent = EtcUtils.fgetgrent(fh) )
|
46
|
+
EU.putgrent(ent, tmp_fh)
|
47
|
+
end
|
48
|
+
}
|
49
|
+
fh.close
|
50
|
+
end
|
51
|
+
assert File.exists?(tmp_fn), "EU.fgetgrent(fh) should write to fh"
|
52
|
+
assert FileUtils.compare_file("/etc/group", tmp_fn) == true,
|
53
|
+
"DIFF FAILED: /etc/group <=> #{tmp_fn}\n" << `diff /etc/group #{tmp_fn}`
|
54
|
+
ensure
|
55
|
+
FileUtils.remove_file(tmp_fn);
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_putgrent_raises
|
59
|
+
FileUtils.touch "/tmp/_group"
|
60
|
+
|
61
|
+
assert_raise IOError do
|
62
|
+
f = File.open("/tmp/_group", 'r')
|
63
|
+
u = EU.find_grp('root')
|
64
|
+
u.fputs f
|
65
|
+
end
|
66
|
+
ensure
|
67
|
+
FileUtils.remove_file("/tmp/_group");
|
68
|
+
end
|
69
|
+
|
70
|
+
##
|
71
|
+
# EU::Group class methods
|
72
|
+
#
|
73
|
+
def test_class_set_end_ent
|
74
|
+
assert_nothing_raised do
|
75
|
+
EU::Group.set
|
76
|
+
end
|
77
|
+
|
78
|
+
assert_nothing_raised do
|
79
|
+
EU::Group.end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_class_get
|
84
|
+
assert_not_nil EU::Group.get
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_class_each
|
88
|
+
assert_nothing_raised do
|
89
|
+
EU::Group.each do |e|
|
90
|
+
assert e.name
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_class_find
|
96
|
+
assert_equal "root", EU::Group.find('root').name
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_class_parse
|
100
|
+
assert_nothing_raised do
|
101
|
+
EtcUtils::Group.parse("root:x:0:")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_class_parse_members
|
106
|
+
assert_nothing_raised do
|
107
|
+
assert_equal Array, EtcUtils::Group.parse("root:x:0:").members.class
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
##
|
112
|
+
# EU::Group instance methods
|
113
|
+
#
|
114
|
+
def test_init
|
115
|
+
assert_equal EU::Group, EU::Group.new.class
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_instance_methods
|
119
|
+
e = EU::Group.find('root')
|
120
|
+
assert_equal 'root', e.name
|
121
|
+
assert_not_nil e.passwd
|
122
|
+
assert_equal 0, e.gid
|
123
|
+
assert_equal 'root', EU::Group.parse(e.to_entry).name
|
124
|
+
assert_equal String, e.to_entry.class
|
125
|
+
assert_equal Array, e.members.class
|
126
|
+
assert e.respond_to?(:fputs)
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'etcutils_test_helper'
|
2
|
+
|
3
|
+
class PasswdClassTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
|
6
|
+
##
|
7
|
+
# Module Specific Methods
|
8
|
+
#
|
9
|
+
|
10
|
+
def test_set_end_ent
|
11
|
+
assert_nothing_raised do
|
12
|
+
EU.setpwent
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_nothing_raised do
|
16
|
+
EU.endpwent
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_find
|
21
|
+
assert_nil EtcUtils.find_pwd("testuser"), "EU.find_pwd should return nil if user does not exist"
|
22
|
+
assert_equal("root", EtcUtils.find_pwd("root").name, "EU.find_pwd(str) should return user if it exists")
|
23
|
+
assert_equal("root", EtcUtils.find_pwd(0).name, "EU.find_pwd(int) should return user if it exists")
|
24
|
+
assert_nothing_raised do
|
25
|
+
EU.setpwent
|
26
|
+
end
|
27
|
+
assert_equal(getpwnam('root').name, getpwent.name, "EU.getpwnam('root') and EU.getpwent should return the same user")
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_sgetpwent
|
31
|
+
assert sgetpwent(find_pwd('root').to_entry).name.eql? "root"
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_getpwent_while
|
35
|
+
assert_nothing_raised do
|
36
|
+
EtcUtils.setpwent
|
37
|
+
while ( ent = EtcUtils.getpwent ); nil; end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_fgetpwent_and_putpwent
|
42
|
+
tmp_fn = "/tmp/_fgetsgent_test"
|
43
|
+
assert_nothing_raised do
|
44
|
+
fh = File.open('/etc/passwd', 'r')
|
45
|
+
File.open(tmp_fn, File::RDWR|File::CREAT, 0600) { |tmp_fh|
|
46
|
+
while ( ent = EtcUtils.fgetpwent(fh) )
|
47
|
+
EU.putpwent(ent, tmp_fh)
|
48
|
+
end
|
49
|
+
}
|
50
|
+
fh.close
|
51
|
+
end
|
52
|
+
assert File.exists?(tmp_fn), "EU.fgetpwent(fh) should write to fh"
|
53
|
+
assert FileUtils.compare_file("/etc/passwd", tmp_fn) == true,
|
54
|
+
"DIFF FAILED: /etc/passwd <=> #{tmp_fn}\n" << `diff /etc/passwd #{tmp_fn}`
|
55
|
+
ensure
|
56
|
+
FileUtils.remove_file(tmp_fn);
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_putpwent_raises
|
60
|
+
FileUtils.touch "/tmp/_passwd"
|
61
|
+
|
62
|
+
assert_raise IOError do
|
63
|
+
f = File.open("/tmp/_passwd", 'r')
|
64
|
+
u = EU.find_pwd('root')
|
65
|
+
u.fputs f
|
66
|
+
end
|
67
|
+
ensure
|
68
|
+
FileUtils.remove_file("/tmp/_passwd");
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# EU::Passwd class methods
|
73
|
+
#
|
74
|
+
def test_class_set_end_ent
|
75
|
+
assert_nothing_raised do
|
76
|
+
EU::Passwd.set
|
77
|
+
end
|
78
|
+
|
79
|
+
assert_nothing_raised do
|
80
|
+
EU::Passwd.end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_class_get
|
85
|
+
assert_not_nil EU::Passwd.get
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_class_each
|
89
|
+
assert_nothing_raised do
|
90
|
+
EU::Passwd.each do |e|
|
91
|
+
assert e.name
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_class_find
|
97
|
+
assert_equal "root", EU::Passwd.find('root').name
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_class_parse
|
101
|
+
assert_nothing_raised do
|
102
|
+
EtcUtils::Passwd.parse("root:x:0:0:root:/root:/bin/bash")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
##
|
107
|
+
# EU::Passwd instance methods
|
108
|
+
#
|
109
|
+
def test_init
|
110
|
+
assert_equal EU::Passwd, EU::Passwd.new.class
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_instance_methods
|
114
|
+
e = EU::Passwd.find('root')
|
115
|
+
assert_equal 'root', e.name
|
116
|
+
assert_not_nil e.passwd
|
117
|
+
assert_equal 0, e.uid
|
118
|
+
assert_equal 0, e.gid
|
119
|
+
assert_equal '/root', e.directory
|
120
|
+
assert_not_nil e.shell
|
121
|
+
assert e.respond_to?(:fputs)
|
122
|
+
assert_equal 'root', EU::Passwd.parse(e.to_entry).name
|
123
|
+
assert_equal String, e.to_entry.class
|
124
|
+
end
|
125
|
+
end
|