1 // 2 // UnixUserTest.cs: 3 // NUnit Test Cases for Mono.Unix.UnixUser 4 // 5 // Authors: 6 // Jonathan Pryor (jonpryor@vt.edu) 7 // 8 // (C) 2004 Jonathan Pryor 9 // 10 11 using NUnit.Framework; 12 using System; 13 using System.Configuration; 14 using System.Diagnostics; 15 using System.Collections; 16 17 using Mono.Unix; 18 19 using Passwd = Mono.Unix.Native.Passwd; 20 using Syscall = Mono.Unix.Native.Syscall; 21 22 namespace MonoTests.Mono.Unix { 23 24 [TestFixture, Category ("NotDotNet"), Category ("NotOnWindows")] 25 public class UnixUserTest 26 { 27 [Test] 28 [Category ("AndroidNotWorking")] // setpwent is missing from bionic ListAllUsers_ToString()29 public void ListAllUsers_ToString () 30 { 31 try { 32 Console.WriteLine ("Listing all users"); 33 foreach (UnixUserInfo user in UnixUserInfo.GetLocalUsers ()) { 34 Console.WriteLine ("\t{0}", user); 35 } 36 } 37 catch (Exception e) { 38 Assert.Fail ( 39 string.Format ("#TLAU_TS: Exception listing local users: {0}", 40 e.ToString())); 41 } 42 } 43 44 [Test] 45 // According to bug 72293, this may not work: 46 // On systems with NIS, it is possible to have multiple users in the passwd 47 // file with the same name, so the assertion above no longer holds. 48 [Category ("NotWorking")] ReentrantConstructors()49 public void ReentrantConstructors () 50 { 51 ArrayList user_ids = new ArrayList (4); 52 IList users = UnixUserInfo.GetLocalUsers (); 53 foreach (UnixUserInfo user in users) { 54 try { 55 UnixUserInfo byName = new UnixUserInfo (user.UserName); 56 Assert.AreEqual (user, byName, "#TRC: construct by name"); 57 58 if (! user_ids.Contains (user.UserId)) 59 user_ids.Add (user.UserId); 60 } 61 catch (Exception e) { 62 Assert.Fail ( 63 string.Format ("#TRC: Exception constructing UnixUserInfo (string): {0}", 64 e.ToString())); 65 } 66 } 67 68 foreach (uint uid in user_ids) { 69 try { 70 UnixUserInfo byId = new UnixUserInfo (uid); 71 Assert.IsTrue (users.Contains (byId), "TRC: construct by uid"); 72 } 73 catch (Exception e) { 74 Assert.Fail ( 75 string.Format ("#TRC: Exception constructing UnixUserInfo (uint): {0}", 76 e.ToString())); 77 78 } 79 } 80 } 81 82 [Test] 83 [Category ("NotOnMac")] 84 [Category ("AndroidNotWorking")] // setpwent is missing from bionic NonReentrantSyscalls()85 public void NonReentrantSyscalls () 86 { 87 ArrayList user_ids = new ArrayList (4); 88 IList users = UnixUserInfo.GetLocalUsers (); 89 90 foreach (UnixUserInfo user in users) { 91 try { 92 Passwd byName = Syscall.getpwnam (user.UserName); 93 Assert.IsNotNull (byName, "#TNRS: access by name"); 94 UnixUserInfo n = new UnixUserInfo (byName); 95 Assert.AreEqual (user, n, "#TNRS: construct by name"); 96 97 if (! user_ids.Contains (user.UserId)) 98 user_ids.Add (user.UserId); 99 } 100 catch (Exception e) { 101 Assert.Fail ( 102 string.Format ("#TNRS: Exception constructing UnixUserInfo (string): {0}", 103 e.ToString())); 104 } 105 } 106 107 foreach (long uid in user_ids) { 108 try { 109 Passwd byId = Syscall.getpwuid (Convert.ToUInt32 (uid)); 110 Assert.IsNotNull (byId, "#TNRS: access by uid"); 111 112 UnixUserInfo u = new UnixUserInfo (byId); 113 Assert.IsTrue (users.Contains (u), "TNRS: construct by uid"); 114 } 115 catch (Exception e) { 116 Assert.Fail ( 117 string.Format ("#TNRS: Exception constructing UnixUserInfo (uint): {0}", 118 e.ToString())); 119 } 120 } 121 } 122 123 [Test] 124 [Category ("AndroidNotWorking")] // API 21 has getpwnam_r in the NDK headers, but bionic doesn't export it InvalidUsers_Constructor_Name()125 public void InvalidUsers_Constructor_Name () 126 { 127 string[] badUsers = new string[]{"i'm bad", "so am i", "does-not-exist"}; 128 foreach (string u in badUsers) { 129 try { 130 new UnixUserInfo (u); 131 Assert.Fail ("#TIUCN: exception not thrown"); 132 } 133 catch (ArgumentException) { 134 // expected 135 } 136 catch (Exception e) { 137 Assert.Fail (string.Format ("#TIUCN: invalid exception thrown: " + 138 "expected ArgumentException, got {0}: {1}", 139 e.GetType().FullName, e.Message)); 140 } 141 } 142 } 143 144 [Test] InvalidUsers_Syscall_Name()145 public void InvalidUsers_Syscall_Name () 146 { 147 string[] badUsers = new string[]{"i'm bad", "so am i", "does-not-exist"}; 148 foreach (string u in badUsers) { 149 try { 150 Passwd pw = Syscall.getpwnam (u); 151 Assert.IsNull (pw, "#TIUSN: invalid users should return null!"); 152 } 153 catch (Exception e) { 154 Assert.Fail (string.Format ("#TIUCN: invalid exception thrown: " + 155 "expected ArgumentException, got {0}: {1}", 156 e.GetType().FullName, e.Message)); 157 } 158 } 159 } 160 161 [Test] Equality()162 public void Equality () 163 { 164 Passwd orig = new Passwd (); 165 Passwd mod = new Passwd (); 166 mod.pw_name = orig.pw_name = "some name"; 167 mod.pw_passwd = orig.pw_passwd = "some passwd"; 168 mod.pw_uid = orig.pw_uid = 500; 169 mod.pw_gid = orig.pw_gid = 500; 170 mod.pw_gecos = orig.pw_gecos = "some gecos"; 171 mod.pw_dir = orig.pw_dir = "/some/dir"; 172 mod.pw_shell = orig.pw_shell = "/some/shell"; 173 174 Assert.AreEqual (orig, mod, "#TE: copies should be equal"); 175 176 mod.pw_name = "another name"; 177 Assert.IsFalse (orig.Equals (mod), "#TE: changes should be reflected"); 178 } 179 } 180 } 181 182