8000 Added unmanaged generics test case. · obfuscar/obfuscar@7115ff1 · GitHub
[go: up one dir, main page]

Skip to content

Commit

Permalink
Added unmanaged generics test case.
Browse files Browse the repository at this point in the history
  • Loading branch information
lextm committed Oct 26, 2024
1 parent 304c0ac commit 7115ff1
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 0 deletions.
59 changes: 59 additions & 0 deletions Tests/Input/AssemblyWithUnmanagedGenerics.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#region Copyright (c) 2007 Ryan Williams <drcforbin@gmail.com>
/// <copyright>
/// Copyright (c) 2007 Ryan Williams <drcforbin@gmail.com>
///
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
///
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
/// </copyright>
#endregion

using System;
using System.Collections;
using System.Collections.Generic;

namespace TestClasses
{
public abstract class Generic<T> : IEnumerable<T> where T : unmanaged
{
IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator();
}
public abstract IEnumerator<T> GetEnumerator ();
public void Some ()
{
}
public void Other ()
{
}
public void Method ()
{
}
public T[] ToArray ()
{
throw new NotImplementedException ();
}
}
public class Foos : Generic<int>
{
public override IEnumerator<int> GetEnumerator ()
{
throw new NotImplementedException ();
}
}
}
1 change: 1 addition & 0 deletions Tests/ObfuscarTests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
<Compile Include="TestClasses2.cs" />
<Compile Include="TestClasses.cs" />
<Compile Include="UnityTests.cs" />
<Compile Include="UnmanagedGenericsTests.cs" />
<Compile Include="VariablesTests.cs" />
<Compile Include="WildcardTests.cs" />
<Compile Include="ObfuscationAttributeTests.cs" />
Expand Down
96 changes: 96 additions & 0 deletions Tests/UnmanagedGenericsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
#region Copyright (c) 2007 Ryan Williams <drcforbin@gmail.com>

/// <copyright>
/// Copyright (c) 2007 Ryan Williams <drcforbin@gmail.com>
///
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
///
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
///
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
/// </copyright>

#endregion

using System.IO;
using Mono.Cecil;
using Xunit;
using Obfuscar;

namespace ObfuscarTests
{
public class UnmanagedGenericsTests
{
Obfuscator BuildAndObfuscateAssemblies()
{
string xml = string.Format(
@"<?xml version='1.0'?>" +
@"<Obfuscator>" +
@"<Var name='InPath' value='{0}' />" +
@"<Var name='OutPath' value='{1}' />" +
@"<Var name='ReuseNames' value='false' />" +
@"<Var name='HidePrivateApi' value='true' />" +
@"<Module file='$(InPath){2}AssemblyWithUnmanagedGenerics.dll'>" +
@" <SkipType name='System.Runtime.CompilerServices.IsUnmanagedAttribute' />" +
@"</Module>" +
@"</Obfuscator>", TestHelper.InputPath, TestHelper.OutputPath, Path.DirectorySeparatorChar);

return TestHelper.BuildAndObfuscate("AssemblyWithUnmanagedGenerics", string.Empty, xml);
}

MethodDefinition FindByName(TypeDefinition typeDef, string name)
{
foreach (MethodDefinition method in typeDef.Methods)
if (method.Name == name)
return method;

Assert.Fail(string.Format("Expected to find method: {0}", name));
return null; // never here
}

[Fact]
public void CheckClassHasAttribute()
{
Obfuscator item = BuildAndObfuscateAssemblies();
ObfuscationMap map = item.Mapping;

string assmName = "AssemblyWithUnmanagedGenerics.dll";

AssemblyDefinition inAssmDef = AssemblyDefinition.ReadAssembly(
Path.Combine(TestHelper.InputPath, assmName));

AssemblyDefinition outAssmDef = AssemblyDefinition.ReadAssembly(
Path.Combine(item.Project.Settings.OutPath, assmName));

{
TypeDefinition classAType = inAssmDef.MainModule.GetType("System.Runtime.CompilerServices.IsUnmanagedAttribute");
ObfuscatedThing classAEntry = map.GetClass(new TypeKey(classAType));

Assert.True(classAEntry.Status == ObfuscationStatus.Skipped,
"Type should have been skipped.");
}

{
TypeDefinition classAType = inAssmDef.MainModule.GetType("TestClasses.Generic`1");
MethodDefinition classAmethod2 = FindByName(classAType, "GetEnumerator");

ObfuscatedThing classAEntry = map.GetMethod(new MethodKey(classAmethod2));

Assert.True(classAEntry.Status == ObfuscationStatus.Skipped,
"Method should have been skipped.");
}
}
}
}

0 comments on commit 7115ff1

Please sign in to comment.
0