initial commit
This commit is contained in:
parent
6715289efe
commit
788c3389af
37645 changed files with 2526849 additions and 80 deletions
|
|
@ -0,0 +1,141 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.AddressableAssets.Build;
|
||||
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
|
||||
using UnityEditor.AddressableAssets.Build.BuildPipelineTasks;
|
||||
using UnityEditor.AddressableAssets.Build.DataBuilders;
|
||||
using UnityEditor.AddressableAssets.Settings;
|
||||
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
|
||||
using UnityEditor.AddressableAssets.Tests;
|
||||
using UnityEditor.Build.Pipeline;
|
||||
using UnityEditor.Build.Pipeline.Injector;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
|
||||
{
|
||||
[TestFixture]
|
||||
public class AnalyzeRuleBaseTests : AddressableAssetTestBase
|
||||
{
|
||||
[Test]
|
||||
public void ConvertBundleNamesToGroupNames()
|
||||
{
|
||||
var bundleName = "2398471298347129034_bundlename_1";
|
||||
var fakeFileName = "archive://3912983hf9sdf902340jidf";
|
||||
var convertedBundleName = "group1_bundlename_1";
|
||||
|
||||
var group = Settings.CreateGroup("group1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
AddressableAssetsBuildContext context = new AddressableAssetsBuildContext();
|
||||
context.Settings = Settings;
|
||||
context.assetGroupToBundles = new Dictionary<AddressableAssetGroup, List<string>>()
|
||||
{
|
||||
{group, new List<string>() {bundleName}}
|
||||
};
|
||||
|
||||
BundleRuleBase baseRule = new BundleRuleBase();
|
||||
baseRule.m_ExtractData = new ExtractDataTask();
|
||||
|
||||
var field = typeof(ExtractDataTask).GetField("m_WriteData", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||
field.SetValue(baseRule.m_ExtractData, new BundleWriteData());
|
||||
|
||||
baseRule.m_AllBundleInputDefs.Add(new AssetBundleBuild()
|
||||
{
|
||||
assetBundleName = bundleName
|
||||
});
|
||||
|
||||
baseRule.m_ExtractData.WriteData.FileToBundle.Add(fakeFileName, bundleName);
|
||||
baseRule.ConvertBundleNamesToGroupNames(context);
|
||||
|
||||
Assert.AreEqual(convertedBundleName, baseRule.m_ExtractData.WriteData.FileToBundle[fakeFileName]);
|
||||
|
||||
Settings.RemoveGroup(group);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BaseAnalyzeRule_DoesNotThrowOnFix()
|
||||
{
|
||||
BundleRuleBase baseRule = new BundleRuleBase();
|
||||
Assert.DoesNotThrow(() => baseRule.FixIssues(Settings));
|
||||
}
|
||||
|
||||
class TestBaseRule : BundleRuleBase
|
||||
{
|
||||
public override string ruleName => "TestBaseRule";
|
||||
}
|
||||
|
||||
class TestInheritedRule : TestBaseRule
|
||||
{
|
||||
public override string ruleName => "TestInheritedRule";
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AnalyzeSystem_CanRegisterInheritedRule()
|
||||
{
|
||||
int currentCount = AnalyzeSystem.Rules.Count;
|
||||
|
||||
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
|
||||
AnalyzeSystem.RegisterNewRule<TestInheritedRule>();
|
||||
|
||||
Assert.AreEqual(currentCount + 2, AnalyzeSystem.Rules.Count);
|
||||
Assert.AreEqual(typeof(TestBaseRule), AnalyzeSystem.Rules[currentCount].GetType());
|
||||
Assert.AreEqual(typeof(TestInheritedRule), AnalyzeSystem.Rules[currentCount + 1].GetType());
|
||||
|
||||
AnalyzeSystem.Rules.RemoveAt(currentCount + 1);
|
||||
AnalyzeSystem.Rules.RemoveAt(currentCount);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AnalyzeSystem_CannotRegisterDuplicateRule()
|
||||
{
|
||||
int currentCount = AnalyzeSystem.Rules.Count;
|
||||
|
||||
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
|
||||
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
|
||||
Assert.AreEqual(currentCount + 1, AnalyzeSystem.Rules.Count);
|
||||
|
||||
AnalyzeSystem.Rules.RemoveAt(currentCount);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void AnalyzeSystem_CanSaveAndLoad()
|
||||
{
|
||||
string path = GetAssetPath("analysis.json");
|
||||
if (File.Exists(path))
|
||||
File.Delete(path);
|
||||
|
||||
int currentCount = AnalyzeSystem.Rules.Count;
|
||||
AnalyzeSystem.RegisterNewRule<TestBaseRule>();
|
||||
AnalyzeSystem.ClearAnalysis<TestBaseRule>();
|
||||
try
|
||||
{
|
||||
AnalyzeSystem.SerializeData(path);
|
||||
Assert.IsTrue(File.Exists(path));
|
||||
string json = File.ReadAllText(path);
|
||||
Assert.IsTrue(json.Contains("\"RuleName\":\"TestBaseRule\",\"Results\":[]"));
|
||||
json = json.Replace("\"TestBaseRule\",\"Results\":[", "\"TestBaseRule\",\"Results\":[{\"m_ResultName\":\"someFakeResult\",\"m_Severity\":0}");
|
||||
File.WriteAllText(path, json);
|
||||
|
||||
AnalyzeSystem.AnalyzeData.Data.TryGetValue(
|
||||
"TestBaseRule", out var results);
|
||||
Assert.IsFalse(results.Any(r => r.resultName == "someFakeResult"));
|
||||
|
||||
AnalyzeSystem.DeserializeData(path);
|
||||
Assert.IsTrue(AnalyzeSystem.AnalyzeData.Data.TryGetValue(
|
||||
"TestBaseRule", out results));
|
||||
Assert.IsTrue(results.Count > 0);
|
||||
Assert.AreEqual("someFakeResult", results[0].resultName);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//cleanup
|
||||
AnalyzeSystem.Rules.RemoveAt(currentCount);
|
||||
if (File.Exists(path))
|
||||
File.Delete(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 774cd729e4d232a45a38ea35fed32c81
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,331 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.AddressableAssets.Build;
|
||||
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
|
||||
using UnityEditor.AddressableAssets.Build.DataBuilders;
|
||||
using UnityEditor.AddressableAssets.GUI;
|
||||
using UnityEditor.AddressableAssets.Settings;
|
||||
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
|
||||
using UnityEditor.Build.Pipeline;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AddressableAssets.Initialization;
|
||||
|
||||
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
|
||||
{
|
||||
class CheckBundleDupeDependencyTests : AddressableAssetTestBase
|
||||
{
|
||||
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
|
||||
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
|
||||
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
|
||||
|
||||
protected override void OnInit()
|
||||
{
|
||||
base.OnInit();
|
||||
|
||||
GameObject prefabA = new GameObject("PrefabA");
|
||||
GameObject prefabB = new GameObject("PrefabB");
|
||||
var meshA = prefabA.AddComponent<MeshRenderer>();
|
||||
var meshB = prefabB.AddComponent<MeshRenderer>();
|
||||
|
||||
|
||||
var mat = new Material(Shader.Find("Unlit/Color"));
|
||||
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
|
||||
meshA.sharedMaterial = mat;
|
||||
meshB.sharedMaterial = mat;
|
||||
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
|
||||
private AddressableAssetsBuildContext GetAddressableAssetsBuildContext(CheckBundleDupeDependencies rule)
|
||||
{
|
||||
ResourceManagerRuntimeData runtimeData = new ResourceManagerRuntimeData();
|
||||
runtimeData.LogResourceManagerExceptions = Settings.buildSettings.LogResourceManagerExceptions;
|
||||
var aaContext = new AddressableAssetsBuildContext
|
||||
{
|
||||
Settings = Settings,
|
||||
runtimeData = runtimeData,
|
||||
bundleToAssetGroup = rule.m_BundleToAssetGroup,
|
||||
locations = rule.m_Locations,
|
||||
assetEntries = new List<AddressableAssetEntry>()
|
||||
};
|
||||
return aaContext;
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckDupeCanFixIssues()
|
||||
{
|
||||
var duplicateGroups = Settings.groups.Where(group => group.Name.Contains("Duplicate Asset Isolation"));
|
||||
foreach (AddressableAssetGroup group in duplicateGroups)
|
||||
Settings.groups.Remove(group);
|
||||
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
var matGuid = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
|
||||
Assert.IsNull(group1.GetAssetEntry(matGuid));
|
||||
Assert.IsNull(group2.GetAssetEntry(matGuid));
|
||||
|
||||
var groupCount = Settings.groups.Count;
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
rule.FixIssues(Settings);
|
||||
|
||||
Assert.AreEqual(groupCount + 1, Settings.groups.Count);
|
||||
|
||||
var dupeGroup = Settings.FindGroup("Duplicate Asset Isolation");
|
||||
Assert.IsNotNull(dupeGroup);
|
||||
Assert.IsNotNull(dupeGroup.GetAssetEntry(matGuid));
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
Settings.RemoveGroup(group2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckDupeNoIssuesIfValid()
|
||||
{
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), group2, false, false);
|
||||
|
||||
var groupCount = Settings.groups.Count;
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
rule.FixIssues(Settings);
|
||||
|
||||
Assert.AreEqual(groupCount, Settings.groups.Count);
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
Settings.RemoveGroup(group2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void UniqueAssetBundleBuild_IsCreatedWithCorrectData()
|
||||
{
|
||||
string bundleName = "myBundleName.bundle";
|
||||
string assetGroup = "assetGroup";
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
rule.m_BundleToAssetGroup.Add(bundleName, assetGroup);
|
||||
|
||||
AssetBundleBuild build = new AssetBundleBuild {assetBundleName = bundleName};
|
||||
|
||||
for (int i = 1; i < 500; i++)
|
||||
{
|
||||
AssetBundleBuild uniqueBundle = rule.CreateUniqueBundle(build);
|
||||
Assert.AreEqual(string.Format("myBundleName{0}.bundle", i), uniqueBundle.assetBundleName);
|
||||
rule.m_BundleToAssetGroup.Add(uniqueBundle.assetBundleName, assetGroup);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void RefreshBuild_ReturnsSuccess()
|
||||
{
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
AddressableAssetsBuildContext context = GetAddressableAssetsBuildContext(rule);
|
||||
Assert.AreEqual(ReturnCode.Success, rule.RefreshBuild(context));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void BuildImplicitDuplicatedAssetsSet_BuildCorrectImplicitAssets()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
GUID matGuid;
|
||||
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
|
||||
GUID.TryParse(matGuidString, out matGuid);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
var buildContext = rule.GetBuildContext(Settings);
|
||||
|
||||
rule.CalculateInputDefinitions(Settings);
|
||||
rule.RefreshBuild(buildContext);
|
||||
|
||||
var implicitGuids = rule.GetImplicitGuidToFilesMap();
|
||||
var results = rule.CalculateDuplicates(implicitGuids, buildContext);
|
||||
|
||||
//Test
|
||||
rule.BuildImplicitDuplicatedAssetsSet(results);
|
||||
|
||||
//Assert
|
||||
Assert.AreEqual(1, rule.m_ImplicitAssets.Count);
|
||||
Assert.IsTrue(rule.m_ImplicitAssets.Contains(matGuid));
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
Settings.RemoveGroup(group2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateDuplicates_DoesNotIncludeSameBundleReferencedMultipleTimes()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
var buildContext = rule.GetBuildContext(Settings);
|
||||
|
||||
rule.CalculateInputDefinitions(Settings);
|
||||
rule.RefreshBuild(buildContext);
|
||||
|
||||
var implicitGuids = rule.GetImplicitGuidToFilesMap();
|
||||
var key = implicitGuids.Keys.First();
|
||||
implicitGuids[key].Add(implicitGuids[key][0]);
|
||||
|
||||
//Test
|
||||
var results = rule.CalculateDuplicates(implicitGuids, buildContext).ToList();
|
||||
|
||||
//Assert
|
||||
Assert.AreEqual(0, results.Count);
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateInputDefinitions_CalculatesAllInputDefintions()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
GUID matGuid;
|
||||
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
|
||||
GUID.TryParse(matGuidString, out matGuid);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
|
||||
//Test
|
||||
rule.CalculateInputDefinitions(Settings);
|
||||
|
||||
//Assert
|
||||
Assert.AreEqual(2, rule.m_AllBundleInputDefs.Count);
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
Settings.RemoveGroup(group2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CalculateDuplicates_ReturnsCorrectCheckDupeResultList()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
GUID matGuid;
|
||||
var matGuidString = AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial);
|
||||
GUID.TryParse(matGuidString, out matGuid);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
|
||||
var buildContext = rule.GetBuildContext(Settings);
|
||||
rule.CalculateInputDefinitions(Settings);
|
||||
rule.RefreshBuild(buildContext);
|
||||
var implicitGuids = rule.GetImplicitGuidToFilesMap();
|
||||
|
||||
//Test
|
||||
var dupeResults = rule.CalculateDuplicates(implicitGuids, buildContext).ToList();
|
||||
|
||||
//Assert
|
||||
Assert.AreEqual(2, dupeResults.Count);
|
||||
|
||||
Assert.AreEqual(group1.Name, dupeResults[0].Group.Name);
|
||||
Assert.AreEqual(k_CheckDupeMyMaterial, dupeResults[0].AssetPath);
|
||||
|
||||
Assert.AreEqual(group2.Name, dupeResults[1].Group.Name);
|
||||
Assert.AreEqual(k_CheckDupeMyMaterial, dupeResults[1].AssetPath);
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group1);
|
||||
Settings.RemoveGroup(group2);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void DupeGroupHasContentUpdateSchema()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
|
||||
//Test
|
||||
rule.FixIssues(Settings);
|
||||
AddressableAssetGroup group = Settings.FindGroup("Duplicate Asset Isolation");
|
||||
|
||||
//Assert
|
||||
Assert.IsNotNull(group);
|
||||
Assert.IsTrue(group.HasSchema<ContentUpdateGroupSchema>());
|
||||
Assert.IsTrue(group.GetSchema<ContentUpdateGroupSchema>().StaticContent);
|
||||
|
||||
//Cleanup
|
||||
Settings.RemoveGroup(group);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckForDuplicateDependencies_WorksWithNoAddressableAssets()
|
||||
{
|
||||
//Setup
|
||||
var settings = AddressableAssetSettings.Create(ConfigFolder, k_TestConfigName + "_NoAssets", false, false);
|
||||
//Test
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
//Assert
|
||||
Assert.DoesNotThrow(() => rule.FixIssues(settings));
|
||||
}
|
||||
|
||||
#if CI_TESTRUNNER_PROJECT
|
||||
[Test]
|
||||
public void GatherModifiedEntriesOnDupeGroup_DoesNotThrow()
|
||||
{
|
||||
//Setup
|
||||
var group1 = Settings.CreateGroup("CheckDupeDepencency1", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
var group2 = Settings.CreateGroup("CheckDupeDepencency2", false, false, false, null, typeof(BundledAssetGroupSchema));
|
||||
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), group1, false, false);
|
||||
Settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabB), group2, false, false);
|
||||
|
||||
var rule = new CheckBundleDupeDependencies();
|
||||
|
||||
//Test
|
||||
rule.FixIssues(Settings);
|
||||
|
||||
var path = "Assets/addressables_content_state.bin";
|
||||
Assert.DoesNotThrow(() =>
|
||||
{
|
||||
ContentUpdateScript.GatherModifiedEntries(Settings, path);
|
||||
});
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 6719223fb1e7d804091db79ce4200b50
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,113 @@
|
|||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
|
||||
using UnityEngine;
|
||||
|
||||
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
|
||||
{
|
||||
public class CheckResourcesDupeDependenciesTests : AddressableAssetTestBase
|
||||
{
|
||||
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
|
||||
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
|
||||
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
|
||||
string k_PrefabWithMaterialPath => GetAssetPath("checkDupe_prefabWithMaterial.prefab");
|
||||
|
||||
protected override void OnInit()
|
||||
{
|
||||
base.OnInit();
|
||||
|
||||
GameObject prefabA = new GameObject("PrefabA");
|
||||
GameObject prefabB = new GameObject("PrefabB");
|
||||
GameObject prefabWithMaterial = new GameObject("PrefabWithMaterial");
|
||||
var meshA = prefabA.AddComponent<MeshRenderer>();
|
||||
var meshB = prefabB.AddComponent<MeshRenderer>();
|
||||
|
||||
var mat = new Material(Shader.Find("Unlit/Color"));
|
||||
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
|
||||
meshA.sharedMaterial = mat;
|
||||
meshB.sharedMaterial = mat;
|
||||
|
||||
var meshPrefabWithMaterial = prefabWithMaterial.AddComponent<MeshRenderer>();
|
||||
meshPrefabWithMaterial.material = AssetDatabase.LoadAssetAtPath<Material>(k_CheckDupeMyMaterial);
|
||||
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabWithMaterial, k_PrefabWithMaterialPath);
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckResourcesDupe_GetsCorrectResourcePaths()
|
||||
{
|
||||
string resourcesPath = GetAssetPath("Resources");
|
||||
if (!Directory.Exists(resourcesPath))
|
||||
Directory.CreateDirectory(resourcesPath);
|
||||
string prefabPath = GetAssetPath("Resources/PrefabA.prefab");
|
||||
GameObject prefabA = new GameObject("PrefabA");
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabA, prefabPath);
|
||||
|
||||
var rule = new CheckResourcesDupeDependencies();
|
||||
var paths = rule.GetResourcePaths();
|
||||
bool success = false;
|
||||
foreach (var p in paths)
|
||||
{
|
||||
if (p.EndsWith("PrefabA.prefab"))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsTrue(success, "CheckResourcesDupeDependencies ResourcePaths did not find the created prefab for test as expect.");
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckResourcesDupe_ResourcesDependenciesMatchWithExplicitBundleDependencies()
|
||||
{
|
||||
var rule = new CheckResourcesDupeDependencies();
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {k_CheckDupePrefabA});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
|
||||
{
|
||||
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))
|
||||
});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(k_CheckDupePrefabA));
|
||||
Assert.AreEqual(1, rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Count);
|
||||
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), rule.m_ResourcesToDependencies[k_CheckDupePrefabA][0].ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckResourcesDupe_ResourcesDependenciesMatchWithImplicitBundleDependencies()
|
||||
{
|
||||
var rule = new CheckResourcesDupeDependencies();
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {k_PrefabWithMaterialPath});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
|
||||
{
|
||||
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))
|
||||
});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(k_PrefabWithMaterialPath));
|
||||
Assert.AreEqual(1, rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath].Count);
|
||||
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath][0].ToString());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckResourcesDupe_AllResourcesDependenciesAreReturned()
|
||||
{
|
||||
var rule = new CheckResourcesDupeDependencies();
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {k_PrefabWithMaterialPath, k_CheckDupePrefabA});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
|
||||
{
|
||||
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial)),
|
||||
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))
|
||||
});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies[k_PrefabWithMaterialPath].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies[k_CheckDupePrefabA].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: d370242d9a79ba64cb55333c896bfdb0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using NUnit.Framework;
|
||||
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
|
||||
using UnityEditor.AddressableAssets.Build.DataBuilders;
|
||||
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEditor.VersionControl;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AddressableAssets.Initialization;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace UnityEditor.AddressableAssets.Tests.AnalyzeRules
|
||||
{
|
||||
public class CheckSceneDupeDependenciesTests : AddressableAssetTestBase
|
||||
{
|
||||
string k_CheckDupePrefabA => GetAssetPath("checkDupe_prefabA.prefab");
|
||||
string k_CheckDupePrefabB => GetAssetPath("checkDupe_prefabB.prefab");
|
||||
string k_CheckDupeMyMaterial => GetAssetPath("checkDupe_myMaterial.mat");
|
||||
string k_ScenePath => GetAssetPath("dupeSceneTest.unity");
|
||||
string k_PrefabWithMaterialPath => GetAssetPath("checkDupe_prefabWithMaterial.prefab");
|
||||
|
||||
protected override void OnInit()
|
||||
{
|
||||
base.OnInit();
|
||||
|
||||
GameObject prefabA = new GameObject("PrefabA");
|
||||
GameObject prefabB = new GameObject("PrefabB");
|
||||
GameObject prefabWithMaterial = new GameObject("PrefabWithMaterial");
|
||||
var meshA = prefabA.AddComponent<MeshRenderer>();
|
||||
var meshB = prefabB.AddComponent<MeshRenderer>();
|
||||
|
||||
var mat = new Material(Shader.Find("Unlit/Color"));
|
||||
AssetDatabase.CreateAsset(mat, k_CheckDupeMyMaterial);
|
||||
meshA.sharedMaterial = mat;
|
||||
meshB.sharedMaterial = mat;
|
||||
|
||||
var meshPrefabWithMaterial = prefabWithMaterial.AddComponent<MeshRenderer>();
|
||||
meshPrefabWithMaterial.material = AssetDatabase.LoadAssetAtPath<Material>(k_CheckDupeMyMaterial);
|
||||
|
||||
prefabA.AddComponent<TestBehaviourWithReference>();
|
||||
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabA, k_CheckDupePrefabA);
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabB, k_CheckDupePrefabB);
|
||||
PrefabUtility.SaveAsPrefabAsset(prefabWithMaterial, k_PrefabWithMaterialPath);
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_GetsCorrectResourcePaths()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
|
||||
var sceneBU = EditorBuildSettings.scenes;
|
||||
EditorBuildSettings.scenes = new EditorBuildSettingsScene[1] {editorScene};
|
||||
try
|
||||
{
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
var paths = rule.GetResourcePaths();
|
||||
bool success = false;
|
||||
foreach (var p in paths)
|
||||
{
|
||||
if (p.Contains(editorScene.path))
|
||||
{
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsTrue(success, "CheckSceneDupeDependencies ResourcePaths did not find the created Scene for test as expected.");
|
||||
}
|
||||
finally
|
||||
{
|
||||
//Cleanup
|
||||
EditorBuildSettings.scenes = sceneBU;
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
AssetDatabase.DeleteAsset(k_ScenePath);
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_SceneDependenciesMatchWithExplicitBundleDependencies()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(k_CheckDupePrefabA);
|
||||
|
||||
GameObject n = new GameObject("TestGameObject");
|
||||
var refer = n.AddComponent<TestBehaviourWithReference>();
|
||||
refer.Reference = go;
|
||||
SceneManager.MoveGameObjectToScene(n, scene);
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA))});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
|
||||
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
|
||||
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupePrefabA), rule.m_ResourcesToDependencies[editorScene.path][0].ToString());
|
||||
|
||||
//Cleanup
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_SceneDependenciesMatchWithImplicitBundleDependencies()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene);
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
|
||||
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
|
||||
Assert.AreEqual(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial), rule.m_ResourcesToDependencies[editorScene.path][0].ToString());
|
||||
|
||||
//Cleanup
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_SceneDependenciesDoNotIncludeEditorOnly()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
GameObject go = PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene) as GameObject;
|
||||
go.tag = "EditorOnly";
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>() {new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
|
||||
Assert.AreEqual(0, rule.m_ResourcesToDependencies[editorScene.path].Count);
|
||||
|
||||
//Cleanup
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_AllSceneToBundleDependenciesAreReturned()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
PrefabUtility.InstantiatePrefab(AssetDatabase.LoadAssetAtPath<GameObject>(k_PrefabWithMaterialPath), scene);
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
|
||||
rule.IntersectResourcesDepedenciesWithBundleDependencies(new List<GUID>()
|
||||
{
|
||||
new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))
|
||||
});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
|
||||
Assert.AreEqual(1, rule.m_ResourcesToDependencies[editorScene.path].Count);
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies[editorScene.path].Contains(new GUID(AssetDatabase.AssetPathToGUID(k_CheckDupeMyMaterial))));
|
||||
|
||||
//Cleanup
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void CheckSceneDupe_SceneDependenciesDoNotIncludeScripts()
|
||||
{
|
||||
Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
GameObject go = AssetDatabase.LoadAssetAtPath<GameObject>(k_CheckDupePrefabA);
|
||||
GameObject g = PrefabUtility.InstantiatePrefab(go, scene) as GameObject;
|
||||
g.AddComponent<TestBehaviourWithReference>();
|
||||
EditorSceneManager.SaveScene(scene, k_ScenePath);
|
||||
|
||||
var rule = new CheckSceneDupeDependencies();
|
||||
|
||||
EditorBuildSettingsScene editorScene = new EditorBuildSettingsScene(k_ScenePath, true);
|
||||
rule.BuiltInResourcesToDependenciesMap(new string[] {editorScene.path});
|
||||
|
||||
Assert.IsTrue(rule.m_ResourcesToDependencies.ContainsKey(editorScene.path));
|
||||
bool containsAnyScripts = false;
|
||||
foreach (GUID guid in rule.m_ResourcesToDependencies[editorScene.path])
|
||||
{
|
||||
string path = AssetDatabase.GUIDToAssetPath(guid.ToString());
|
||||
if (path.EndsWith(".cs") || path.EndsWith(".dll"))
|
||||
{
|
||||
containsAnyScripts = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsFalse(containsAnyScripts, "Scripts were included as a duplciate dependency");
|
||||
|
||||
//Cleanup
|
||||
EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: e054c3274b8fb154c876b5be5db09359
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Loading…
Add table
Add a link
Reference in a new issue