@@ -652,7 +652,81 @@ class JSONPackageCollectionProviderTests: XCTestCase {
652652 let signatureValidator = MockCollectionSignatureValidator ( [ " Sample Package Collection " ] )
653653 // Collections from www.test.com must be signed
654654 let sourceCertPolicy = PackageCollectionSourceCertificatePolicy (
655- sourceCertPolicies: [ " www.test.com " : . init( certPolicyKey: CertificatePolicyKey . default, base64EncodedRootCerts: nil ) ]
655+ sourceCertPolicies: [ " www.test.com " : [ . init( certPolicyKey: CertificatePolicyKey . default, base64EncodedRootCerts: nil ) ] ]
656+ )
657+ let provider = JSONPackageCollectionProvider ( httpClient: httpClient, signatureValidator: signatureValidator,
658+ sourceCertPolicy: sourceCertPolicy, diagnosticsEngine: DiagnosticsEngine ( ) )
659+ let source = PackageCollectionsModel . CollectionSource ( type: . json, url: url)
660+ let collection = try tsc_await { callback in provider. get ( source, callback: callback) }
661+
662+ XCTAssertEqual ( collection. name, " Sample Package Collection " )
663+ XCTAssertEqual ( collection. overview, " This is a sample package collection listing made-up packages. " )
664+ XCTAssertEqual ( collection. keywords, [ " sample package collection " ] )
665+ XCTAssertEqual ( collection. createdBy? . name, " Jane Doe " )
666+ XCTAssertEqual ( collection. packages. count, 2 )
667+ let package = collection. packages. first!
668+ XCTAssertEqual ( package . repository, . init( url: " https://www.example.com/repos/RepoOne.git " ) )
669+ XCTAssertEqual ( package . summary, " Package One " )
670+ XCTAssertEqual ( package . keywords, [ " sample package " ] )
671+ XCTAssertEqual ( package . readmeURL, URL ( string: " https://www.example.com/repos/RepoOne/README " ) !)
672+ XCTAssertEqual ( package . license, . init( type: . Apache2_0, url: URL ( string: " https://www.example.com/repos/RepoOne/LICENSE " ) !) )
673+ XCTAssertEqual ( package . versions. count, 1 )
674+ let version = package . versions. first!
675+ XCTAssertEqual ( version. summary, " Fixed a few bugs " )
676+ let manifest = version. manifests. values. first!
677+ XCTAssertEqual ( manifest. packageName, " PackageOne " )
678+ XCTAssertEqual ( manifest. targets, [ . init( name: " Foo " , moduleName: " Foo " ) ] )
679+ XCTAssertEqual ( manifest. products, [ . init( name: " Foo " , type: . library( . automatic) , targets: [ . init( name: " Foo " , moduleName: " Foo " ) ] ) ] )
680+ XCTAssertEqual ( manifest. toolsVersion, ToolsVersion ( string: " 5.1 " ) !)
681+ XCTAssertEqual ( manifest. minimumPlatformVersions, [ SupportedPlatform ( platform: . macOS, version: . init( " 10.15 " ) ) ] )
682+ XCTAssertEqual ( version. verifiedCompatibility? . count, 3 )
683+ XCTAssertEqual ( version. verifiedCompatibility!. first!. platform, . macOS)
684+ XCTAssertEqual ( version. verifiedCompatibility!. first!. swiftVersion, SwiftLanguageVersion ( string: " 5.1 " ) !)
685+ XCTAssertEqual ( version. license, . init( type: . Apache2_0, url: URL ( string: " https://www.example.com/repos/RepoOne/LICENSE " ) !) )
686+ XCTAssertNotNil ( version. createdAt)
687+ XCTAssertTrue ( collection. isSigned)
688+ let signature = collection. signature!
689+ XCTAssertTrue ( signature. isVerified)
690+ XCTAssertEqual ( " Sample Subject " , signature. certificate. subject. commonName)
691+ XCTAssertEqual ( " Sample Issuer " , signature. certificate. issuer. commonName)
692+ }
693+ }
694+
695+ func testRequiredSigningMultiplePoliciesGood( ) throws {
696+ fixture ( name: " Collections " ) { directoryPath in
697+ let path = directoryPath. appending ( components: " JSON " , " good_signed.json " )
698+ let url = URL ( string: " https://www.test.com/collection.json " ) !
699+ let data = Data ( try localFileSystem. readFileContents ( path) . contents)
700+
701+ let handler : HTTPClient . Handler = { request, _, completion in
702+ XCTAssertEqual ( request. url, url, " url should match " )
703+ switch request. method {
704+ case . head:
705+ completion ( . success( . init( statusCode: 200 ,
706+ headers: . init( [ . init( name: " Content-Length " , value: " \( data. count) " ) ] ) ) ) )
707+ case . get:
708+ completion ( . success( . init( statusCode: 200 ,
709+ headers: . init( [ . init( name: " Content-Length " , value: " \( data. count) " ) ] ) ,
710+ body: data) ) )
711+ default :
712+ XCTFail ( " method should match " )
713+ }
714+ }
715+
716+ var httpClient = HTTPClient ( handler: handler)
717+ httpClient. configuration. circuitBreakerStrategy = . none
718+ httpClient. configuration. retryStrategy = . none
719+
720+ // Mark collection as having valid signature
721+ let signatureValidator = MockCollectionSignatureValidator ( certPolicyKeys: [ CertificatePolicyKey . default ( subjectUserID: " test " ) ] )
722+ // Collections from www.test.com must be signed
723+ let sourceCertPolicy = PackageCollectionSourceCertificatePolicy (
724+ sourceCertPolicies: [
725+ " www.test.com " : [
726+ . init( certPolicyKey: CertificatePolicyKey . default, base64EncodedRootCerts: nil ) ,
727+ . init( certPolicyKey: CertificatePolicyKey . default ( subjectUserID: " test " ) , base64EncodedRootCerts: nil ) ,
728+ ] ,
729+ ]
656730 )
657731 let provider = JSONPackageCollectionProvider ( httpClient: httpClient, signatureValidator: signatureValidator,
658732 sourceCertPolicy: sourceCertPolicy, diagnosticsEngine: DiagnosticsEngine ( ) )
@@ -721,7 +795,7 @@ class JSONPackageCollectionProviderTests: XCTestCase {
721795 let signatureValidator = MockCollectionSignatureValidator ( )
722796 // Collections from www.test.com must be signed
723797 let sourceCertPolicy = PackageCollectionSourceCertificatePolicy (
724- sourceCertPolicies: [ " www.test.com " : . init( certPolicyKey: CertificatePolicyKey . default, base64EncodedRootCerts: nil ) ]
798+ sourceCertPolicies: [ " www.test.com " : [ . init( certPolicyKey: CertificatePolicyKey . default, base64EncodedRootCerts: nil ) ] ]
725799 )
726800 let provider = JSONPackageCollectionProvider ( httpClient: httpClient, signatureValidator: signatureValidator,
727801 sourceCertPolicy: sourceCertPolicy, diagnosticsEngine: DiagnosticsEngine ( ) )
0 commit comments