Merge branch 'master' into careminster-presence-refactor
commit
9165a5207d
|
@ -47,6 +47,11 @@ namespace OpenSim.Data.MySQL
|
||||||
private string m_connectionString;
|
private string m_connectionString;
|
||||||
private object m_dbLock = new object();
|
private object m_dbLock = new object();
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
#region IPlugin Members
|
#region IPlugin Members
|
||||||
|
|
||||||
public override string Version { get { return "1.0.0.0"; } }
|
public override string Version { get { return "1.0.0.0"; } }
|
||||||
|
@ -66,13 +71,10 @@ namespace OpenSim.Data.MySQL
|
||||||
{
|
{
|
||||||
m_connectionString = connect;
|
m_connectionString = connect;
|
||||||
|
|
||||||
// This actually does the roll forward assembly stuff
|
|
||||||
Assembly assem = GetType().Assembly;
|
|
||||||
|
|
||||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
{
|
{
|
||||||
dbcon.Open();
|
dbcon.Open();
|
||||||
Migration m = new Migration(dbcon, assem, "AssetStore");
|
Migration m = new Migration(dbcon, Assembly, "AssetStore");
|
||||||
m.Update();
|
m.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -42,6 +43,11 @@ namespace OpenSim.Data.MySQL
|
||||||
private int m_LastExpire;
|
private int m_LastExpire;
|
||||||
// private string m_connectionString;
|
// private string m_connectionString;
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MySqlAuthenticationData(string connectionString, string realm)
|
public MySqlAuthenticationData(string connectionString, string realm)
|
||||||
: base(connectionString)
|
: base(connectionString)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +57,7 @@ namespace OpenSim.Data.MySQL
|
||||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
{
|
{
|
||||||
dbcon.Open();
|
dbcon.Open();
|
||||||
Migration m = new Migration(dbcon, GetType().Assembly, "AuthStore");
|
Migration m = new Migration(dbcon, Assembly, "AuthStore");
|
||||||
m.Update();
|
m.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,11 @@ namespace OpenSim.Data.MySQL
|
||||||
private Dictionary<string, FieldInfo> m_FieldMap =
|
private Dictionary<string, FieldInfo> m_FieldMap =
|
||||||
new Dictionary<string, FieldInfo>();
|
new Dictionary<string, FieldInfo>();
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MySQLEstateStore()
|
public MySQLEstateStore()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -82,8 +87,7 @@ namespace OpenSim.Data.MySQL
|
||||||
{
|
{
|
||||||
dbcon.Open();
|
dbcon.Open();
|
||||||
|
|
||||||
Assembly assem = GetType().Assembly;
|
Migration m = new Migration(dbcon, Assembly, "EstateStore");
|
||||||
Migration m = new Migration(dbcon, assem, "EstateStore");
|
|
||||||
m.Update();
|
m.Update();
|
||||||
|
|
||||||
Type t = typeof(EstateSettings);
|
Type t = typeof(EstateSettings);
|
||||||
|
|
|
@ -46,6 +46,11 @@ namespace OpenSim.Data.MySQL
|
||||||
protected string m_Realm;
|
protected string m_Realm;
|
||||||
protected FieldInfo m_DataField = null;
|
protected FieldInfo m_DataField = null;
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MySQLGenericTableHandler(string connectionString,
|
public MySQLGenericTableHandler(string connectionString,
|
||||||
string realm, string storeName) : base(connectionString)
|
string realm, string storeName) : base(connectionString)
|
||||||
{
|
{
|
||||||
|
@ -57,7 +62,7 @@ namespace OpenSim.Data.MySQL
|
||||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
{
|
{
|
||||||
dbcon.Open();
|
dbcon.Open();
|
||||||
Migration m = new Migration(dbcon, GetType().Assembly, storeName);
|
Migration m = new Migration(dbcon, Assembly, storeName);
|
||||||
m.Update();
|
m.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,8 @@ using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Data;
|
using OpenSim.Data;
|
||||||
|
@ -42,6 +44,11 @@ namespace OpenSim.Data.MySQL
|
||||||
private List<string> m_ColumnNames;
|
private List<string> m_ColumnNames;
|
||||||
//private string m_connectionString;
|
//private string m_connectionString;
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MySqlRegionData(string connectionString, string realm)
|
public MySqlRegionData(string connectionString, string realm)
|
||||||
: base(connectionString)
|
: base(connectionString)
|
||||||
{
|
{
|
||||||
|
@ -51,7 +58,7 @@ namespace OpenSim.Data.MySQL
|
||||||
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
|
||||||
{
|
{
|
||||||
dbcon.Open();
|
dbcon.Open();
|
||||||
Migration m = new Migration(dbcon, GetType().Assembly, "GridStore");
|
Migration m = new Migration(dbcon, Assembly, "GridStore");
|
||||||
m.Update();
|
m.Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,11 @@ namespace OpenSim.Data.MySQL
|
||||||
private string m_connectionString;
|
private string m_connectionString;
|
||||||
private object m_dbLock = new object();
|
private object m_dbLock = new object();
|
||||||
|
|
||||||
|
protected virtual Assembly Assembly
|
||||||
|
{
|
||||||
|
get { return GetType().Assembly; }
|
||||||
|
}
|
||||||
|
|
||||||
public MySQLSimulationData()
|
public MySQLSimulationData()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -71,8 +76,7 @@ namespace OpenSim.Data.MySQL
|
||||||
|
|
||||||
// Apply new Migrations
|
// Apply new Migrations
|
||||||
//
|
//
|
||||||
Assembly assem = GetType().Assembly;
|
Migration m = new Migration(dbcon, Assembly, "RegionStore");
|
||||||
Migration m = new Migration(dbcon, assem, "RegionStore");
|
|
||||||
m.Update();
|
m.Update();
|
||||||
|
|
||||||
// Clean dropped attachments
|
// Clean dropped attachments
|
||||||
|
|
|
@ -28,6 +28,9 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using log4net;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Data;
|
using OpenSim.Data;
|
||||||
|
@ -36,12 +39,17 @@ namespace OpenSim.Data.Null
|
||||||
{
|
{
|
||||||
public class NullUserAccountData : IUserAccountData
|
public class NullUserAccountData : IUserAccountData
|
||||||
{
|
{
|
||||||
private static Dictionary<UUID, UserAccountData> m_DataByUUID = new Dictionary<UUID, UserAccountData>();
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
private static Dictionary<string, UserAccountData> m_DataByName = new Dictionary<string, UserAccountData>();
|
|
||||||
private static Dictionary<string, UserAccountData> m_DataByEmail = new Dictionary<string, UserAccountData>();
|
private Dictionary<UUID, UserAccountData> m_DataByUUID = new Dictionary<UUID, UserAccountData>();
|
||||||
|
private Dictionary<string, UserAccountData> m_DataByName = new Dictionary<string, UserAccountData>();
|
||||||
|
private Dictionary<string, UserAccountData> m_DataByEmail = new Dictionary<string, UserAccountData>();
|
||||||
|
|
||||||
public NullUserAccountData(string connectionString, string realm)
|
public NullUserAccountData(string connectionString, string realm)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[NULL USER ACCOUNT DATA]: Initializing new NullUserAccountData with connectionString [{0}], realm [{1}]",
|
||||||
|
// connectionString, realm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -54,6 +62,15 @@ namespace OpenSim.Data.Null
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public UserAccountData[] Get(string[] fields, string[] values)
|
public UserAccountData[] Get(string[] fields, string[] values)
|
||||||
{
|
{
|
||||||
|
// if (m_log.IsDebugEnabled)
|
||||||
|
// {
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[NULL USER ACCOUNT DATA]: Called Get with fields [{0}], values [{1}]",
|
||||||
|
// string.Join(", ", fields), string.Join(", ", values));
|
||||||
|
// }
|
||||||
|
|
||||||
|
UserAccountData[] userAccounts = new UserAccountData[0];
|
||||||
|
|
||||||
List<string> fieldsLst = new List<string>(fields);
|
List<string> fieldsLst = new List<string>(fields);
|
||||||
if (fieldsLst.Contains("PrincipalID"))
|
if (fieldsLst.Contains("PrincipalID"))
|
||||||
{
|
{
|
||||||
|
@ -61,41 +78,61 @@ namespace OpenSim.Data.Null
|
||||||
UUID id = UUID.Zero;
|
UUID id = UUID.Zero;
|
||||||
if (UUID.TryParse(values[i], out id))
|
if (UUID.TryParse(values[i], out id))
|
||||||
if (m_DataByUUID.ContainsKey(id))
|
if (m_DataByUUID.ContainsKey(id))
|
||||||
return new UserAccountData[] { m_DataByUUID[id] };
|
userAccounts = new UserAccountData[] { m_DataByUUID[id] };
|
||||||
}
|
}
|
||||||
if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName"))
|
else if (fieldsLst.Contains("FirstName") && fieldsLst.Contains("LastName"))
|
||||||
{
|
{
|
||||||
int findex = fieldsLst.IndexOf("FirstName");
|
int findex = fieldsLst.IndexOf("FirstName");
|
||||||
int lindex = fieldsLst.IndexOf("LastName");
|
int lindex = fieldsLst.IndexOf("LastName");
|
||||||
if (m_DataByName.ContainsKey(values[findex] + " " + values[lindex]))
|
if (m_DataByName.ContainsKey(values[findex] + " " + values[lindex]))
|
||||||
return new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] };
|
{
|
||||||
}
|
userAccounts = new UserAccountData[] { m_DataByName[values[findex] + " " + values[lindex]] };
|
||||||
if (fieldsLst.Contains("Email"))
|
}
|
||||||
|
}
|
||||||
|
else if (fieldsLst.Contains("Email"))
|
||||||
{
|
{
|
||||||
int i = fieldsLst.IndexOf("Email");
|
int i = fieldsLst.IndexOf("Email");
|
||||||
if (m_DataByEmail.ContainsKey(values[i]))
|
if (m_DataByEmail.ContainsKey(values[i]))
|
||||||
return new UserAccountData[] { m_DataByEmail[values[i]] };
|
userAccounts = new UserAccountData[] { m_DataByEmail[values[i]] };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fail
|
// if (m_log.IsDebugEnabled)
|
||||||
return new UserAccountData[0];
|
// {
|
||||||
|
// StringBuilder sb = new StringBuilder();
|
||||||
|
// foreach (UserAccountData uad in userAccounts)
|
||||||
|
// sb.AppendFormat("({0} {1} {2}) ", uad.FirstName, uad.LastName, uad.PrincipalID);
|
||||||
|
//
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[NULL USER ACCOUNT DATA]: Returning {0} user accounts out of {1}: [{2}]", userAccounts.Length, m_DataByName.Count, sb);
|
||||||
|
// }
|
||||||
|
|
||||||
|
return userAccounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Store(UserAccountData data)
|
public bool Store(UserAccountData data)
|
||||||
{
|
{
|
||||||
if (data == null)
|
if (data == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"[NULL USER ACCOUNT DATA]: Storing user account {0} {1} {2} {3}",
|
||||||
|
data.FirstName, data.LastName, data.PrincipalID, this.GetHashCode());
|
||||||
|
|
||||||
m_DataByUUID[data.PrincipalID] = data;
|
m_DataByUUID[data.PrincipalID] = data;
|
||||||
m_DataByName[data.FirstName + " " + data.LastName] = data;
|
m_DataByName[data.FirstName + " " + data.LastName] = data;
|
||||||
if (data.Data.ContainsKey("Email") && data.Data["Email"] != null && data.Data["Email"] != string.Empty)
|
if (data.Data.ContainsKey("Email") && data.Data["Email"] != null && data.Data["Email"] != string.Empty)
|
||||||
m_DataByEmail[data.Data["Email"]] = data;
|
m_DataByEmail[data.Data["Email"]] = data;
|
||||||
|
|
||||||
|
// m_log.DebugFormat("m_DataByUUID count is {0}, m_DataByName count is {1}", m_DataByUUID.Count, m_DataByName.Count);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserAccountData[] GetUsers(UUID scopeID, string query)
|
public UserAccountData[] GetUsers(UUID scopeID, string query)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[NULL USER ACCOUNT DATA]: Called GetUsers with scope [{0}], query [{1}]", scopeID, query);
|
||||||
|
|
||||||
string[] words = query.Split(new char[] { ' ' });
|
string[] words = query.Split(new char[] { ' ' });
|
||||||
|
|
||||||
for (int i = 0; i < words.Length; i++)
|
for (int i = 0; i < words.Length; i++)
|
||||||
|
|
|
@ -35,10 +35,6 @@ using OpenSim.Framework;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
||||||
#if !NUNIT25
|
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// DBMS-specific:
|
// DBMS-specific:
|
||||||
using MySql.Data.MySqlClient;
|
using MySql.Data.MySqlClient;
|
||||||
using OpenSim.Data.MySQL;
|
using OpenSim.Data.MySQL;
|
||||||
|
@ -51,15 +47,6 @@ using OpenSim.Data.SQLite;
|
||||||
|
|
||||||
namespace OpenSim.Data.Tests
|
namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
|
|
||||||
#if NUNIT25
|
|
||||||
|
|
||||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLAssetData), Description="Basic Asset store tests (MySQL)")]
|
|
||||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLAssetData), Description = "Basic Asset store tests (MS SQL Server)")]
|
|
||||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteAssetData), Description = "Basic Asset store tests (SQLite)")]
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
[TestFixture(Description = "Asset store tests (SQLite)")]
|
[TestFixture(Description = "Asset store tests (SQLite)")]
|
||||||
public class SQLiteAssetTests : AssetTests<SqliteConnection, SQLiteAssetData>
|
public class SQLiteAssetTests : AssetTests<SqliteConnection, SQLiteAssetData>
|
||||||
{
|
{
|
||||||
|
@ -75,9 +62,6 @@ namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
public class AssetTests<TConn, TAssetData> : BasicDataServiceTest<TConn, TAssetData>
|
public class AssetTests<TConn, TAssetData> : BasicDataServiceTest<TConn, TAssetData>
|
||||||
where TConn : DbConnection, new()
|
where TConn : DbConnection, new()
|
||||||
where TAssetData : AssetDataBase, new()
|
where TAssetData : AssetDataBase, new()
|
||||||
|
@ -218,4 +202,4 @@ namespace OpenSim.Data.Tests
|
||||||
Assert.That(a3a, Constraints.PropertyCompareConstraint(a3));
|
Assert.That(a3a, Constraints.PropertyCompareConstraint(a3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
@ -49,15 +48,6 @@ using OpenSim.Data.SQLite;
|
||||||
|
|
||||||
namespace OpenSim.Data.Tests
|
namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
|
|
||||||
#if NUNIT25
|
|
||||||
|
|
||||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLEstateStore), Description = "Estate store tests (MySQL)")]
|
|
||||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLEstateStore), Description = "Estate store tests (MS SQL Server)")]
|
|
||||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteEstateStore), Description = "Estate store tests (SQLite)")]
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
[TestFixture(Description = "Estate store tests (SQLite)")]
|
[TestFixture(Description = "Estate store tests (SQLite)")]
|
||||||
public class SQLiteEstateTests : EstateTests<SqliteConnection, SQLiteEstateStore>
|
public class SQLiteEstateTests : EstateTests<SqliteConnection, SQLiteEstateStore>
|
||||||
{
|
{
|
||||||
|
@ -73,8 +63,6 @@ namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public class EstateTests<TConn, TEstateStore> : BasicDataServiceTest<TConn, TEstateStore>
|
public class EstateTests<TConn, TEstateStore> : BasicDataServiceTest<TConn, TEstateStore>
|
||||||
where TConn : DbConnection, new()
|
where TConn : DbConnection, new()
|
||||||
where TEstateStore : class, IEstateDataStore, new()
|
where TEstateStore : class, IEstateDataStore, new()
|
||||||
|
@ -520,6 +508,5 @@ namespace OpenSim.Data.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,12 +25,9 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// #define NUNIT25
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
@ -49,14 +46,6 @@ using OpenSim.Data.SQLite;
|
||||||
|
|
||||||
namespace OpenSim.Data.Tests
|
namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
#if NUNIT25
|
|
||||||
|
|
||||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteInventoryStore), Description = "Inventory store tests (SQLite)")]
|
|
||||||
[TestFixture(typeof(MySqlConnection), typeof(MySQLInventoryData), Description = "Inventory store tests (MySQL)")]
|
|
||||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLInventoryData), Description = "Inventory store tests (MS SQL Server)")]
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
[TestFixture(Description = "Inventory store tests (SQLite)")]
|
[TestFixture(Description = "Inventory store tests (SQLite)")]
|
||||||
public class SQLiteInventoryTests : InventoryTests<SqliteConnection, SQLiteInventoryStore>
|
public class SQLiteInventoryTests : InventoryTests<SqliteConnection, SQLiteInventoryStore>
|
||||||
{
|
{
|
||||||
|
@ -71,7 +60,6 @@ namespace OpenSim.Data.Tests
|
||||||
public class MSSQLInventoryTests : InventoryTests<SqlConnection, MSSQLInventoryData>
|
public class MSSQLInventoryTests : InventoryTests<SqlConnection, MSSQLInventoryData>
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
public class InventoryTests<TConn, TInvStore> : BasicDataServiceTest<TConn, TInvStore>
|
public class InventoryTests<TConn, TInvStore> : BasicDataServiceTest<TConn, TInvStore>
|
||||||
where TConn : DbConnection, new()
|
where TConn : DbConnection, new()
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Linq.Expressions;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.Constraints;
|
using NUnit.Framework.Constraints;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
||||||
|
|
|
@ -32,13 +32,11 @@ using System.Linq.Expressions;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
||||||
namespace OpenSim.Data.Tests
|
namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
|
|
||||||
//This is generic so that the lambda expressions will work right in IDEs.
|
//This is generic so that the lambda expressions will work right in IDEs.
|
||||||
public class PropertyScrambler<T>
|
public class PropertyScrambler<T>
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,6 @@ using System.Drawing;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
@ -52,14 +51,6 @@ using OpenSim.Data.SQLite;
|
||||||
|
|
||||||
namespace OpenSim.Data.Tests
|
namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
#if NUNIT25
|
|
||||||
|
|
||||||
[TestFixture(typeof(SqliteConnection), typeof(SQLiteRegionData), Description = "Region store tests (SQLite)")]
|
|
||||||
[TestFixture(typeof(MySqlConnection), typeof(MySqlRegionData), Description = "Region store tests (MySQL)")]
|
|
||||||
[TestFixture(typeof(SqlConnection), typeof(MSSQLRegionData), Description = "Region store tests (MS SQL Server)")]
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
[TestFixture(Description = "Region store tests (SQLite)")]
|
[TestFixture(Description = "Region store tests (SQLite)")]
|
||||||
public class SQLiteRegionTests : RegionTests<SqliteConnection, SQLiteSimulationData>
|
public class SQLiteRegionTests : RegionTests<SqliteConnection, SQLiteSimulationData>
|
||||||
{
|
{
|
||||||
|
@ -75,8 +66,6 @@ namespace OpenSim.Data.Tests
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
public class RegionTests<TConn, TRegStore> : BasicDataServiceTest<TConn, TRegStore>
|
public class RegionTests<TConn, TRegStore> : BasicDataServiceTest<TConn, TRegStore>
|
||||||
where TConn : DbConnection, new()
|
where TConn : DbConnection, new()
|
||||||
where TRegStore : class, ISimulationDataStore, new()
|
where TRegStore : class, ISimulationDataStore, new()
|
||||||
|
|
|
@ -250,7 +250,7 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
// m_log.DebugFormat("[SHAPE]: get m_textureEntry length {0}", m_textureEntry.Length);
|
||||||
try { return new Primitive.TextureEntry(m_textureEntry, 0, m_textureEntry.Length); }
|
try { return new Primitive.TextureEntry(m_textureEntry, 0, m_textureEntry.Length); }
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,8 @@ namespace OpenSim.Framework.Serialization
|
||||||
UserAccount account = userService.GetUserAccount(UUID.Zero, userId);
|
UserAccount account = userService.GetUserAccount(UUID.Zero, userId);
|
||||||
if (account != null)
|
if (account != null)
|
||||||
return MakeOspa(account.FirstName, account.LastName);
|
return MakeOspa(account.FirstName, account.LastName);
|
||||||
|
// else
|
||||||
|
// m_log.WarnFormat("[OSP RESOLVER]: No user account for {0}", userId);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -77,6 +79,8 @@ namespace OpenSim.Framework.Serialization
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string MakeOspa(string firstName, string lastName)
|
public static string MakeOspa(string firstName, string lastName)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[OSP RESOLVER]: Making OSPA for {0} {1}", firstName, lastName);
|
||||||
|
|
||||||
return
|
return
|
||||||
OSPA_PREFIX + OSPA_NAME_KEY + OSPA_PAIR_SEPARATOR + firstName + OSPA_NAME_VALUE_SEPARATOR + lastName;
|
OSPA_PREFIX + OSPA_NAME_KEY + OSPA_PAIR_SEPARATOR + firstName + OSPA_NAME_VALUE_SEPARATOR + lastName;
|
||||||
}
|
}
|
||||||
|
@ -97,7 +101,10 @@ namespace OpenSim.Framework.Serialization
|
||||||
public static UUID ResolveOspa(string ospa, IUserAccountService userService)
|
public static UUID ResolveOspa(string ospa, IUserAccountService userService)
|
||||||
{
|
{
|
||||||
if (!ospa.StartsWith(OSPA_PREFIX))
|
if (!ospa.StartsWith(OSPA_PREFIX))
|
||||||
return UUID.Zero;
|
{
|
||||||
|
// m_log.DebugFormat("[OSP RESOLVER]: ResolveOspa() got unrecognized format [{0}]", ospa);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
// m_log.DebugFormat("[OSP RESOLVER]: Resolving {0}", ospa);
|
// m_log.DebugFormat("[OSP RESOLVER]: Resolving {0}", ospa);
|
||||||
|
|
||||||
|
@ -161,7 +168,17 @@ namespace OpenSim.Framework.Serialization
|
||||||
|
|
||||||
UserAccount account = userService.GetUserAccount(UUID.Zero, firstName, lastName);
|
UserAccount account = userService.GetUserAccount(UUID.Zero, firstName, lastName);
|
||||||
if (account != null)
|
if (account != null)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[OSP RESOLVER]: Found user account with uuid {0} for {1} {2}",
|
||||||
|
// account.PrincipalID, firstName, lastName);
|
||||||
|
|
||||||
return account.PrincipalID;
|
return account.PrincipalID;
|
||||||
|
}
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// m_log.DebugFormat("[OSP RESOLVER]: No resolved OSPA user account for {0}", name);
|
||||||
|
// }
|
||||||
|
|
||||||
// XXX: Disable temporary user profile creation for now as implementation is incomplete - justincc
|
// XXX: Disable temporary user profile creation for now as implementation is incomplete - justincc
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Text;
|
||||||
using HttpServer;
|
using HttpServer;
|
||||||
using HttpServer.FormDecoders;
|
using HttpServer.FormDecoders;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
|
|
||||||
namespace OpenSim.Framework.Servers.Tests
|
namespace OpenSim.Framework.Servers.Tests
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -38,8 +37,6 @@ namespace OpenSim.Framework.Tests
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class PrimeNumberHelperTests
|
public class PrimeNumberHelperTests
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestGetPrime()
|
public void TestGetPrime()
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Tests.Common;
|
using OpenSim.Tests.Common;
|
||||||
|
|
||||||
|
|
|
@ -400,6 +400,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.UserAccountService);
|
UUID ospResolvedId = OspResolver.ResolveOspa(item.CreatorId, m_scene.UserAccountService);
|
||||||
if (UUID.Zero != ospResolvedId) // The user exists in this grid
|
if (UUID.Zero != ospResolvedId) // The user exists in this grid
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[INVENTORY ARCHIVER]: Found creator {0} via OSPA resolution", ospResolvedId);
|
||||||
|
|
||||||
item.CreatorIdAsUuid = ospResolvedId;
|
item.CreatorIdAsUuid = ospResolvedId;
|
||||||
|
|
||||||
// XXX: For now, don't preserve the OSPA in the creator id (which actually gets persisted to the
|
// XXX: For now, don't preserve the OSPA in the creator id (which actually gets persisted to the
|
||||||
|
|
|
@ -109,9 +109,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
|
|
||||||
scene.AddCommand(
|
scene.AddCommand(
|
||||||
this, "load iar",
|
this, "load iar",
|
||||||
"load iar [--merge] <first> <last> <inventory path> <password> [<IAR path>]",
|
"load iar [-m|--merge] <first> <last> <inventory path> <password> [<IAR path>]",
|
||||||
"Load user inventory archive (IAR).",
|
"Load user inventory archive (IAR).",
|
||||||
"--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones"
|
"-m|--merge is an option which merges the loaded IAR with existing inventory folders where possible, rather than always creating new ones"
|
||||||
+ "<first> is user's first name." + Environment.NewLine
|
+ "<first> is user's first name." + Environment.NewLine
|
||||||
+ "<last> is user's last name." + Environment.NewLine
|
+ "<last> is user's last name." + Environment.NewLine
|
||||||
+ "<inventory path> is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine
|
+ "<inventory path> is the path inside the user's inventory where the IAR should be loaded." + Environment.NewLine
|
||||||
|
@ -181,7 +181,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
catch (EntryPointNotFoundException e)
|
catch (EntryPointNotFoundException e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
||||||
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
||||||
m_log.Error(e);
|
m_log.Error(e);
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
catch (EntryPointNotFoundException e)
|
catch (EntryPointNotFoundException e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
||||||
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
||||||
m_log.Error(e);
|
m_log.Error(e);
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
catch (EntryPointNotFoundException e)
|
catch (EntryPointNotFoundException e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
||||||
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
||||||
m_log.Error(e);
|
m_log.Error(e);
|
||||||
|
|
||||||
|
@ -317,7 +317,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
catch (EntryPointNotFoundException e)
|
catch (EntryPointNotFoundException e)
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
"[INVENTORY ARCHIVER]: Mismatch between Mono and zlib1g library version when trying to create compression stream."
|
||||||
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
+ "If you've manually installed Mono, have you appropriately updated zlib1g as well?");
|
||||||
m_log.Error(e);
|
m_log.Error(e);
|
||||||
|
|
||||||
|
@ -358,7 +358,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver
|
||||||
if (mainParams.Count < 6)
|
if (mainParams.Count < 6)
|
||||||
{
|
{
|
||||||
m_log.Error(
|
m_log.Error(
|
||||||
"[INVENTORY ARCHIVER]: usage is load iar [--merge] <first name> <last name> <inventory path> <user password> [<load file path>]");
|
"[INVENTORY ARCHIVER]: usage is load iar [-m|--merge] <first name> <last name> <inventory path> <user password> [<load file path>]");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Data;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Serialization;
|
||||||
|
using OpenSim.Framework.Serialization.External;
|
||||||
|
using OpenSim.Framework.Communications;
|
||||||
|
using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
|
||||||
|
using OpenSim.Region.CoreModules.World.Serialiser;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
using OpenSim.Tests.Common.Setup;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class InventoryArchiveTestCase
|
||||||
|
{
|
||||||
|
protected ManualResetEvent mre = new ManualResetEvent(false);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A raw array of bytes that we'll use to create an IAR memory stream suitable for isolated use in each test.
|
||||||
|
/// </summary>
|
||||||
|
protected byte[] m_iarStreamBytes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Stream of data representing a common IAR for load tests.
|
||||||
|
/// </summary>
|
||||||
|
protected MemoryStream m_iarStream;
|
||||||
|
|
||||||
|
protected UserAccount m_ua1
|
||||||
|
= new UserAccount {
|
||||||
|
PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000555"),
|
||||||
|
FirstName = "Mr",
|
||||||
|
LastName = "Tiddles" };
|
||||||
|
protected UserAccount m_ua2
|
||||||
|
= new UserAccount {
|
||||||
|
PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000666"),
|
||||||
|
FirstName = "Lord",
|
||||||
|
LastName = "Lucan" };
|
||||||
|
protected UserAccount m_ua3
|
||||||
|
= new UserAccount {
|
||||||
|
PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000777"),
|
||||||
|
FirstName = "Lord",
|
||||||
|
LastName = "Lucan" };
|
||||||
|
protected string m_item1Name = "Ray Gun Item";
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
m_iarStream = new MemoryStream(m_iarStreamBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestFixtureSetUp]
|
||||||
|
public void FixtureSetup()
|
||||||
|
{
|
||||||
|
ConstructDefaultIarBytesForTestLoad();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void ConstructDefaultIarBytesForTestLoad()
|
||||||
|
{
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire");
|
||||||
|
|
||||||
|
MemoryStream archiveWriteStream = new MemoryStream();
|
||||||
|
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
||||||
|
|
||||||
|
// Create asset
|
||||||
|
SceneObjectGroup object1;
|
||||||
|
SceneObjectPart part1;
|
||||||
|
{
|
||||||
|
string partName = "Ray Gun Object";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
||||||
|
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object1 = new SceneObjectGroup(part1);
|
||||||
|
scene.AddNewSceneObject(object1, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||||
|
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
||||||
|
scene.AssetService.Store(asset1);
|
||||||
|
|
||||||
|
// Create item
|
||||||
|
InventoryItemBase item1 = new InventoryItemBase();
|
||||||
|
item1.Name = m_item1Name;
|
||||||
|
item1.AssetID = asset1.FullID;
|
||||||
|
item1.GroupID = UUID.Random();
|
||||||
|
item1.CreatorIdAsUuid = m_ua2.PrincipalID;
|
||||||
|
item1.Owner = UUID.Zero;
|
||||||
|
|
||||||
|
string archiveItem1Name = InventoryArchiveWriteRequest.CreateArchiveItemName(m_item1Name, UUID.Random());
|
||||||
|
string archiveItem1Path = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItem1Name);
|
||||||
|
tar.WriteFile(
|
||||||
|
archiveItem1Path,
|
||||||
|
UserInventoryItemSerializer.Serialize(
|
||||||
|
item1, new Dictionary<string, object>(), scene.UserAccountService));
|
||||||
|
tar.Close();
|
||||||
|
|
||||||
|
m_iarStreamBytes = archiveWriteStream.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void SaveCompleted(
|
||||||
|
Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream,
|
||||||
|
Exception reportedException)
|
||||||
|
{
|
||||||
|
mre.Set();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,7 +31,6 @@ using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Data;
|
using OpenSim.Data;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -50,184 +49,8 @@ using OpenSim.Tests.Common.Setup;
|
||||||
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class InventoryArchiverTests
|
public class InventoryArchiverTests : InventoryArchiveTestCase
|
||||||
{
|
{
|
||||||
protected ManualResetEvent mre = new ManualResetEvent(false);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Stream of data representing a common IAR that can be reused in load tests.
|
|
||||||
/// </summary>
|
|
||||||
protected MemoryStream m_iarStream;
|
|
||||||
|
|
||||||
protected UserAccount m_ua1
|
|
||||||
= new UserAccount {
|
|
||||||
PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000555"),
|
|
||||||
FirstName = "Mr",
|
|
||||||
LastName = "Tiddles" };
|
|
||||||
protected UserAccount m_ua2
|
|
||||||
= new UserAccount {
|
|
||||||
PrincipalID = UUID.Parse("00000000-0000-0000-0000-000000000666"),
|
|
||||||
FirstName = "Lord",
|
|
||||||
LastName = "Lucan" };
|
|
||||||
string m_item1Name = "b.lsl";
|
|
||||||
|
|
||||||
private void SaveCompleted(
|
|
||||||
Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream,
|
|
||||||
Exception reportedException)
|
|
||||||
{
|
|
||||||
mre.Set();
|
|
||||||
}
|
|
||||||
|
|
||||||
[SetUp]
|
|
||||||
public void Init()
|
|
||||||
{
|
|
||||||
ConstructDefaultIarForTestLoad();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void ConstructDefaultIarForTestLoad()
|
|
||||||
{
|
|
||||||
string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(m_item1Name, UUID.Random());
|
|
||||||
|
|
||||||
MemoryStream archiveWriteStream = new MemoryStream();
|
|
||||||
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
|
||||||
|
|
||||||
InventoryItemBase item1 = new InventoryItemBase();
|
|
||||||
item1.Name = m_item1Name;
|
|
||||||
item1.AssetID = UUID.Random();
|
|
||||||
item1.GroupID = UUID.Random();
|
|
||||||
//item1.CreatorId = OspResolver.MakeOspa(m_ua2.FirstName, m_ua2.LastName);
|
|
||||||
//item1.CreatorId = userUuid.ToString();
|
|
||||||
item1.CreatorId = m_ua2.PrincipalID.ToString();
|
|
||||||
item1.Owner = UUID.Zero;
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire");
|
|
||||||
|
|
||||||
string item1FileName
|
|
||||||
= string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
|
|
||||||
tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1, new Dictionary<string, object>(), scene.UserAccountService));
|
|
||||||
tar.Close();
|
|
||||||
m_iarStream = new MemoryStream(archiveWriteStream.ToArray());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test saving an inventory path to a V0.1 OpenSim Inventory Archive
|
|
||||||
/// (subject to change since there is no fixed format yet).
|
|
||||||
/// </summary>
|
|
||||||
[Test]
|
|
||||||
public void TestSavePathToIarV0_1()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
|
|
||||||
|
|
||||||
// Create user
|
|
||||||
string userFirstName = "Jock";
|
|
||||||
string userLastName = "Stirrup";
|
|
||||||
string userPassword = "troll";
|
|
||||||
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword);
|
|
||||||
|
|
||||||
// Create asset
|
|
||||||
SceneObjectGroup object1;
|
|
||||||
SceneObjectPart part1;
|
|
||||||
{
|
|
||||||
string partName = "My Little Dog Object";
|
|
||||||
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
|
||||||
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
|
||||||
Vector3 groupPosition = new Vector3(10, 20, 30);
|
|
||||||
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
|
||||||
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
|
||||||
|
|
||||||
part1
|
|
||||||
= new SceneObjectPart(
|
|
||||||
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
|
||||||
part1.Name = partName;
|
|
||||||
|
|
||||||
object1 = new SceneObjectGroup(part1);
|
|
||||||
scene.AddNewSceneObject(object1, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
|
||||||
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
|
||||||
scene.AssetService.Store(asset1);
|
|
||||||
|
|
||||||
// Create item
|
|
||||||
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
|
||||||
InventoryItemBase item1 = new InventoryItemBase();
|
|
||||||
item1.Name = "My Little Dog";
|
|
||||||
item1.AssetID = asset1.FullID;
|
|
||||||
item1.ID = item1Id;
|
|
||||||
InventoryFolderBase objsFolder
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects")[0];
|
|
||||||
item1.Folder = objsFolder.ID;
|
|
||||||
scene.AddInventoryItem(item1);
|
|
||||||
|
|
||||||
MemoryStream archiveWriteStream = new MemoryStream();
|
|
||||||
archiverModule.OnInventoryArchiveSaved += SaveCompleted;
|
|
||||||
|
|
||||||
// Test saving a particular path
|
|
||||||
mre.Reset();
|
|
||||||
archiverModule.ArchiveInventory(
|
|
||||||
Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream);
|
|
||||||
mre.WaitOne(60000, false);
|
|
||||||
|
|
||||||
byte[] archive = archiveWriteStream.ToArray();
|
|
||||||
MemoryStream archiveReadStream = new MemoryStream(archive);
|
|
||||||
TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
|
|
||||||
|
|
||||||
//bool gotControlFile = false;
|
|
||||||
bool gotObject1File = false;
|
|
||||||
//bool gotObject2File = false;
|
|
||||||
string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1);
|
|
||||||
string expectedObject1FilePath = string.Format(
|
|
||||||
"{0}{1}{2}",
|
|
||||||
ArchiveConstants.INVENTORY_PATH,
|
|
||||||
InventoryArchiveWriteRequest.CreateArchiveFolderName(objsFolder),
|
|
||||||
expectedObject1FileName);
|
|
||||||
|
|
||||||
string filePath;
|
|
||||||
TarArchiveReader.TarEntryType tarEntryType;
|
|
||||||
|
|
||||||
// Console.WriteLine("Reading archive");
|
|
||||||
|
|
||||||
while (tar.ReadEntry(out filePath, out tarEntryType) != null)
|
|
||||||
{
|
|
||||||
// Console.WriteLine("Got {0}", filePath);
|
|
||||||
|
|
||||||
// if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
|
|
||||||
// {
|
|
||||||
// gotControlFile = true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
|
|
||||||
{
|
|
||||||
// string fileName = filePath.Remove(0, "Objects/".Length);
|
|
||||||
//
|
|
||||||
// if (fileName.StartsWith(part1.Name))
|
|
||||||
// {
|
|
||||||
Assert.That(expectedObject1FilePath, Is.EqualTo(filePath));
|
|
||||||
gotObject1File = true;
|
|
||||||
// }
|
|
||||||
// else if (fileName.StartsWith(part2.Name))
|
|
||||||
// {
|
|
||||||
// Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
|
|
||||||
// gotObject2File = true;
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Assert.That(gotControlFile, Is.True, "No control file in archive");
|
|
||||||
Assert.That(gotObject1File, Is.True, "No item1 file in archive");
|
|
||||||
// Assert.That(gotObject2File, Is.True, "No object2 file in archive");
|
|
||||||
|
|
||||||
// TODO: Test presence of more files and contents of files.
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Test saving a single inventory item to a V0.1 OpenSim Inventory Archive
|
/// Test saving a single inventory item to a V0.1 OpenSim Inventory Archive
|
||||||
/// (subject to change since there is no fixed format yet).
|
/// (subject to change since there is no fixed format yet).
|
||||||
|
@ -346,41 +169,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Test that things work when the load path specified starts with a slash
|
/// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
|
||||||
|
/// an account exists with the same name as the creator, though not the same id.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public void TestLoadIarPathStartsWithSlash()
|
public void TestLoadIarV0_1SameNameCreator()
|
||||||
{
|
{
|
||||||
TestHelper.InMethod();
|
TestHelper.InMethod();
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
SerialiserModule serialiserModule = new SerialiserModule();
|
|
||||||
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
|
||||||
|
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "password");
|
|
||||||
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/Objects", "password", m_iarStream);
|
|
||||||
|
|
||||||
InventoryItemBase foundItem1
|
|
||||||
= InventoryArchiveUtils.FindItemByPath(
|
|
||||||
scene.InventoryService, m_ua1.PrincipalID, "/Objects/" + m_item1Name);
|
|
||||||
|
|
||||||
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1 in TestLoadIarFolderStartsWithSlash()");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
|
|
||||||
/// an account exists with the creator name.
|
|
||||||
/// </summary>
|
|
||||||
///
|
|
||||||
/// This test also does some deeper probing of loading into nested inventory structures
|
|
||||||
[Test]
|
|
||||||
public void TestLoadIarV0_1ExistingUsers()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
//log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
SerialiserModule serialiserModule = new SerialiserModule();
|
SerialiserModule serialiserModule = new SerialiserModule();
|
||||||
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
|
||||||
|
@ -390,14 +187,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
||||||
|
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "meowfood");
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "meowfood");
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire");
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua3, "hampshire");
|
||||||
|
|
||||||
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/", "meowfood", m_iarStream);
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/", "meowfood", m_iarStream);
|
||||||
|
|
||||||
InventoryItemBase foundItem1
|
InventoryItemBase foundItem1
|
||||||
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, m_item1Name);
|
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, m_item1Name);
|
||||||
|
|
||||||
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
|
||||||
|
|
||||||
// We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the
|
// We have to disable this check since loaded items that did find users via OSPA resolution are now only storing the
|
||||||
// UUID, not the OSPA itself.
|
// UUID, not the OSPA itself.
|
||||||
|
@ -405,415 +199,43 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
// foundItem1.CreatorId, Is.EqualTo(item1.CreatorId),
|
// foundItem1.CreatorId, Is.EqualTo(item1.CreatorId),
|
||||||
// "Loaded item non-uuid creator doesn't match original");
|
// "Loaded item non-uuid creator doesn't match original");
|
||||||
Assert.That(
|
Assert.That(
|
||||||
foundItem1.CreatorId, Is.EqualTo(m_ua2.PrincipalID.ToString()),
|
foundItem1.CreatorId, Is.EqualTo(m_ua3.PrincipalID.ToString()),
|
||||||
"Loaded item non-uuid creator doesn't match original");
|
"Loaded item non-uuid creator doesn't match original");
|
||||||
|
|
||||||
Assert.That(
|
Assert.That(
|
||||||
foundItem1.CreatorIdAsUuid, Is.EqualTo(m_ua2.PrincipalID),
|
foundItem1.CreatorIdAsUuid, Is.EqualTo(m_ua3.PrincipalID),
|
||||||
"Loaded item uuid creator doesn't match original");
|
"Loaded item uuid creator doesn't match original");
|
||||||
Assert.That(foundItem1.Owner, Is.EqualTo(m_ua1.PrincipalID),
|
Assert.That(foundItem1.Owner, Is.EqualTo(m_ua1.PrincipalID),
|
||||||
"Loaded item owner doesn't match inventory reciever");
|
"Loaded item owner doesn't match inventory reciever");
|
||||||
|
|
||||||
// Now try loading to a root child folder
|
|
||||||
UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, m_ua1.PrincipalID, "xA");
|
|
||||||
MemoryStream archiveReadStream = new MemoryStream(m_iarStream.ToArray());
|
|
||||||
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "xA", "meowfood", archiveReadStream);
|
|
||||||
|
|
||||||
InventoryItemBase foundItem2
|
|
||||||
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, "xA/" + m_item1Name);
|
|
||||||
Assert.That(foundItem2, Is.Not.Null, "Didn't find loaded item 2");
|
|
||||||
|
|
||||||
// Now try loading to a more deeply nested folder
|
|
||||||
UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, m_ua1.PrincipalID, "xB/xC");
|
|
||||||
archiveReadStream = new MemoryStream(archiveReadStream.ToArray());
|
|
||||||
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "xB/xC", "meowfood", archiveReadStream);
|
|
||||||
|
|
||||||
InventoryItemBase foundItem3
|
|
||||||
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, "xB/xC/" + m_item1Name);
|
|
||||||
Assert.That(foundItem3, Is.Not.Null, "Didn't find loaded item 3");
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void TestIarV0_1WithEscapedChars()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
string itemName = "You & you are a mean/man/";
|
|
||||||
string humanEscapedItemName = @"You & you are a mean\/man\/";
|
|
||||||
string userPassword = "meowfood";
|
|
||||||
|
|
||||||
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
|
|
||||||
|
|
||||||
// Create user
|
|
||||||
string userFirstName = "Jock";
|
|
||||||
string userLastName = "Stirrup";
|
|
||||||
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "meowfood");
|
|
||||||
|
|
||||||
// Create asset
|
|
||||||
SceneObjectGroup object1;
|
|
||||||
SceneObjectPart part1;
|
|
||||||
{
|
|
||||||
string partName = "part name";
|
|
||||||
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
|
||||||
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
|
||||||
Vector3 groupPosition = new Vector3(10, 20, 30);
|
|
||||||
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
|
||||||
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
|
||||||
|
|
||||||
part1
|
|
||||||
= new SceneObjectPart(
|
|
||||||
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
|
||||||
part1.Name = partName;
|
|
||||||
|
|
||||||
object1 = new SceneObjectGroup(part1);
|
|
||||||
scene.AddNewSceneObject(object1, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
|
||||||
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
|
||||||
scene.AssetService.Store(asset1);
|
|
||||||
|
|
||||||
// Create item
|
|
||||||
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
|
||||||
InventoryItemBase item1 = new InventoryItemBase();
|
|
||||||
item1.Name = itemName;
|
|
||||||
item1.AssetID = asset1.FullID;
|
|
||||||
item1.ID = item1Id;
|
|
||||||
InventoryFolderBase objsFolder
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects")[0];
|
|
||||||
item1.Folder = objsFolder.ID;
|
|
||||||
scene.AddInventoryItem(item1);
|
|
||||||
|
|
||||||
MemoryStream archiveWriteStream = new MemoryStream();
|
|
||||||
archiverModule.OnInventoryArchiveSaved += SaveCompleted;
|
|
||||||
|
|
||||||
mre.Reset();
|
|
||||||
archiverModule.ArchiveInventory(
|
|
||||||
Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream);
|
|
||||||
mre.WaitOne(60000, false);
|
|
||||||
|
|
||||||
// LOAD ITEM
|
|
||||||
MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
|
||||||
|
|
||||||
archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream);
|
|
||||||
|
|
||||||
InventoryItemBase foundItem1
|
|
||||||
= InventoryArchiveUtils.FindItemByPath(
|
|
||||||
scene.InventoryService, userId, "Scripts/Objects/" + humanEscapedItemName);
|
|
||||||
|
|
||||||
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
|
||||||
// Assert.That(
|
|
||||||
// foundItem1.CreatorId, Is.EqualTo(userUuid),
|
|
||||||
// "Loaded item non-uuid creator doesn't match that of the loading user");
|
|
||||||
Assert.That(
|
|
||||||
foundItem1.Name, Is.EqualTo(itemName),
|
|
||||||
"Loaded item name doesn't match saved name");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
|
/// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
|
||||||
/// embedded creators do not exist in the system
|
/// the creator or an account with the creator's name does not exist within the system.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
///
|
|
||||||
/// This may possibly one day get overtaken by the as yet incomplete temporary profiles feature
|
|
||||||
/// (as tested in the a later commented out test)
|
|
||||||
/// This test is currently disabled
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestLoadIarV0_1AbsentUsers()
|
public void TestLoadIarV0_1AbsentCreator()
|
||||||
{
|
{
|
||||||
TestHelper.InMethod();
|
TestHelper.InMethod();
|
||||||
//log4net.Config.XmlConfigurator.Configure();
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
string userFirstName = "Charlie";
|
|
||||||
string userLastName = "Chan";
|
|
||||||
UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000999");
|
|
||||||
string userItemCreatorFirstName = "Bat";
|
|
||||||
string userItemCreatorLastName = "Man";
|
|
||||||
//UUID userItemCreatorUuid = UUID.Parse("00000000-0000-0000-0000-000000008888");
|
|
||||||
|
|
||||||
string itemName = "b.lsl";
|
|
||||||
string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random());
|
|
||||||
|
|
||||||
MemoryStream archiveWriteStream = new MemoryStream();
|
|
||||||
TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
|
||||||
|
|
||||||
InventoryItemBase item1 = new InventoryItemBase();
|
|
||||||
item1.Name = itemName;
|
|
||||||
item1.AssetID = UUID.Random();
|
|
||||||
item1.GroupID = UUID.Random();
|
|
||||||
item1.CreatorId = OspResolver.MakeOspa(userItemCreatorFirstName, userItemCreatorLastName);
|
|
||||||
//item1.CreatorId = userUuid.ToString();
|
|
||||||
//item1.CreatorId = "00000000-0000-0000-0000-000000000444";
|
|
||||||
item1.Owner = UUID.Zero;
|
|
||||||
|
|
||||||
string item1FileName
|
|
||||||
= string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
|
|
||||||
tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1, new Dictionary<string,object>(), null));
|
|
||||||
tar.Close();
|
|
||||||
|
|
||||||
MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
|
||||||
SerialiserModule serialiserModule = new SerialiserModule();
|
SerialiserModule serialiserModule = new SerialiserModule();
|
||||||
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
|
||||||
// Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
||||||
UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userUuid, "meowfood");
|
|
||||||
|
|
||||||
archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "meowfood", archiveReadStream);
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "password");
|
||||||
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/", "password", m_iarStream);
|
||||||
|
|
||||||
InventoryItemBase foundItem1
|
InventoryItemBase foundItem1
|
||||||
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, userUuid, itemName);
|
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, m_item1Name);
|
||||||
|
|
||||||
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
||||||
// Assert.That(
|
// Assert.That(
|
||||||
// foundItem1.CreatorId, Is.EqualTo(userUuid),
|
// foundItem1.CreatorId, Is.EqualTo(userUuid),
|
||||||
// "Loaded item non-uuid creator doesn't match that of the loading user");
|
// "Loaded item non-uuid creator doesn't match that of the loading user");
|
||||||
Assert.That(
|
Assert.That(
|
||||||
foundItem1.CreatorIdAsUuid, Is.EqualTo(userUuid),
|
foundItem1.CreatorIdAsUuid, Is.EqualTo(m_ua1.PrincipalID),
|
||||||
"Loaded item uuid creator doesn't match that of the loading user");
|
"Loaded item uuid creator doesn't match that of the loading user");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test loading a V0.1 OpenSim Inventory Archive (subject to change since there is no fixed format yet) where
|
|
||||||
/// no account exists with the creator name
|
|
||||||
/// </summary>
|
|
||||||
/// Disabled since temporary profiles have not yet been implemented.
|
|
||||||
///
|
|
||||||
//[Test]
|
|
||||||
//public void TestLoadIarV0_1TempProfiles()
|
|
||||||
//{
|
|
||||||
// TestHelper.InMethod();
|
|
||||||
|
|
||||||
// //log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
// string userFirstName = "Dennis";
|
|
||||||
// string userLastName = "Menace";
|
|
||||||
// UUID userUuid = UUID.Parse("00000000-0000-0000-0000-000000000aaa");
|
|
||||||
// string user2FirstName = "Walter";
|
|
||||||
// string user2LastName = "Mitty";
|
|
||||||
|
|
||||||
// string itemName = "b.lsl";
|
|
||||||
// string archiveItemName = InventoryArchiveWriteRequest.CreateArchiveItemName(itemName, UUID.Random());
|
|
||||||
|
|
||||||
// MemoryStream archiveWriteStream = new MemoryStream();
|
|
||||||
// TarArchiveWriter tar = new TarArchiveWriter(archiveWriteStream);
|
|
||||||
|
|
||||||
// InventoryItemBase item1 = new InventoryItemBase();
|
|
||||||
// item1.Name = itemName;
|
|
||||||
// item1.AssetID = UUID.Random();
|
|
||||||
// item1.GroupID = UUID.Random();
|
|
||||||
// item1.CreatorId = OspResolver.MakeOspa(user2FirstName, user2LastName);
|
|
||||||
// item1.Owner = UUID.Zero;
|
|
||||||
|
|
||||||
// string item1FileName
|
|
||||||
// = string.Format("{0}{1}", ArchiveConstants.INVENTORY_PATH, archiveItemName);
|
|
||||||
// tar.WriteFile(item1FileName, UserInventoryItemSerializer.Serialize(item1));
|
|
||||||
// tar.Close();
|
|
||||||
|
|
||||||
// MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
|
||||||
// SerialiserModule serialiserModule = new SerialiserModule();
|
|
||||||
// InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
|
||||||
|
|
||||||
// // Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
|
|
||||||
// Scene scene = SceneSetupHelpers.SetupScene();
|
|
||||||
// IUserAdminService userAdminService = scene.CommsManager.UserAdminService;
|
|
||||||
|
|
||||||
// SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
|
||||||
// userAdminService.AddUser(
|
|
||||||
// userFirstName, userLastName, "meowfood", String.Empty, 1000, 1000, userUuid);
|
|
||||||
|
|
||||||
// archiverModule.DearchiveInventory(userFirstName, userLastName, "/", "troll", archiveReadStream);
|
|
||||||
|
|
||||||
// // Check that a suitable temporary user profile has been created.
|
|
||||||
// UserProfileData user2Profile
|
|
||||||
// = scene.CommsManager.UserService.GetUserProfile(
|
|
||||||
// OspResolver.HashName(user2FirstName + " " + user2LastName));
|
|
||||||
// Assert.That(user2Profile, Is.Not.Null);
|
|
||||||
// Assert.That(user2Profile.FirstName == user2FirstName);
|
|
||||||
// Assert.That(user2Profile.SurName == user2LastName);
|
|
||||||
|
|
||||||
// CachedUserInfo userInfo
|
|
||||||
// = scene.CommsManager.UserProfileCacheService.GetUserDetails(userFirstName, userLastName);
|
|
||||||
// userInfo.OnInventoryReceived += InventoryReceived;
|
|
||||||
|
|
||||||
// lock (this)
|
|
||||||
// {
|
|
||||||
// userInfo.FetchInventory();
|
|
||||||
// Monitor.Wait(this, 60000);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// InventoryItemBase foundItem = userInfo.RootFolder.FindItemByPath(itemName);
|
|
||||||
|
|
||||||
// Assert.That(foundItem.CreatorId, Is.EqualTo(item1.CreatorId));
|
|
||||||
// Assert.That(
|
|
||||||
// foundItem.CreatorIdAsUuid, Is.EqualTo(OspResolver.HashName(user2FirstName + " " + user2LastName)));
|
|
||||||
// Assert.That(foundItem.Owner, Is.EqualTo(userUuid));
|
|
||||||
|
|
||||||
// Console.WriteLine("### Successfully completed {0} ###", MethodBase.GetCurrentMethod());
|
|
||||||
//}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test replication of an archive path to the user's inventory.
|
|
||||||
/// </summary>
|
|
||||||
[Test]
|
|
||||||
public void TestNewIarPath()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
|
||||||
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
|
||||||
|
|
||||||
Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>();
|
|
||||||
HashSet<InventoryNodeBase> nodesLoaded = new HashSet<InventoryNodeBase>();
|
|
||||||
|
|
||||||
string folder1Name = "1";
|
|
||||||
string folder2aName = "2a";
|
|
||||||
string folder2bName = "2b";
|
|
||||||
|
|
||||||
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1Name, UUID.Random());
|
|
||||||
string folder2aArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2aName, UUID.Random());
|
|
||||||
string folder2bArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2bName, UUID.Random());
|
|
||||||
|
|
||||||
string iarPath1 = string.Join("", new string[] { folder1ArchiveName, folder2aArchiveName });
|
|
||||||
string iarPath2 = string.Join("", new string[] { folder1ArchiveName, folder2bArchiveName });
|
|
||||||
|
|
||||||
{
|
|
||||||
// Test replication of path1
|
|
||||||
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
|
||||||
.ReplicateArchivePathToUserInventory(
|
|
||||||
iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
|
||||||
foldersCreated, nodesLoaded);
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder1Candidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1Name);
|
|
||||||
Assert.That(folder1Candidates.Count, Is.EqualTo(1));
|
|
||||||
|
|
||||||
InventoryFolderBase folder1 = folder1Candidates[0];
|
|
||||||
List<InventoryFolderBase> folder2aCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName);
|
|
||||||
Assert.That(folder2aCandidates.Count, Is.EqualTo(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
// Test replication of path2
|
|
||||||
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
|
||||||
.ReplicateArchivePathToUserInventory(
|
|
||||||
iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
|
||||||
foldersCreated, nodesLoaded);
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder1Candidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1Name);
|
|
||||||
Assert.That(folder1Candidates.Count, Is.EqualTo(1));
|
|
||||||
|
|
||||||
InventoryFolderBase folder1 = folder1Candidates[0];
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder2aCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName);
|
|
||||||
Assert.That(folder2aCandidates.Count, Is.EqualTo(1));
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder2bCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2bName);
|
|
||||||
Assert.That(folder2bCandidates.Count, Is.EqualTo(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test replication of a partly existing archive path to the user's inventory. This should create
|
|
||||||
/// a duplicate path without the merge option.
|
|
||||||
/// </summary>
|
|
||||||
[Test]
|
|
||||||
public void TestPartExistingIarPath()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
//log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
|
||||||
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
|
||||||
|
|
||||||
string folder1ExistingName = "a";
|
|
||||||
string folder2Name = "b";
|
|
||||||
|
|
||||||
InventoryFolderBase folder1
|
|
||||||
= UserInventoryTestUtils.CreateInventoryFolder(
|
|
||||||
scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
|
||||||
|
|
||||||
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random());
|
|
||||||
string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
|
|
||||||
|
|
||||||
string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
|
|
||||||
|
|
||||||
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
|
||||||
.ReplicateArchivePathToUserInventory(
|
|
||||||
itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
|
||||||
new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder1PostCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
|
||||||
Assert.That(folder1PostCandidates.Count, Is.EqualTo(2));
|
|
||||||
|
|
||||||
// FIXME: Temporarily, we're going to do something messy to make sure we pick up the created folder.
|
|
||||||
InventoryFolderBase folder1Post = null;
|
|
||||||
foreach (InventoryFolderBase folder in folder1PostCandidates)
|
|
||||||
{
|
|
||||||
if (folder.ID != folder1.ID)
|
|
||||||
{
|
|
||||||
folder1Post = folder;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Assert.That(folder1Post.ID, Is.EqualTo(folder1.ID));
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder2PostCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1Post, "b");
|
|
||||||
Assert.That(folder2PostCandidates.Count, Is.EqualTo(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Test replication of a partly existing archive path to the user's inventory. This should create
|
|
||||||
/// a merged path.
|
|
||||||
/// </summary>
|
|
||||||
[Test]
|
|
||||||
public void TestMergeIarPath()
|
|
||||||
{
|
|
||||||
TestHelper.InMethod();
|
|
||||||
// log4net.Config.XmlConfigurator.Configure();
|
|
||||||
|
|
||||||
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
|
||||||
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
|
||||||
|
|
||||||
string folder1ExistingName = "a";
|
|
||||||
string folder2Name = "b";
|
|
||||||
|
|
||||||
InventoryFolderBase folder1
|
|
||||||
= UserInventoryTestUtils.CreateInventoryFolder(
|
|
||||||
scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
|
||||||
|
|
||||||
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random());
|
|
||||||
string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
|
|
||||||
|
|
||||||
string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
|
|
||||||
|
|
||||||
new InventoryArchiveReadRequest(scene, ua1, folder1ExistingName, (Stream)null, true)
|
|
||||||
.ReplicateArchivePathToUserInventory(
|
|
||||||
itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
|
||||||
new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder1PostCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
|
||||||
Assert.That(folder1PostCandidates.Count, Is.EqualTo(1));
|
|
||||||
Assert.That(folder1PostCandidates[0].ID, Is.EqualTo(folder1.ID));
|
|
||||||
|
|
||||||
List<InventoryFolderBase> folder2PostCandidates
|
|
||||||
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1PostCandidates[0], "b");
|
|
||||||
Assert.That(folder2PostCandidates.Count, Is.EqualTo(1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,480 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Data;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Serialization;
|
||||||
|
using OpenSim.Framework.Serialization.External;
|
||||||
|
using OpenSim.Framework.Communications;
|
||||||
|
using OpenSim.Region.CoreModules.Avatar.Inventory.Archiver;
|
||||||
|
using OpenSim.Region.CoreModules.World.Serialiser;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
using OpenSim.Tests.Common.Setup;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Avatar.Inventory.Archiver.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class PathTests : InventoryArchiveTestCase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Test saving an inventory path to a V0.1 OpenSim Inventory Archive
|
||||||
|
/// (subject to change since there is no fixed format yet).
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestSavePathToIarV0_1()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
|
||||||
|
|
||||||
|
// Create user
|
||||||
|
string userFirstName = "Jock";
|
||||||
|
string userLastName = "Stirrup";
|
||||||
|
string userPassword = "troll";
|
||||||
|
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, userPassword);
|
||||||
|
|
||||||
|
// Create asset
|
||||||
|
SceneObjectGroup object1;
|
||||||
|
SceneObjectPart part1;
|
||||||
|
{
|
||||||
|
string partName = "My Little Dog Object";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
||||||
|
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object1 = new SceneObjectGroup(part1);
|
||||||
|
scene.AddNewSceneObject(object1, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||||
|
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
||||||
|
scene.AssetService.Store(asset1);
|
||||||
|
|
||||||
|
// Create item
|
||||||
|
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
||||||
|
InventoryItemBase item1 = new InventoryItemBase();
|
||||||
|
item1.Name = "My Little Dog";
|
||||||
|
item1.AssetID = asset1.FullID;
|
||||||
|
item1.ID = item1Id;
|
||||||
|
InventoryFolderBase objsFolder
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects")[0];
|
||||||
|
item1.Folder = objsFolder.ID;
|
||||||
|
scene.AddInventoryItem(item1);
|
||||||
|
|
||||||
|
MemoryStream archiveWriteStream = new MemoryStream();
|
||||||
|
archiverModule.OnInventoryArchiveSaved += SaveCompleted;
|
||||||
|
|
||||||
|
// Test saving a particular path
|
||||||
|
mre.Reset();
|
||||||
|
archiverModule.ArchiveInventory(
|
||||||
|
Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream);
|
||||||
|
mre.WaitOne(60000, false);
|
||||||
|
|
||||||
|
byte[] archive = archiveWriteStream.ToArray();
|
||||||
|
MemoryStream archiveReadStream = new MemoryStream(archive);
|
||||||
|
TarArchiveReader tar = new TarArchiveReader(archiveReadStream);
|
||||||
|
|
||||||
|
//bool gotControlFile = false;
|
||||||
|
bool gotObject1File = false;
|
||||||
|
//bool gotObject2File = false;
|
||||||
|
string expectedObject1FileName = InventoryArchiveWriteRequest.CreateArchiveItemName(item1);
|
||||||
|
string expectedObject1FilePath = string.Format(
|
||||||
|
"{0}{1}{2}",
|
||||||
|
ArchiveConstants.INVENTORY_PATH,
|
||||||
|
InventoryArchiveWriteRequest.CreateArchiveFolderName(objsFolder),
|
||||||
|
expectedObject1FileName);
|
||||||
|
|
||||||
|
string filePath;
|
||||||
|
TarArchiveReader.TarEntryType tarEntryType;
|
||||||
|
|
||||||
|
// Console.WriteLine("Reading archive");
|
||||||
|
|
||||||
|
while (tar.ReadEntry(out filePath, out tarEntryType) != null)
|
||||||
|
{
|
||||||
|
// Console.WriteLine("Got {0}", filePath);
|
||||||
|
|
||||||
|
// if (ArchiveConstants.CONTROL_FILE_PATH == filePath)
|
||||||
|
// {
|
||||||
|
// gotControlFile = true;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (filePath.StartsWith(ArchiveConstants.INVENTORY_PATH) && filePath.EndsWith(".xml"))
|
||||||
|
{
|
||||||
|
// string fileName = filePath.Remove(0, "Objects/".Length);
|
||||||
|
//
|
||||||
|
// if (fileName.StartsWith(part1.Name))
|
||||||
|
// {
|
||||||
|
Assert.That(expectedObject1FilePath, Is.EqualTo(filePath));
|
||||||
|
gotObject1File = true;
|
||||||
|
// }
|
||||||
|
// else if (fileName.StartsWith(part2.Name))
|
||||||
|
// {
|
||||||
|
// Assert.That(fileName, Is.EqualTo(expectedObject2FileName));
|
||||||
|
// gotObject2File = true;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assert.That(gotControlFile, Is.True, "No control file in archive");
|
||||||
|
Assert.That(gotObject1File, Is.True, "No item1 file in archive");
|
||||||
|
// Assert.That(gotObject2File, Is.True, "No object2 file in archive");
|
||||||
|
|
||||||
|
// TODO: Test presence of more files and contents of files.
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test loading an IAR to various different inventory paths.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestLoadIarToInventoryPaths()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
SerialiserModule serialiserModule = new SerialiserModule();
|
||||||
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
|
||||||
|
// Annoyingly, we have to set up a scene even though inventory loading has nothing to do with a scene
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
||||||
|
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "meowfood");
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua2, "hampshire");
|
||||||
|
|
||||||
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/", "meowfood", m_iarStream);
|
||||||
|
InventoryItemBase foundItem1
|
||||||
|
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, m_item1Name);
|
||||||
|
|
||||||
|
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
||||||
|
|
||||||
|
// Now try loading to a root child folder
|
||||||
|
UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, m_ua1.PrincipalID, "xA");
|
||||||
|
MemoryStream archiveReadStream = new MemoryStream(m_iarStream.ToArray());
|
||||||
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "xA", "meowfood", archiveReadStream);
|
||||||
|
|
||||||
|
InventoryItemBase foundItem2
|
||||||
|
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, "xA/" + m_item1Name);
|
||||||
|
Assert.That(foundItem2, Is.Not.Null, "Didn't find loaded item 2");
|
||||||
|
|
||||||
|
// Now try loading to a more deeply nested folder
|
||||||
|
UserInventoryTestUtils.CreateInventoryFolder(scene.InventoryService, m_ua1.PrincipalID, "xB/xC");
|
||||||
|
archiveReadStream = new MemoryStream(archiveReadStream.ToArray());
|
||||||
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "xB/xC", "meowfood", archiveReadStream);
|
||||||
|
|
||||||
|
InventoryItemBase foundItem3
|
||||||
|
= InventoryArchiveUtils.FindItemByPath(scene.InventoryService, m_ua1.PrincipalID, "xB/xC/" + m_item1Name);
|
||||||
|
Assert.That(foundItem3, Is.Not.Null, "Didn't find loaded item 3");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test that things work when the load path specified starts with a slash
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestLoadIarPathStartsWithSlash()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
SerialiserModule serialiserModule = new SerialiserModule();
|
||||||
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, serialiserModule, archiverModule);
|
||||||
|
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, m_ua1, "password");
|
||||||
|
archiverModule.DearchiveInventory(m_ua1.FirstName, m_ua1.LastName, "/Objects", "password", m_iarStream);
|
||||||
|
|
||||||
|
InventoryItemBase foundItem1
|
||||||
|
= InventoryArchiveUtils.FindItemByPath(
|
||||||
|
scene.InventoryService, m_ua1.PrincipalID, "/Objects/" + m_item1Name);
|
||||||
|
|
||||||
|
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1 in TestLoadIarFolderStartsWithSlash()");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestLoadIarPathWithEscapedChars()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
string itemName = "You & you are a mean/man/";
|
||||||
|
string humanEscapedItemName = @"You & you are a mean\/man\/";
|
||||||
|
string userPassword = "meowfood";
|
||||||
|
|
||||||
|
InventoryArchiverModule archiverModule = new InventoryArchiverModule();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("Inventory");
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, archiverModule);
|
||||||
|
|
||||||
|
// Create user
|
||||||
|
string userFirstName = "Jock";
|
||||||
|
string userLastName = "Stirrup";
|
||||||
|
UUID userId = UUID.Parse("00000000-0000-0000-0000-000000000020");
|
||||||
|
UserProfileTestUtils.CreateUserWithInventory(scene, userFirstName, userLastName, userId, "meowfood");
|
||||||
|
|
||||||
|
// Create asset
|
||||||
|
SceneObjectGroup object1;
|
||||||
|
SceneObjectPart part1;
|
||||||
|
{
|
||||||
|
string partName = "part name";
|
||||||
|
UUID ownerId = UUID.Parse("00000000-0000-0000-0000-000000000040");
|
||||||
|
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere();
|
||||||
|
Vector3 groupPosition = new Vector3(10, 20, 30);
|
||||||
|
Quaternion rotationOffset = new Quaternion(20, 30, 40, 50);
|
||||||
|
Vector3 offsetPosition = new Vector3(5, 10, 15);
|
||||||
|
|
||||||
|
part1
|
||||||
|
= new SceneObjectPart(
|
||||||
|
ownerId, shape, groupPosition, rotationOffset, offsetPosition);
|
||||||
|
part1.Name = partName;
|
||||||
|
|
||||||
|
object1 = new SceneObjectGroup(part1);
|
||||||
|
scene.AddNewSceneObject(object1, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
UUID asset1Id = UUID.Parse("00000000-0000-0000-0000-000000000060");
|
||||||
|
AssetBase asset1 = AssetHelpers.CreateAsset(asset1Id, object1);
|
||||||
|
scene.AssetService.Store(asset1);
|
||||||
|
|
||||||
|
// Create item
|
||||||
|
UUID item1Id = UUID.Parse("00000000-0000-0000-0000-000000000080");
|
||||||
|
InventoryItemBase item1 = new InventoryItemBase();
|
||||||
|
item1.Name = itemName;
|
||||||
|
item1.AssetID = asset1.FullID;
|
||||||
|
item1.ID = item1Id;
|
||||||
|
InventoryFolderBase objsFolder
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, userId, "Objects")[0];
|
||||||
|
item1.Folder = objsFolder.ID;
|
||||||
|
scene.AddInventoryItem(item1);
|
||||||
|
|
||||||
|
MemoryStream archiveWriteStream = new MemoryStream();
|
||||||
|
archiverModule.OnInventoryArchiveSaved += SaveCompleted;
|
||||||
|
|
||||||
|
mre.Reset();
|
||||||
|
archiverModule.ArchiveInventory(
|
||||||
|
Guid.NewGuid(), userFirstName, userLastName, "Objects", userPassword, archiveWriteStream);
|
||||||
|
mre.WaitOne(60000, false);
|
||||||
|
|
||||||
|
// LOAD ITEM
|
||||||
|
MemoryStream archiveReadStream = new MemoryStream(archiveWriteStream.ToArray());
|
||||||
|
|
||||||
|
archiverModule.DearchiveInventory(userFirstName, userLastName, "Scripts", userPassword, archiveReadStream);
|
||||||
|
|
||||||
|
InventoryItemBase foundItem1
|
||||||
|
= InventoryArchiveUtils.FindItemByPath(
|
||||||
|
scene.InventoryService, userId, "Scripts/Objects/" + humanEscapedItemName);
|
||||||
|
|
||||||
|
Assert.That(foundItem1, Is.Not.Null, "Didn't find loaded item 1");
|
||||||
|
// Assert.That(
|
||||||
|
// foundItem1.CreatorId, Is.EqualTo(userUuid),
|
||||||
|
// "Loaded item non-uuid creator doesn't match that of the loading user");
|
||||||
|
Assert.That(
|
||||||
|
foundItem1.Name, Is.EqualTo(itemName),
|
||||||
|
"Loaded item name doesn't match saved name");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test replication of an archive path to the user's inventory.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestNewIarPath()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
||||||
|
|
||||||
|
Dictionary <string, InventoryFolderBase> foldersCreated = new Dictionary<string, InventoryFolderBase>();
|
||||||
|
HashSet<InventoryNodeBase> nodesLoaded = new HashSet<InventoryNodeBase>();
|
||||||
|
|
||||||
|
string folder1Name = "1";
|
||||||
|
string folder2aName = "2a";
|
||||||
|
string folder2bName = "2b";
|
||||||
|
|
||||||
|
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1Name, UUID.Random());
|
||||||
|
string folder2aArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2aName, UUID.Random());
|
||||||
|
string folder2bArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2bName, UUID.Random());
|
||||||
|
|
||||||
|
string iarPath1 = string.Join("", new string[] { folder1ArchiveName, folder2aArchiveName });
|
||||||
|
string iarPath2 = string.Join("", new string[] { folder1ArchiveName, folder2bArchiveName });
|
||||||
|
|
||||||
|
{
|
||||||
|
// Test replication of path1
|
||||||
|
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
||||||
|
.ReplicateArchivePathToUserInventory(
|
||||||
|
iarPath1, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
||||||
|
foldersCreated, nodesLoaded);
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder1Candidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1Name);
|
||||||
|
Assert.That(folder1Candidates.Count, Is.EqualTo(1));
|
||||||
|
|
||||||
|
InventoryFolderBase folder1 = folder1Candidates[0];
|
||||||
|
List<InventoryFolderBase> folder2aCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName);
|
||||||
|
Assert.That(folder2aCandidates.Count, Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// Test replication of path2
|
||||||
|
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
||||||
|
.ReplicateArchivePathToUserInventory(
|
||||||
|
iarPath2, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
||||||
|
foldersCreated, nodesLoaded);
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder1Candidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1Name);
|
||||||
|
Assert.That(folder1Candidates.Count, Is.EqualTo(1));
|
||||||
|
|
||||||
|
InventoryFolderBase folder1 = folder1Candidates[0];
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder2aCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2aName);
|
||||||
|
Assert.That(folder2aCandidates.Count, Is.EqualTo(1));
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder2bCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1, folder2bName);
|
||||||
|
Assert.That(folder2bCandidates.Count, Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test replication of a partly existing archive path to the user's inventory. This should create
|
||||||
|
/// a duplicate path without the merge option.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestPartExistingIarPath()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
//log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
||||||
|
|
||||||
|
string folder1ExistingName = "a";
|
||||||
|
string folder2Name = "b";
|
||||||
|
|
||||||
|
InventoryFolderBase folder1
|
||||||
|
= UserInventoryTestUtils.CreateInventoryFolder(
|
||||||
|
scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
||||||
|
|
||||||
|
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random());
|
||||||
|
string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
|
||||||
|
|
||||||
|
string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
|
||||||
|
|
||||||
|
new InventoryArchiveReadRequest(scene, ua1, null, (Stream)null, false)
|
||||||
|
.ReplicateArchivePathToUserInventory(
|
||||||
|
itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
||||||
|
new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder1PostCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
||||||
|
Assert.That(folder1PostCandidates.Count, Is.EqualTo(2));
|
||||||
|
|
||||||
|
// FIXME: Temporarily, we're going to do something messy to make sure we pick up the created folder.
|
||||||
|
InventoryFolderBase folder1Post = null;
|
||||||
|
foreach (InventoryFolderBase folder in folder1PostCandidates)
|
||||||
|
{
|
||||||
|
if (folder.ID != folder1.ID)
|
||||||
|
{
|
||||||
|
folder1Post = folder;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Assert.That(folder1Post.ID, Is.EqualTo(folder1.ID));
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder2PostCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1Post, "b");
|
||||||
|
Assert.That(folder2PostCandidates.Count, Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Test replication of a partly existing archive path to the user's inventory. This should create
|
||||||
|
/// a merged path.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestMergeIarPath()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
Scene scene = SceneSetupHelpers.SetupScene("inventory");
|
||||||
|
UserAccount ua1 = UserProfileTestUtils.CreateUserWithInventory(scene);
|
||||||
|
|
||||||
|
string folder1ExistingName = "a";
|
||||||
|
string folder2Name = "b";
|
||||||
|
|
||||||
|
InventoryFolderBase folder1
|
||||||
|
= UserInventoryTestUtils.CreateInventoryFolder(
|
||||||
|
scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
||||||
|
|
||||||
|
string folder1ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder1ExistingName, UUID.Random());
|
||||||
|
string folder2ArchiveName = InventoryArchiveWriteRequest.CreateArchiveFolderName(folder2Name, UUID.Random());
|
||||||
|
|
||||||
|
string itemArchivePath = string.Join("", new string[] { folder1ArchiveName, folder2ArchiveName });
|
||||||
|
|
||||||
|
new InventoryArchiveReadRequest(scene, ua1, folder1ExistingName, (Stream)null, true)
|
||||||
|
.ReplicateArchivePathToUserInventory(
|
||||||
|
itemArchivePath, scene.InventoryService.GetRootFolder(ua1.PrincipalID),
|
||||||
|
new Dictionary<string, InventoryFolderBase>(), new HashSet<InventoryNodeBase>());
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder1PostCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, ua1.PrincipalID, folder1ExistingName);
|
||||||
|
Assert.That(folder1PostCandidates.Count, Is.EqualTo(1));
|
||||||
|
Assert.That(folder1PostCandidates[0].ID, Is.EqualTo(folder1.ID));
|
||||||
|
|
||||||
|
List<InventoryFolderBase> folder2PostCandidates
|
||||||
|
= InventoryArchiveUtils.FindFolderByPath(scene.InventoryService, folder1PostCandidates[0], "b");
|
||||||
|
Assert.That(folder2PostCandidates.Count, Is.EqualTo(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -400,6 +400,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
if (!UpdateAgent(reg, finalDestination, agent))
|
if (!UpdateAgent(reg, finalDestination, agent))
|
||||||
{
|
{
|
||||||
// Region doesn't take it
|
// Region doesn't take it
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1}. Returning avatar to source region.",
|
||||||
|
sp.Name, finalDestination.RegionName);
|
||||||
|
|
||||||
Fail(sp, finalDestination);
|
Fail(sp, finalDestination);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -426,16 +430,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
// that the client contacted the destination before we send the attachments and close things here.
|
// that the client contacted the destination before we send the attachments and close things here.
|
||||||
if (!WaitForCallback(sp.UUID))
|
if (!WaitForCallback(sp.UUID))
|
||||||
{
|
{
|
||||||
Fail(sp, finalDestination);
|
m_log.WarnFormat(
|
||||||
|
"[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} failed due to no callback from destination region. Returning avatar to source region.",
|
||||||
|
sp.Name, finalDestination.RegionName);
|
||||||
|
|
||||||
|
Fail(sp, finalDestination);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
|
// CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
|
||||||
CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
|
CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
|
||||||
|
|
||||||
// Well, this is it. The agent is over there.
|
// Well, this is it. The agent is over there.
|
||||||
|
|
||||||
KillEntity(sp.Scene, sp.LocalId);
|
KillEntity(sp.Scene, sp.LocalId);
|
||||||
|
|
||||||
// May need to logout or other cleanup
|
// May need to logout or other cleanup
|
||||||
|
|
|
@ -32,7 +32,6 @@ using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
|
|
|
@ -32,7 +32,6 @@ using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
|
|
|
@ -192,15 +192,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Try local first
|
// Try local first
|
||||||
if (m_localBackend.UpdateAgent(destination, cAgentData))
|
if (m_localBackend.IsLocalRegion(destination.RegionHandle))
|
||||||
return true;
|
return m_localBackend.UpdateAgent(destination, cAgentData);
|
||||||
|
|
||||||
// else do the remote thing
|
|
||||||
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
|
|
||||||
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateAgent(GridRegion destination, AgentPosition cAgentData)
|
public bool UpdateAgent(GridRegion destination, AgentPosition cAgentData)
|
||||||
|
@ -209,15 +204,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Try local first
|
// Try local first
|
||||||
if (m_localBackend.UpdateAgent(destination, cAgentData))
|
if (m_localBackend.IsLocalRegion(destination.RegionHandle))
|
||||||
return true;
|
return m_localBackend.UpdateAgent(destination, cAgentData);
|
||||||
|
|
||||||
// else do the remote thing
|
|
||||||
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
|
|
||||||
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
|
||||||
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
|
public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
|
||||||
|
|
|
@ -32,7 +32,6 @@ using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.Assets;
|
using OpenMetaverse.Assets;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
|
@ -50,7 +50,7 @@ using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||||
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||||
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
||||||
|
|
||||||
namespace OpenSim.Region.CoreModules.Media.Moap
|
namespace OpenSim.Region.CoreModules.World.Media.Moap
|
||||||
{
|
{
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MoapModule")]
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MoapModule")]
|
||||||
public class MoapModule : INonSharedRegionModule, IMoapModule
|
public class MoapModule : INonSharedRegionModule, IMoapModule
|
||||||
|
@ -225,24 +225,62 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
||||||
return me;
|
return me;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the media entry on the face of the given part.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="part">/param>
|
||||||
|
/// <param name="face"></param>
|
||||||
|
/// <param name="me">If null, then the media entry is cleared.</param>
|
||||||
public void SetMediaEntry(SceneObjectPart part, int face, MediaEntry me)
|
public void SetMediaEntry(SceneObjectPart part, int face, MediaEntry me)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[MOAP]: SetMediaEntry for {0}, face {1}", part.Name, face);
|
||||||
|
|
||||||
CheckFaceParam(part, face);
|
CheckFaceParam(part, face);
|
||||||
|
|
||||||
if (null == part.Shape.Media)
|
if (null == part.Shape.Media)
|
||||||
part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]);
|
{
|
||||||
|
if (me == null)
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
part.Shape.Media = new PrimitiveBaseShape.MediaList(new MediaEntry[part.GetNumberOfSides()]);
|
||||||
|
}
|
||||||
|
|
||||||
lock (part.Shape.Media)
|
lock (part.Shape.Media)
|
||||||
part.Shape.Media[face] = me;
|
part.Shape.Media[face] = me;
|
||||||
|
|
||||||
UpdateMediaUrl(part, UUID.Zero);
|
UpdateMediaUrl(part, UUID.Zero);
|
||||||
|
|
||||||
|
SetPartMediaFlags(part, face, me != null);
|
||||||
|
|
||||||
part.ScheduleFullUpdate();
|
part.ScheduleFullUpdate();
|
||||||
part.TriggerScriptChangedEvent(Changed.MEDIA);
|
part.TriggerScriptChangedEvent(Changed.MEDIA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clear the media entry from the face of the given part.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="part"></param>
|
||||||
|
/// <param name="face"></param>
|
||||||
public void ClearMediaEntry(SceneObjectPart part, int face)
|
public void ClearMediaEntry(SceneObjectPart part, int face)
|
||||||
{
|
{
|
||||||
SetMediaEntry(part, face, null);
|
SetMediaEntry(part, face, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set the media flags on the texture face of the given part.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The fact that we need a separate function to do what should be a simple one line operation is BUTT UGLY.
|
||||||
|
/// </remarks>
|
||||||
|
/// <param name="part"></param>
|
||||||
|
/// <param name="face"></param>
|
||||||
|
/// <param name="flag"></param>
|
||||||
|
protected void SetPartMediaFlags(SceneObjectPart part, int face, bool flag)
|
||||||
|
{
|
||||||
|
Primitive.TextureEntry te = part.Shape.Textures;
|
||||||
|
Primitive.TextureEntryFace teFace = te.CreateFace((uint)face);
|
||||||
|
teFace.MediaFlags = flag;
|
||||||
|
part.Shape.Textures = te;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -333,7 +371,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId);
|
// m_log.DebugFormat("[MOAP]: Received {0} media entries for prim {1}", omu.FaceMedia.Length, primId);
|
||||||
|
//
|
||||||
// for (int i = 0; i < omu.FaceMedia.Length; i++)
|
// for (int i = 0; i < omu.FaceMedia.Length; i++)
|
||||||
// {
|
// {
|
||||||
// MediaEntry me = omu.FaceMedia[i];
|
// MediaEntry me = omu.FaceMedia[i];
|
||||||
|
@ -368,10 +406,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
||||||
// FIXME: Race condition here since some other texture entry manipulator may overwrite/get
|
// FIXME: Race condition here since some other texture entry manipulator may overwrite/get
|
||||||
// overwritten. Unfortunately, PrimitiveBaseShape does not allow us to change texture entry
|
// overwritten. Unfortunately, PrimitiveBaseShape does not allow us to change texture entry
|
||||||
// directly.
|
// directly.
|
||||||
Primitive.TextureEntry te = part.Shape.Textures;
|
SetPartMediaFlags(part, i, true);
|
||||||
Primitive.TextureEntryFace face = te.CreateFace((uint)i);
|
|
||||||
face.MediaFlags = true;
|
|
||||||
part.Shape.Textures = te;
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[MOAP]: Media flags for face {0} is {1}",
|
// "[MOAP]: Media flags for face {0} is {1}",
|
||||||
// i, part.Shape.Textures.FaceTextures[i].MediaFlags);
|
// i, part.Shape.Textures.FaceTextures[i].MediaFlags);
|
||||||
|
@ -380,6 +415,8 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[MOAP]: Setting existing media list for {0}", part.Name);
|
||||||
|
|
||||||
// We need to go through the media textures one at a time to make sure that we have permission
|
// We need to go through the media textures one at a time to make sure that we have permission
|
||||||
// to change them
|
// to change them
|
||||||
|
|
||||||
|
@ -401,8 +438,7 @@ namespace OpenSim.Region.CoreModules.Media.Moap
|
||||||
if (null == media[i])
|
if (null == media[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
Primitive.TextureEntryFace face = te.CreateFace((uint)i);
|
SetPartMediaFlags(part, i, true);
|
||||||
face.MediaFlags = true;
|
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[MOAP]: Media flags for face {0} is {1}",
|
// "[MOAP]: Media flags for face {0} is {1}",
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using log4net.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.Assets;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.CoreModules.World.Media.Moap;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
using OpenSim.Tests.Common.Setup;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.World.Media.Moap.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class MoapTests
|
||||||
|
{
|
||||||
|
protected TestScene m_scene;
|
||||||
|
protected MoapModule m_module;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
m_module = new MoapModule();
|
||||||
|
m_scene = SceneSetupHelpers.SetupScene();
|
||||||
|
SceneSetupHelpers.SetupSceneModules(m_scene, m_module);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestClearMediaUrl()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
SceneObjectPart part = SceneSetupHelpers.AddSceneObject(m_scene);
|
||||||
|
MediaEntry me = new MediaEntry();
|
||||||
|
|
||||||
|
m_module.SetMediaEntry(part, 1, me);
|
||||||
|
m_module.ClearMediaEntry(part, 1);
|
||||||
|
|
||||||
|
Assert.That(part.Shape.Media[1], Is.EqualTo(null));
|
||||||
|
|
||||||
|
// Although we've cleared one face, other faces may still be present. So we need to check for an
|
||||||
|
// update media url version
|
||||||
|
Assert.That(part.MediaUrl, Is.EqualTo("x-mv:0000000001/" + UUID.Zero));
|
||||||
|
|
||||||
|
// By changing media flag to false, the face texture once again becomes identical to the DefaultTexture.
|
||||||
|
// Therefore, when libOMV reserializes it, it disappears and we are left with no face texture in this slot.
|
||||||
|
// Not at all confusing, eh?
|
||||||
|
Assert.That(part.Shape.Textures.FaceTextures[1], Is.Null);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestSetMediaUrl()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
|
||||||
|
string homeUrl = "opensimulator.org";
|
||||||
|
|
||||||
|
SceneObjectPart part = SceneSetupHelpers.AddSceneObject(m_scene);
|
||||||
|
MediaEntry me = new MediaEntry() { HomeURL = homeUrl };
|
||||||
|
|
||||||
|
m_module.SetMediaEntry(part, 1, me);
|
||||||
|
|
||||||
|
Assert.That(part.Shape.Media[1].HomeURL, Is.EqualTo(homeUrl));
|
||||||
|
Assert.That(part.MediaUrl, Is.EqualTo("x-mv:0000000000/" + UUID.Zero));
|
||||||
|
Assert.That(part.Shape.Textures.FaceTextures[1].MediaFlags, Is.True);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,7 +30,6 @@ using System.IO;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using log4net.Config;
|
using log4net.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Timers;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -32,7 +32,6 @@ using System.Text;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -30,7 +30,6 @@ using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -29,7 +29,6 @@ using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -30,7 +30,6 @@ using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Timers;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Timers;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -29,7 +29,6 @@ using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -34,7 +34,6 @@ using System.Timers;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.Assets;
|
using OpenMetaverse.Assets;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
|
@ -51,7 +51,7 @@ namespace OpenSim.Region.CoreModules.UDP.Linden
|
||||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")]
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "LindenUDPInfoModule")]
|
||||||
public class LindenUDPInfoModule : ISharedRegionModule
|
public class LindenUDPInfoModule : ISharedRegionModule
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
protected Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
|
protected Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
|
||||||
|
|
||||||
|
|
|
@ -92,7 +92,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||||
private static string m_freeSwitchUrlResetPassword;
|
private static string m_freeSwitchUrlResetPassword;
|
||||||
private uint m_freeSwitchServicePort;
|
private uint m_freeSwitchServicePort;
|
||||||
private string m_openSimWellKnownHTTPAddress;
|
private string m_openSimWellKnownHTTPAddress;
|
||||||
private string m_freeSwitchContext;
|
// private string m_freeSwitchContext;
|
||||||
|
|
||||||
private readonly Dictionary<string, string> m_UUIDName = new Dictionary<string, string>();
|
private readonly Dictionary<string, string> m_UUIDName = new Dictionary<string, string>();
|
||||||
private Dictionary<string, string> m_ParcelAddress = new Dictionary<string, string>();
|
private Dictionary<string, string> m_ParcelAddress = new Dictionary<string, string>();
|
||||||
|
@ -144,7 +144,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||||
m_freeSwitchDefaultWellKnownIP = map["DefaultWellKnownIP"].AsString();
|
m_freeSwitchDefaultWellKnownIP = map["DefaultWellKnownIP"].AsString();
|
||||||
m_freeSwitchDefaultTimeout = map["DefaultTimeout"].AsInteger();
|
m_freeSwitchDefaultTimeout = map["DefaultTimeout"].AsInteger();
|
||||||
m_freeSwitchUrlResetPassword = String.Empty;
|
m_freeSwitchUrlResetPassword = String.Empty;
|
||||||
m_freeSwitchContext = map["Context"].AsString();
|
// m_freeSwitchContext = map["Context"].AsString();
|
||||||
|
|
||||||
if (String.IsNullOrEmpty(m_freeSwitchRealm) ||
|
if (String.IsNullOrEmpty(m_freeSwitchRealm) ||
|
||||||
String.IsNullOrEmpty(m_freeSwitchAPIPrefix))
|
String.IsNullOrEmpty(m_freeSwitchAPIPrefix))
|
||||||
|
@ -662,7 +662,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||||
resp.Append("</buddies><groups></groups></body></level0></response>");
|
resp.Append("</buddies><groups></groups></body></level0></response>");
|
||||||
|
|
||||||
response["str_response_string"] = resp.ToString();
|
response["str_response_string"] = resp.ToString();
|
||||||
Regex normalizeEndLines = new Regex(@"\r\n", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
|
// Regex normalizeEndLines = new Regex(@"\r\n", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
|
||||||
|
|
||||||
//m_log.DebugFormat("[FREESWITCH]: {0}", normalizeEndLines.Replace((string)response["str_response_string"],""));
|
//m_log.DebugFormat("[FREESWITCH]: {0}", normalizeEndLines.Replace((string)response["str_response_string"],""));
|
||||||
return response;
|
return response;
|
||||||
|
@ -670,10 +670,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||||
|
|
||||||
public Hashtable FreeSwitchSLVoiceSigninHTTPHandler(Hashtable request)
|
public Hashtable FreeSwitchSLVoiceSigninHTTPHandler(Hashtable request)
|
||||||
{
|
{
|
||||||
// m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceSigninHTTPHandler called");
|
//m_log.Debug("[FreeSwitchVoice] FreeSwitchSLVoiceSigninHTTPHandler called");
|
||||||
string requestbody = (string)request["body"];
|
// string requestbody = (string)request["body"];
|
||||||
string uri = (string)request["uri"];
|
// string uri = (string)request["uri"];
|
||||||
string contenttype = (string)request["content-type"];
|
// string contenttype = (string)request["content-type"];
|
||||||
|
|
||||||
Hashtable requestBody = ParseRequestBody((string)request["body"]);
|
Hashtable requestBody = ParseRequestBody((string)request["body"]);
|
||||||
|
|
||||||
|
|
|
@ -712,7 +712,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
if (m_debugEnabled) m_log.InfoFormat("[SIMIAN-GROUPS-CONNECTOR] {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
|
||||||
|
|
||||||
GroupMembershipData data = null;
|
GroupMembershipData data = null;
|
||||||
bool foundData = false;
|
// bool foundData = false;
|
||||||
|
|
||||||
OSDMap UserGroupMemberInfo;
|
OSDMap UserGroupMemberInfo;
|
||||||
if (SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo))
|
if (SimianGetGenericEntry(agentID, "GroupMember", groupID.ToString(), out UserGroupMemberInfo))
|
||||||
|
|
|
@ -29,7 +29,6 @@ using System;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NUnit.Framework.SyntaxHelpers;
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Communications;
|
using OpenSim.Framework.Communications;
|
||||||
|
|
|
@ -79,9 +79,6 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
return "agent/";
|
return "agent/";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
|
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start");
|
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start");
|
||||||
|
@ -109,6 +106,9 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
if (result["Success"].AsBoolean())
|
if (result["Success"].AsBoolean())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[REMOTE SIMULATION CONNECTOR]: Failed to create agent {0} {1} at remote simulator {1}",
|
||||||
|
aCircuit.firstname, aCircuit.lastname, destination.RegionName);
|
||||||
reason = result["Message"] != null ? result["Message"].AsString() : "error";
|
reason = result["Message"] != null ? result["Message"].AsString() : "error";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,7 +253,7 @@ namespace OpenSim.Services.HypergridService
|
||||||
|
|
||||||
TravelingAgentInfo travel = m_TravelingAgents[sessionID];
|
TravelingAgentInfo travel = m_TravelingAgents[sessionID];
|
||||||
|
|
||||||
return travel.GridExternalName == thisGridExternalName;
|
return travel.GridExternalName.ToLower() == thisGridExternalName.ToLower();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool VerifyClient(UUID sessionID, string reportedIP)
|
public bool VerifyClient(UUID sessionID, string reportedIP)
|
||||||
|
|
|
@ -40,6 +40,13 @@ namespace OpenSim.Services.Interfaces
|
||||||
|
|
||||||
#region Agents
|
#region Agents
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ask the simulator hosting the destination to create an agent on that region.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="destination"></param>
|
||||||
|
/// <param name="aCircuit"></param>
|
||||||
|
/// <param name="flags"></param>
|
||||||
|
/// <param name="reason">Reason message in the event of a failure.</param>
|
||||||
bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
|
bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NUnit.Framework.Constraints;
|
||||||
|
|
||||||
namespace OpenSim.Tests.Common
|
namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,21 +57,12 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SceneSetupHelpers
|
public class SceneSetupHelpers
|
||||||
{
|
{
|
||||||
// These static variables in order to allow regions to be linked by shared modules and same
|
|
||||||
// CommunicationsManager.
|
|
||||||
private static ISharedRegionModule m_assetService = null;
|
|
||||||
// private static ISharedRegionModule m_authenticationService = null;
|
|
||||||
private static ISharedRegionModule m_inventoryService = null;
|
|
||||||
private static ISharedRegionModule m_gridService = null;
|
|
||||||
private static ISharedRegionModule m_userAccountService = null;
|
|
||||||
private static ISharedRegionModule m_presenceService = null;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set up a test scene
|
/// Set up a test scene
|
||||||
/// </summary>
|
/// </summary>
|
||||||
///
|
/// <remarks>
|
||||||
/// Automatically starts service threads, as would the normal runtime.
|
/// Automatically starts service threads, as would the normal runtime.
|
||||||
///
|
/// </remarks>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static TestScene SetupScene()
|
public static TestScene SetupScene()
|
||||||
{
|
{
|
||||||
|
@ -86,24 +77,9 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static TestScene SetupScene(String realServices)
|
public static TestScene SetupScene(String realServices)
|
||||||
{
|
{
|
||||||
return SetupScene(
|
return SetupScene("Unit test region", UUID.Random(), 1000, 1000, realServices);
|
||||||
"Unit test region", UUID.Random(), 1000, 1000, realServices);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// REFACTORING PROBLEM. No idea what the difference is with the previous one
|
|
||||||
///// <summary>
|
|
||||||
///// Set up a test scene
|
|
||||||
///// </summary>
|
|
||||||
/////
|
|
||||||
///// <param name="realServices">Starts real inventory and asset services, as opposed to mock ones, if true</param>
|
|
||||||
///// <param name="cm">This should be the same if simulating two scenes within a standalone</param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public static TestScene SetupScene(String realServices)
|
|
||||||
//{
|
|
||||||
// return SetupScene(
|
|
||||||
// "Unit test region", UUID.Random(), 1000, 1000, "");
|
|
||||||
//}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set up a test scene
|
/// Set up a test scene
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -115,7 +91,7 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static TestScene SetupScene(string name, UUID id, uint x, uint y)
|
public static TestScene SetupScene(string name, UUID id, uint x, uint y)
|
||||||
{
|
{
|
||||||
return SetupScene(name, id, x, y,"");
|
return SetupScene(name, id, x, y, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -156,27 +132,21 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
testScene.AddModule(godsModule.Name, godsModule);
|
testScene.AddModule(godsModule.Name, godsModule);
|
||||||
realServices = realServices.ToLower();
|
realServices = realServices.ToLower();
|
||||||
|
|
||||||
if (realServices.Contains("asset"))
|
LocalAssetServicesConnector assetService = StartAssetService(testScene, realServices.Contains("asset"));
|
||||||
StartAssetService(testScene, true);
|
|
||||||
else
|
|
||||||
StartAssetService(testScene, false);
|
|
||||||
|
|
||||||
// For now, always started a 'real' authentication service
|
// For now, always started a 'real' authentication service
|
||||||
StartAuthenticationService(testScene, true);
|
StartAuthenticationService(testScene, true);
|
||||||
|
|
||||||
if (realServices.Contains("inventory"))
|
LocalInventoryServicesConnector inventoryService = StartInventoryService(testScene, realServices.Contains("inventory"));
|
||||||
StartInventoryService(testScene, true);
|
StartGridService(testScene, true);
|
||||||
else
|
LocalUserAccountServicesConnector userAccountService = StartUserAccountService(testScene);
|
||||||
StartInventoryService(testScene, false);
|
LocalPresenceServicesConnector presenceService = StartPresenceService(testScene);
|
||||||
|
|
||||||
StartGridService(testScene, true);
|
inventoryService.PostInitialise();
|
||||||
StartUserAccountService(testScene);
|
assetService.PostInitialise();
|
||||||
StartPresenceService(testScene);
|
userAccountService.PostInitialise();
|
||||||
|
presenceService.PostInitialise();
|
||||||
m_inventoryService.PostInitialise();
|
|
||||||
m_assetService.PostInitialise();
|
|
||||||
m_userAccountService.PostInitialise();
|
|
||||||
m_presenceService.PostInitialise();
|
|
||||||
testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random();
|
testScene.RegionInfo.EstateSettings.EstateOwner = UUID.Random();
|
||||||
testScene.SetModuleInterfaces();
|
testScene.SetModuleInterfaces();
|
||||||
|
|
||||||
|
@ -188,24 +158,15 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
testScene.PhysicsScene
|
testScene.PhysicsScene
|
||||||
= physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test");
|
= physicsPluginManager.GetPhysicsScene("basicphysics", "ZeroMesher", new IniConfigSource(), "test");
|
||||||
|
|
||||||
// It's really not a good idea to use static variables as they carry over between tests, leading to
|
|
||||||
// problems that are extremely hard to debug. Really, these static fields need to be eliminated -
|
|
||||||
// tests using multiple regions that need to share modules need to find another solution.
|
|
||||||
m_assetService = null;
|
|
||||||
m_inventoryService = null;
|
|
||||||
m_gridService = null;
|
|
||||||
m_userAccountService = null;
|
|
||||||
m_presenceService = null;
|
|
||||||
|
|
||||||
testScene.RegionInfo.EstateSettings = new EstateSettings();
|
testScene.RegionInfo.EstateSettings = new EstateSettings();
|
||||||
testScene.LoginsDisabled = false;
|
testScene.LoginsDisabled = false;
|
||||||
|
|
||||||
return testScene;
|
return testScene;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartAssetService(Scene testScene, bool real)
|
private static LocalAssetServicesConnector StartAssetService(Scene testScene, bool real)
|
||||||
{
|
{
|
||||||
ISharedRegionModule assetService = new LocalAssetServicesConnector();
|
LocalAssetServicesConnector assetService = new LocalAssetServicesConnector();
|
||||||
IConfigSource config = new IniConfigSource();
|
IConfigSource config = new IniConfigSource();
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
config.AddConfig("AssetService");
|
config.AddConfig("AssetService");
|
||||||
|
@ -219,7 +180,8 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
assetService.AddRegion(testScene);
|
assetService.AddRegion(testScene);
|
||||||
assetService.RegionLoaded(testScene);
|
assetService.RegionLoaded(testScene);
|
||||||
testScene.AddRegionModule(assetService.Name, assetService);
|
testScene.AddRegionModule(assetService.Name, assetService);
|
||||||
m_assetService = assetService;
|
|
||||||
|
return assetService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartAuthenticationService(Scene testScene, bool real)
|
private static void StartAuthenticationService(Scene testScene, bool real)
|
||||||
|
@ -243,9 +205,9 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
//m_authenticationService = service;
|
//m_authenticationService = service;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartInventoryService(Scene testScene, bool real)
|
private static LocalInventoryServicesConnector StartInventoryService(Scene testScene, bool real)
|
||||||
{
|
{
|
||||||
ISharedRegionModule inventoryService = new LocalInventoryServicesConnector();
|
LocalInventoryServicesConnector inventoryService = new LocalInventoryServicesConnector();
|
||||||
IConfigSource config = new IniConfigSource();
|
IConfigSource config = new IniConfigSource();
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
config.AddConfig("InventoryService");
|
config.AddConfig("InventoryService");
|
||||||
|
@ -265,10 +227,11 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
inventoryService.AddRegion(testScene);
|
inventoryService.AddRegion(testScene);
|
||||||
inventoryService.RegionLoaded(testScene);
|
inventoryService.RegionLoaded(testScene);
|
||||||
testScene.AddRegionModule(inventoryService.Name, inventoryService);
|
testScene.AddRegionModule(inventoryService.Name, inventoryService);
|
||||||
m_inventoryService = inventoryService;
|
|
||||||
|
return inventoryService;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void StartGridService(Scene testScene, bool real)
|
private static LocalGridServicesConnector StartGridService(Scene testScene, bool real)
|
||||||
{
|
{
|
||||||
IConfigSource config = new IniConfigSource();
|
IConfigSource config = new IniConfigSource();
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
|
@ -277,24 +240,25 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullRegionData");
|
config.Configs["GridService"].Set("StorageProvider", "OpenSim.Data.Null.dll:NullRegionData");
|
||||||
if (real)
|
if (real)
|
||||||
config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService");
|
config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Services.GridService.dll:GridService");
|
||||||
if (m_gridService == null)
|
|
||||||
{
|
LocalGridServicesConnector gridService = new LocalGridServicesConnector();
|
||||||
ISharedRegionModule gridService = new LocalGridServicesConnector();
|
gridService.Initialise(config);
|
||||||
gridService.Initialise(config);
|
|
||||||
m_gridService = gridService;
|
|
||||||
}
|
|
||||||
//else
|
//else
|
||||||
// config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Tests.Common.dll:TestGridService");
|
// config.Configs["GridService"].Set("LocalServiceModule", "OpenSim.Tests.Common.dll:TestGridService");
|
||||||
m_gridService.AddRegion(testScene);
|
gridService.AddRegion(testScene);
|
||||||
m_gridService.RegionLoaded(testScene);
|
gridService.RegionLoaded(testScene);
|
||||||
//testScene.AddRegionModule(m_gridService.Name, m_gridService);
|
//testScene.AddRegionModule(m_gridService.Name, m_gridService);
|
||||||
|
|
||||||
|
return gridService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Start a user account service
|
/// Start a user account service
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="testScene"></param>
|
/// <param name="testScene"></param>
|
||||||
private static void StartUserAccountService(Scene testScene)
|
/// <returns></returns>
|
||||||
|
private static LocalUserAccountServicesConnector StartUserAccountService(Scene testScene)
|
||||||
{
|
{
|
||||||
IConfigSource config = new IniConfigSource();
|
IConfigSource config = new IniConfigSource();
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
|
@ -304,23 +268,21 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
config.Configs["UserAccountService"].Set(
|
config.Configs["UserAccountService"].Set(
|
||||||
"LocalServiceModule", "OpenSim.Services.UserAccountService.dll:UserAccountService");
|
"LocalServiceModule", "OpenSim.Services.UserAccountService.dll:UserAccountService");
|
||||||
|
|
||||||
if (m_userAccountService == null)
|
LocalUserAccountServicesConnector userAccountService = new LocalUserAccountServicesConnector();
|
||||||
{
|
userAccountService.Initialise(config);
|
||||||
ISharedRegionModule userAccountService = new LocalUserAccountServicesConnector();
|
|
||||||
userAccountService.Initialise(config);
|
|
||||||
m_userAccountService = userAccountService;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_userAccountService.AddRegion(testScene);
|
userAccountService.AddRegion(testScene);
|
||||||
m_userAccountService.RegionLoaded(testScene);
|
userAccountService.RegionLoaded(testScene);
|
||||||
testScene.AddRegionModule(m_userAccountService.Name, m_userAccountService);
|
testScene.AddRegionModule(userAccountService.Name, userAccountService);
|
||||||
|
|
||||||
|
return userAccountService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Start a presence service
|
/// Start a presence service
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="testScene"></param>
|
/// <param name="testScene"></param>
|
||||||
private static void StartPresenceService(Scene testScene)
|
private static LocalPresenceServicesConnector StartPresenceService(Scene testScene)
|
||||||
{
|
{
|
||||||
IConfigSource config = new IniConfigSource();
|
IConfigSource config = new IniConfigSource();
|
||||||
config.AddConfig("Modules");
|
config.AddConfig("Modules");
|
||||||
|
@ -330,16 +292,14 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
config.Configs["PresenceService"].Set(
|
config.Configs["PresenceService"].Set(
|
||||||
"LocalServiceModule", "OpenSim.Services.PresenceService.dll:PresenceService");
|
"LocalServiceModule", "OpenSim.Services.PresenceService.dll:PresenceService");
|
||||||
|
|
||||||
if (m_presenceService == null)
|
LocalPresenceServicesConnector presenceService = new LocalPresenceServicesConnector();
|
||||||
{
|
presenceService.Initialise(config);
|
||||||
ISharedRegionModule presenceService = new LocalPresenceServicesConnector();
|
|
||||||
presenceService.Initialise(config);
|
|
||||||
m_presenceService = presenceService;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_presenceService.AddRegion(testScene);
|
presenceService.AddRegion(testScene);
|
||||||
m_presenceService.RegionLoaded(testScene);
|
presenceService.RegionLoaded(testScene);
|
||||||
testScene.AddRegionModule(m_presenceService.Name, m_presenceService);
|
testScene.AddRegionModule(presenceService.Name, presenceService);
|
||||||
|
|
||||||
|
return presenceService;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -436,7 +396,7 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add a root agent.
|
/// Add a root agent.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
///
|
/// <remarks>
|
||||||
/// This function
|
/// This function
|
||||||
///
|
///
|
||||||
/// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
|
/// 1) Tells the scene that an agent is coming. Normally, the login service (local if standalone, from the
|
||||||
|
@ -447,7 +407,7 @@ namespace OpenSim.Tests.Common.Setup
|
||||||
///
|
///
|
||||||
/// This function performs actions equivalent with notifying the scene that an agent is
|
/// This function performs actions equivalent with notifying the scene that an agent is
|
||||||
/// coming and then actually connecting the agent to the scene. The one step missed out is the very first
|
/// coming and then actually connecting the agent to the scene. The one step missed out is the very first
|
||||||
///
|
/// </remarks>
|
||||||
/// <param name="scene"></param>
|
/// <param name="scene"></param>
|
||||||
/// <param name="agentData"></param>
|
/// <param name="agentData"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
|
|
@ -27,11 +27,10 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
namespace OpenSim.Tests.Common
|
namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
public delegate void TestDelegate();
|
|
||||||
|
|
||||||
public class TestHelper
|
public class TestHelper
|
||||||
{
|
{
|
||||||
public static bool AssertThisDelegateCausesArgumentException(TestDelegate d)
|
public static bool AssertThisDelegateCausesArgumentException(TestDelegate d)
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NUnit.Framework.Constraints;
|
||||||
|
|
||||||
namespace OpenSim.Tests.Common
|
namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -2959,6 +2959,7 @@
|
||||||
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/>
|
<Match buildAction="EmbeddedResource" path="World/Archiver/Tests/Resources" pattern="*"/>
|
||||||
|
<Match path="World/Media/Moap/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Serialiser/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Serialiser/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Terrain/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Terrain/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="ServiceConnectorsOut/Grid/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="ServiceConnectorsOut/Grid/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
|
Loading…
Reference in New Issue