Skip to content

Commit cc47d5a

Browse files
Address audit matcher review comments
1 parent 336850e commit cc47d5a

4 files changed

Lines changed: 71 additions & 8 deletions

File tree

scripts/FirebaseBindingAudit.Tests/AuditRunnerTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,17 @@ public void ShouldStageSharpieFrameworkSlices_SkipsWhenSharpieIsDisabled()
6767
Assert.True(AuditRunner.ShouldStageSharpieFrameworkSlices(CreateAuditOptions(disableSharpie: false)));
6868
}
6969

70+
[Fact]
71+
public void CreateTempRootPath_ReturnsUniqueAuditWorkspacePaths()
72+
{
73+
var firstPath = AuditRunner.CreateTempRootPath();
74+
var secondPath = AuditRunner.CreateTempRootPath();
75+
76+
Assert.NotEqual(firstPath, secondPath);
77+
Assert.EndsWith("firebase-binding-audit", Directory.GetParent(firstPath)!.Name);
78+
Assert.Contains("-", Path.GetFileName(firstPath), StringComparison.Ordinal);
79+
}
80+
7081
[Fact]
7182
public void TryResolveSharpieCompanionFrameworkPath_UsesLaterExistingImport()
7283
{

scripts/FirebaseBindingAudit.Tests/BindingComparerNormalizationTests.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,36 @@ public enum FIRAppDistributionError : long
134134
}
135135

136136
[Fact]
137-
public void Compare_MatchesGeneratedFieldConstantsInSeparateStaticContainer()
137+
public void Compare_MatchesGeneratedManualFieldOnSameType()
138+
{
139+
var result = Compare(
140+
"""
141+
namespace Firebase.AppDistribution;
142+
143+
[BaseType(typeof(NSObject), Name = "FIRAppDistribution")]
144+
public interface AppDistribution
145+
{
146+
[Field("FIRAppDistributionErrorDomain", "__Internal")]
147+
NSString ErrorDomain { get; }
148+
}
149+
""",
150+
"""
151+
namespace FirebaseAppDistribution;
152+
153+
[BaseType(typeof(NSObject))]
154+
public interface FIRAppDistribution
155+
{
156+
[Internal]
157+
[Field("FIRAppDistributionErrorDomain", "__Internal")]
158+
NSString ErrorDomain { get; }
159+
}
160+
""");
161+
162+
AssertNoFailures(result);
163+
}
164+
165+
[Fact]
166+
public void Compare_DoesNotMatchGeneratedManualFieldOnDifferentType()
138167
{
139168
var result = Compare(
140169
"""
@@ -162,7 +191,11 @@ public static class FirebaseAppDistributionConstants
162191
}
163192
""");
164193

165-
AssertNoFailures(result);
194+
Assert.Contains(
195+
result.Failures,
196+
static failure => failure.Category == "stale-baseline-binding" &&
197+
failure.ComparisonTypeKey == "FIRAppDistribution" &&
198+
failure.ComparisonMemberKey == "field|FIRAppDistributionErrorDomain");
166199
}
167200

168201
[Fact]

scripts/FirebaseBindingAudit/AuditRunner.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public async Task<AuditRunResult> RunAsync(AuditOptions options, CancellationTok
109109
PrepareOutputDirectory(outputDirectory, detailsDirectory, logsDirectory);
110110

111111
var selectedTargets = SelectTargets(options.SelectedTargets);
112-
var tempRoot = Path.Combine(Path.GetTempPath(), "firebase-binding-audit", DateTime.UtcNow.ToString("yyyyMMddHHmmss"));
112+
var tempRoot = CreateTempRootPath();
113113
Directory.CreateDirectory(tempRoot);
114114
var sharedNugetPackages = Path.Combine(Path.GetTempPath(), "firebase-binding-audit", "nuget-packages");
115115
var dotnetEnvironment = new Dictionary<string, string>(StringComparer.Ordinal)
@@ -393,6 +393,9 @@ sharpieRun is not null &&
393393
internal static bool ShouldStageSharpieFrameworkSlices(AuditOptions options) =>
394394
!options.DisableSharpie;
395395

396+
internal static string CreateTempRootPath() =>
397+
Path.Combine(Path.GetTempPath(), "firebase-binding-audit", $"{DateTime.UtcNow:yyyyMMddHHmmss}-{Guid.NewGuid():N}");
398+
396399
private static ConfidenceSummary BuildConfidenceSummary(IReadOnlyList<AuditFinding> findings)
397400
{
398401
return AuditFindingSummary.BuildConfidenceSummary(findings.ToList());

scripts/FirebaseBindingAudit/BindingModel.cs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,7 +1206,7 @@ public TargetComparisonResult Compare(
12061206
var generatedManualMemberLookup = new HashSet<string>(
12071207
generated.ManualItems
12081208
.Where(static item => !string.IsNullOrWhiteSpace(item.MatchMemberKey))
1209-
.Select(static item => item.MatchMemberKey!),
1209+
.Select(static item => CreateManualLookupKey(item.MatchTypeKey, item.MatchMemberKey!)),
12101210
StringComparer.Ordinal);
12111211

12121212
var smoothedDelegateKeys = new HashSet<string>(StringComparer.Ordinal);
@@ -1362,7 +1362,7 @@ private static void CompareMembers(
13621362
{
13631363
if (!TryGetComparableMember(generated.Members, baselineMemberEntry, out var generatedMember))
13641364
{
1365-
if (IsMatchedGeneratedManualBinding(baselineMemberEntry, generatedManualMemberLookup))
1365+
if (IsMatchedGeneratedManualBinding(baseline.ComparisonKey, baselineMemberEntry, generatedManualMemberLookup, aliases))
13661366
{
13671367
continue;
13681368
}
@@ -1428,11 +1428,27 @@ private static bool IsExternalPlaceholderType(BoundTypeSurface type)
14281428
}
14291429

14301430
private static bool IsMatchedGeneratedManualBinding(
1431+
string baselineTypeKey,
14311432
BindingMemberSurface baselineMember,
1432-
IReadOnlySet<string> generatedManualMemberLookup)
1433+
IReadOnlySet<string> generatedManualMemberLookup,
1434+
SymbolAliasLookup aliases)
1435+
{
1436+
if (!string.Equals(baselineMember.BindingAttribute, "Field", StringComparison.Ordinal))
1437+
{
1438+
return false;
1439+
}
1440+
1441+
return GetEquivalentManualLookupTypeKeys(baselineTypeKey, aliases)
1442+
.Any(typeKey => generatedManualMemberLookup.Contains(CreateManualLookupKey(typeKey, baselineMember.Key)));
1443+
}
1444+
1445+
private static IEnumerable<string> GetEquivalentManualLookupTypeKeys(string typeKey, SymbolAliasLookup aliases)
14331446
{
1434-
return string.Equals(baselineMember.BindingAttribute, "Field", StringComparison.Ordinal) &&
1435-
generatedManualMemberLookup.Contains(baselineMember.Key);
1447+
yield return typeKey;
1448+
foreach (var equivalentTypeKey in aliases.GetEquivalentComparisonKeys(typeKey))
1449+
{
1450+
yield return equivalentTypeKey;
1451+
}
14361452
}
14371453

14381454
private static bool TryGetComparableMember(

0 commit comments

Comments
 (0)