1- // Copyright (c) .NET Foundation. All rights reserved.
1+ // Copyright (c) .NET Foundation. All rights reserved.
22// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
44using System ;
@@ -24,7 +24,7 @@ public class TyposquattingServiceFacts
2424 "System.Spatial"
2525 } ;
2626
27- private static IQueryable < PackageRegistration > PacakgeRegistrationsList = Enumerable . Range ( 0 , _packageIds . Count ( ) ) . Select ( i =>
27+ private static IQueryable < PackageRegistration > PackageRegistrationsList = Enumerable . Range ( 0 , _packageIds . Count ( ) ) . Select ( i =>
2828 new PackageRegistration ( )
2929 {
3030 Id = _packageIds [ i ] ,
@@ -48,7 +48,7 @@ private static ITyposquattingService CreateService(
4848 packageService = new Mock < IPackageService > ( ) ;
4949 packageService
5050 . Setup ( x => x . GetAllPackageRegistrations ( ) )
51- . Returns ( PacakgeRegistrationsList ) ;
51+ . Returns ( PackageRegistrationsList ) ;
5252 }
5353
5454 if ( contentObjectService == null )
@@ -88,10 +88,15 @@ private static ITyposquattingService CreateService(
8888
8989 if ( typosquattingCheckListCacheService == null )
9090 {
91+ List < NormalizedPackageIdInfo > normalizedPackageIdInfos = PackageRegistrationsList
92+ . ToList ( )
93+ . Select ( pr => new NormalizedPackageIdInfo ( pr . Id , pr . Id ) )
94+ . ToList ( ) ;
95+
9196 typosquattingCheckListCacheService = new Mock < ITyposquattingCheckListCacheService > ( ) ;
9297 typosquattingCheckListCacheService
9398 . Setup ( x => x . GetTyposquattingCheckList ( It . IsAny < int > ( ) , It . IsAny < TimeSpan > ( ) , It . IsAny < IPackageService > ( ) ) )
94- . Returns ( PacakgeRegistrationsList . Select ( pr => pr . Id ) . ToList ( ) ) ;
99+ . Returns ( normalizedPackageIdInfos ) ;
95100 }
96101
97102 return new TyposquattingService (
@@ -220,7 +225,7 @@ public void CheckTyposquattingEmptyChecklist()
220225 var mockTyposquattingCheckListCacheService = new Mock < ITyposquattingCheckListCacheService > ( ) ;
221226 mockTyposquattingCheckListCacheService
222227 . Setup ( x => x . GetTyposquattingCheckList ( It . IsAny < int > ( ) , It . IsAny < TimeSpan > ( ) , It . IsAny < IPackageService > ( ) ) )
223- . Returns ( new List < string > ( ) ) ;
228+ . Returns ( new List < NormalizedPackageIdInfo > ( ) ) ;
224229
225230 var newService = CreateService ( packageService : mockPackageService , typosquattingCheckListCacheService : mockTyposquattingCheckListCacheService ) ;
226231
@@ -315,6 +320,83 @@ public void CheckIsTyposquattingBlockUserNotEnabled()
315320 . Verify ( f => f . IsTyposquattingEnabled ( _uploadedPackageOwner ) , Times . Once ) ;
316321 }
317322
323+ [ Fact ]
324+ public void CheckIsTyposquattingBlockDifferentOwnersUploadBlocked ( )
325+ {
326+ // Arrange
327+ var uploadedPackageId = "Microsoft_NetFramework_v1" ;
328+ string conflictingPackageId = "microsoft_netframework_v1" ;
329+ User conflictingPackageOwner = PackageRegistrationsList
330+ . Single ( pr => pr . Id == conflictingPackageId )
331+ . Owners
332+ . First ( ) ;
333+
334+ // Make sure they have different owners.
335+ Assert . NotEqual ( _uploadedPackageOwner . Key , conflictingPackageOwner . Key ) ;
336+
337+ var featureFlagService = new Mock < IFeatureFlagService > ( ) ;
338+ featureFlagService
339+ . Setup ( f => f . IsTyposquattingEnabled ( ) )
340+ . Returns ( true ) ;
341+ featureFlagService
342+ . Setup ( f => f . IsTyposquattingEnabled ( _uploadedPackageOwner ) )
343+ . Returns ( true ) ;
344+
345+ var newService = CreateService ( featureFlagService : featureFlagService ) ;
346+
347+ // Act
348+
349+ var typosquattingCheckResult = newService . IsUploadedPackageIdTyposquatting ( uploadedPackageId , _uploadedPackageOwner , out List < string > typosquattingCheckCollisionIds ) ;
350+
351+ // Assert
352+ Assert . True ( typosquattingCheckResult ) ;
353+ Assert . Single ( typosquattingCheckCollisionIds ) ;
354+ Assert . Equal ( conflictingPackageId , typosquattingCheckCollisionIds [ 0 ] ) ;
355+
356+ featureFlagService
357+ . Verify ( f => f . IsTyposquattingEnabled ( ) , Times . Once ) ;
358+ featureFlagService
359+ . Verify ( f => f . IsTyposquattingEnabled ( _uploadedPackageOwner ) , Times . Once ) ;
360+ }
361+
362+ [ Fact ]
363+ public void CheckIsTyposquattingBlockSameOwnerUploadNotBlocked ( )
364+ {
365+ // Arrange
366+ var uploadedPackageId = "Microsoft_NetFramework_v1" ;
367+ string conflictingPackageId = "microsoft_netframework_v1" ;
368+
369+ var featureFlagService = new Mock < IFeatureFlagService > ( ) ;
370+
371+ // Use same owner for both packages.
372+ User samePackageOwner = PackageRegistrationsList
373+ . Single ( pr => pr . Id == conflictingPackageId )
374+ . Owners
375+ . First ( ) ;
376+
377+ featureFlagService
378+ . Setup ( f => f . IsTyposquattingEnabled ( ) )
379+ . Returns ( true ) ;
380+ featureFlagService
381+ . Setup ( f => f . IsTyposquattingEnabled ( samePackageOwner ) )
382+ . Returns ( true ) ;
383+
384+ var newService = CreateService ( featureFlagService : featureFlagService ) ;
385+
386+ // Act
387+
388+ var typosquattingCheckResult = newService . IsUploadedPackageIdTyposquatting ( uploadedPackageId , samePackageOwner , out List < string > typosquattingCheckCollisionIds ) ;
389+
390+ // Assert
391+ Assert . False ( typosquattingCheckResult ) ;
392+ Assert . Empty ( typosquattingCheckCollisionIds ) ;
393+
394+ featureFlagService
395+ . Verify ( f => f . IsTyposquattingEnabled ( ) , Times . Once ) ;
396+ featureFlagService
397+ . Verify ( f => f . IsTyposquattingEnabled ( samePackageOwner ) , Times . Once ) ;
398+ }
399+
318400 [ Fact ]
319401 public void CheckTelemetryServiceLogOriginalUploadedPackageId ( )
320402 {
@@ -347,4 +429,4 @@ public void CheckTelemetryServiceLogOriginalUploadedPackageId()
347429 Times . Once ) ;
348430 }
349431 }
350- }
432+ }
0 commit comments