From d770bea2912e9fe02644183dce424193fe87ab7d Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Mon, 12 Jan 2009 15:33:56 +0000 Subject: Enhanced LoginServiceTests to test for authentication and response Expanded TestUserDataPlugin to cover new methods From: Arthur Rodrigo S Valadares --- .../Communications/Tests/LoginServiceTests.cs | 215 +++++++++++++++++++-- OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs | 134 ++++++++++--- 2 files changed, 305 insertions(+), 44 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs index 6c18d06..8111add 100644 --- a/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs +++ b/OpenSim/Framework/Communications/Tests/LoginServiceTests.cs @@ -44,35 +44,35 @@ namespace OpenSim.Framework.Communications.Tests /// Test the login service. For now, most of this will be done through the LocalLoginService as LoginService /// is abstract /// - [TestFixture] + [TestFixture] public class LoginServiceTests - { + { /// /// Test the normal response to a login. Does not test authentication. - /// + /// [Test] - public void TestNormalLoginResponse() + public void T010_NormalLoginResponse() { //log4net.Config.XmlConfigurator.Configure(); - + string firstName = "Timmy"; string lastName = "Mallet"; string regionExternalName = "localhost"; IPEndPoint capsEndPoint = new IPEndPoint(IPAddress.Loopback, 9123); - CommunicationsManager commsManager + CommunicationsManager commsManager = new TestCommunicationsManager(new OpenSim.Framework.NetworkServersInfo(42, 43)); - + commsManager.GridService.RegisterRegion( new RegionInfo(42, 43, capsEndPoint, regionExternalName)); commsManager.GridService.RegionLoginsEnabled = true; - - LoginService loginService + + LoginService loginService = new LocalLoginService( - (UserManagerBase)commsManager.UserService, "Hello folks", commsManager.InterServiceInventoryService, - (LocalBackEndServices)commsManager.GridService, + (UserManagerBase)commsManager.UserService, "Hello folks", commsManager.InterServiceInventoryService, + (LocalBackEndServices)commsManager.GridService, commsManager.NetworkServersInfo, false, new LibraryRootFolder(String.Empty)); - + Hashtable loginParams = new Hashtable(); loginParams["first"] = firstName; loginParams["last"] = lastName; @@ -85,20 +85,199 @@ namespace OpenSim.Framework.Communications.Tests XmlRpcResponse response = loginService.XmlRpcLoginMethod(request); Hashtable responseData = (Hashtable)response.Value; - + + Assert.That(responseData["first_name"], Is.EqualTo(firstName)); + Assert.That(responseData["last_name"], Is.EqualTo(lastName)); + Assert.That( + responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(System.Int32.MaxValue)); + + Regex capsSeedPattern + = new Regex("^http://" + + regionExternalName + + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$"); + + Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True); + } + + [Test] + public void T011_Auth_Login() + { + string firstName = "Adam"; + string lastName = "West"; + string regionExternalName = "localhost"; + IPEndPoint capsEndPoint = new IPEndPoint(IPAddress.Loopback, 9123); + + CommunicationsManager commsManager + = new TestCommunicationsManager(new OpenSim.Framework.NetworkServersInfo(42, 43)); + + commsManager.GridService.RegisterRegion( + new RegionInfo(42, 43, capsEndPoint, regionExternalName)); + commsManager.GridService.RegionLoginsEnabled = true; + + LocalUserServices lus = (LocalUserServices)commsManager.UserService; + + lus.AddUser(firstName,lastName,"boingboing","abc@ftw.com",42,43); + + + LoginService loginService + = new LocalLoginService( + (UserManagerBase)lus, "Hello folks", commsManager.InterServiceInventoryService, + (LocalBackEndServices)commsManager.GridService, + commsManager.NetworkServersInfo, true, new LibraryRootFolder(String.Empty)); + + // TODO: Not check inventory part of response yet. // TODO: Not checking all of login response thoroughly yet. - + + // 1) Test for positive authentication + + Hashtable loginParams = new Hashtable(); + loginParams["first"] = firstName; + loginParams["last"] = lastName; + loginParams["passwd"] = "boingboing"; + + ArrayList sendParams = new ArrayList(); + sendParams.Add(loginParams); + + XmlRpcRequest request = new XmlRpcRequest("login_to_simulator", sendParams); + + XmlRpcResponse response = loginService.XmlRpcLoginMethod(request); + Hashtable responseData = (Hashtable)response.Value; + + UserProfileData uprof = lus.GetUserProfile(firstName,lastName); + + UserAgentData uagent = uprof.CurrentAgent; + Assert.That(uagent,Is.Not.Null); + + Assert.That(responseData["first_name"], Is.Not.Null); Assert.That(responseData["first_name"], Is.EqualTo(firstName)); Assert.That(responseData["last_name"], Is.EqualTo(lastName)); + Assert.That(responseData["agent_id"], Is.EqualTo(uagent.ProfileID.ToString())); + Assert.That(responseData["session_id"], Is.EqualTo(uagent.SessionID.ToString())); + Assert.That(responseData["secure_session_id"], Is.EqualTo(uagent.SecureSessionID.ToString())); + ArrayList invlibroot = (ArrayList) responseData["inventory-lib-root"]; + Hashtable invlibroothash = (Hashtable) invlibroot[0]; + Assert.That(invlibroothash["folder_id"],Is.EqualTo("00000112-000f-0000-0000-000100bba000")); Assert.That( responseData["circuit_code"], Is.GreaterThanOrEqualTo(0) & Is.LessThanOrEqualTo(System.Int32.MaxValue)); + Assert.That(responseData["message"], Is.EqualTo("Hello folks")); + Assert.That(responseData["buddy-list"], Is.Empty); + Assert.That(responseData["start_location"], Is.EqualTo("last")); + + Regex capsSeedPattern + = new Regex("^http://" + + regionExternalName + + ":9000/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$"); + + Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True); + + // 1.1) Test for budddies! + lus.AddUser("Friend","Number1","boingboing","abc@ftw.com",42,43); + lus.AddUser("Friend","Number2","boingboing","abc@ftw.com",42,43); + + UserProfileData friend1 = lus.GetUserProfile("Friend","Number1"); + UserProfileData friend2 = lus.GetUserProfile("Friend","Number2"); + lus.AddNewUserFriend(friend1.ID,uprof.ID,1); + lus.AddNewUserFriend(friend1.ID,friend2.ID,2); + + loginParams = new Hashtable(); + loginParams["first"] = "Friend"; + loginParams["last"] = "Number1"; + loginParams["passwd"] = "boingboing"; + + sendParams = new ArrayList(); + sendParams.Add(loginParams); + + request = new XmlRpcRequest("login_to_simulator", sendParams); + + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + + ArrayList friendslist = (ArrayList) responseData["buddy-list"]; + + Assert.That(friendslist,Is.Not.Null); + + + Hashtable buddy1 = (Hashtable) friendslist[0]; + Hashtable buddy2 = (Hashtable) friendslist[1]; + Assert.That(friendslist.Count, Is.EqualTo(2)); + Assert.That(uprof.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"])); + Assert.That(friend2.ID.ToString(), Is.EqualTo(buddy1["buddy_id"]) | Is.EqualTo(buddy2["buddy_id"])); + + // 2) Test for negative authentication + // + string error_auth_message = "Could not authenticate your avatar. Please check your username and password, and check the grid if problems persist."; + string error_xml_message = "Error connecting to grid. Could not percieve credentials from login XML."; + string error_already_logged = "You appear to be already logged in. " + + "If this is not the case please wait for your session to timeout. " + + "If this takes longer than a few minutes please contact the grid owner. " + + "Please wait 5 minutes if you are going to connect to a region nearby to the region you were at previously."; + string error_region_unavailable = "The region you are attempting to log into is not responding. Please select another region and try again."; + // 2.1) Test for wrong user name + loginParams = new Hashtable(); + loginParams["first"] = lastName; + loginParams["last"] = firstName; + loginParams["passwd"] = "boingboing"; + + sendParams = new ArrayList(); + sendParams.Add(loginParams); + + request = new XmlRpcRequest("login_to_simulator", sendParams); + + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + Assert.That(responseData["message"], Is.EqualTo(error_auth_message)); + + // 2.2) Test for wrong password + loginParams = new Hashtable(); + loginParams["first"] = "Friend"; + loginParams["last"] = "Number2"; + loginParams["passwd"] = "boing"; + + sendParams = new ArrayList(); + sendParams.Add(loginParams); + + request = new XmlRpcRequest("login_to_simulator", sendParams); + + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + Assert.That(responseData["message"], Is.EqualTo(error_auth_message)); + + // 2.3) Bad XML + loginParams = new Hashtable(); + loginParams["first"] = "Friend"; + loginParams["banana"] = "Banana"; + loginParams["passwd"] = "boingboing"; + + sendParams = new ArrayList(); + sendParams.Add(loginParams); + + request = new XmlRpcRequest("login_to_simulator", sendParams); + + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + Assert.That(responseData["message"], Is.EqualTo(error_xml_message)); - Regex capsSeedPattern - = new Regex("^http://" + regionExternalName + ":" + NetworkServersInfo.DefaultHttpListenerPort - + "/CAPS/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{8}0000/$"); + // 2.4) Already logged in and sucessfull post login + loginParams = new Hashtable(); + loginParams["first"] = "Adam"; + loginParams["last"] = "West"; + loginParams["passwd"] = "boingboing"; + + sendParams = new ArrayList(); + sendParams.Add(loginParams); + + request = new XmlRpcRequest("login_to_simulator", sendParams); + + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + Assert.That(responseData["message"], Is.EqualTo(error_already_logged)); + + request = new XmlRpcRequest("login_to_simulator", sendParams); - Assert.That(capsSeedPattern.IsMatch((string)responseData["seed_capability"]), Is.True); + response = loginService.XmlRpcLoginMethod(request); + responseData = (Hashtable)response.Value; + Assert.That(responseData["message"], Is.EqualTo("Hello folks")); } } } diff --git a/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs b/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs index 6be7b3d..8dccacc 100644 --- a/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs +++ b/OpenSim/Tests/Common/Mock/TestUserDataPlugin.cs @@ -38,7 +38,7 @@ namespace OpenSim.Tests.Common.Mock /// tests are single threaded. /// public class TestUserDataPlugin : IUserDataPlugin - { + { public string Version { get { return "0"; } } public string Name { get { return "TestUserDataPlugin"; } } @@ -49,64 +49,146 @@ namespace OpenSim.Tests.Common.Mock /// /// User profiles keyed by uuid - /// + /// private Dictionary m_userProfilesByUuid = new Dictionary(); + /// + /// User profiles and their agents + /// + private Dictionary m_agentByProfileUuid = new Dictionary(); + + /// + /// Friends list by uuid + /// + private Dictionary> m_friendsListByUuid = new Dictionary>(); + public void Initialise() {} public void Dispose() {} - - public void AddNewUserProfile(UserProfileData user) + + public void AddNewUserProfile(UserProfileData user) { UpdateUserProfile(user); } - - public UserProfileData GetUserByUUID(UUID user) + + public UserProfileData GetUserByUUID(UUID user) { UserProfileData userProfile = null; m_userProfilesByUuid.TryGetValue(user, out userProfile); - - return userProfile; + + return userProfile; } - public UserProfileData GetUserByName(string fname, string lname) - { + public UserProfileData GetUserByName(string fname, string lname) + { UserProfileData userProfile = null; m_userProfilesByName.TryGetValue(fname + " " + lname, out userProfile); - + return userProfile; - } + } - public bool UpdateUserProfile(UserProfileData user) - { + public bool UpdateUserProfile(UserProfileData user) + { m_userProfilesByUuid[user.ID] = user; m_userProfilesByName[user.FirstName + " " + user.SurName] = user; - + return true; } public List GeneratePickerResults(UUID queryID, string query) { return null; } - public UserAgentData GetAgentByUUID(UUID user) { return null; } + public UserAgentData GetAgentByUUID(UUID user) + { + UserAgentData userAgent = null; + m_agentByProfileUuid.TryGetValue(user, out userAgent); - public UserAgentData GetAgentByName(string name) { return null; } + return userAgent; + } - public UserAgentData GetAgentByName(string fname, string lname) { return null; } + public UserAgentData GetAgentByName(string name) + { + UserProfileData userProfile = null; + m_userProfilesByName.TryGetValue(name, out userProfile); + UserAgentData userAgent = null; + m_agentByProfileUuid.TryGetValue(userProfile.ID, out userAgent); + + return userAgent; + } + + public UserAgentData GetAgentByName(string fname, string lname) + { + UserProfileData userProfile = GetUserByName(fname,lname); + UserAgentData userAgent = null; + m_agentByProfileUuid.TryGetValue(userProfile.ID, out userAgent); + + return userAgent; + } public void StoreWebLoginKey(UUID agentID, UUID webLoginKey) {} - public void AddNewUserAgent(UserAgentData agent) {} + public void AddNewUserAgent(UserAgentData agent) + { + m_agentByProfileUuid[agent.ProfileID] = agent; + } + public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) + { + FriendListItem newfriend = new FriendListItem(); + newfriend.FriendPerms = perms; + newfriend.Friend = friend; + newfriend.FriendListOwner = friendlistowner; + + if (!m_friendsListByUuid.ContainsKey(friendlistowner)) + { + List friendslist = new List(); + m_friendsListByUuid[friendlistowner] = friendslist; + + } + m_friendsListByUuid[friendlistowner].Add(newfriend); + } - public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms) {} - - public void RemoveUserFriend(UUID friendlistowner, UUID friend) {} + public void RemoveUserFriend(UUID friendlistowner, UUID friend) + { + if (m_friendsListByUuid.ContainsKey(friendlistowner)) + { + List friendslist = m_friendsListByUuid[friendlistowner]; + foreach (FriendListItem frienditem in friendslist) + { + if (frienditem.Friend == friend) + { + friendslist.Remove(frienditem); + break; + } + } + } + } - public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) {} + public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms) + { + if (m_friendsListByUuid.ContainsKey(friendlistowner)) + { + List friendslist = m_friendsListByUuid[friendlistowner]; + foreach (FriendListItem frienditem in friendslist) + { + if (frienditem.Friend == friend) + { + frienditem.FriendPerms = perms; + break; + } + } + } + } - public List GetUserFriendList(UUID friendlistowner) + public List GetUserFriendList(UUID friendlistowner) { - return new List(); + if (m_friendsListByUuid.ContainsKey(friendlistowner)) + { + return m_friendsListByUuid[friendlistowner]; + } + else + return new List(); + + } - + public Dictionary GetFriendRegionInfos(List uuids) { return null; } public bool MoneyTransferRequest(UUID from, UUID to, uint amount) { return false; } -- cgit v1.1