@@ -62,13 +62,16 @@ import org.ossreviewtoolkit.clients.fossid.listIgnoredFiles
62
62
import org.ossreviewtoolkit.clients.fossid.listMarkedAsIdentifiedFiles
63
63
import org.ossreviewtoolkit.clients.fossid.listPendingFiles
64
64
import org.ossreviewtoolkit.clients.fossid.listScansForProject
65
+ import org.ossreviewtoolkit.clients.fossid.listSnippets
65
66
import org.ossreviewtoolkit.clients.fossid.model.Scan
66
67
import org.ossreviewtoolkit.clients.fossid.model.identification.common.LicenseMatchType
67
68
import org.ossreviewtoolkit.clients.fossid.model.identification.identifiedFiles.IdentifiedFile
68
69
import org.ossreviewtoolkit.clients.fossid.model.identification.ignored.IgnoredFile
69
70
import org.ossreviewtoolkit.clients.fossid.model.identification.markedAsIdentified.License
70
71
import org.ossreviewtoolkit.clients.fossid.model.identification.markedAsIdentified.LicenseFile
71
72
import org.ossreviewtoolkit.clients.fossid.model.identification.markedAsIdentified.MarkedAsIdentifiedFile
73
+ import org.ossreviewtoolkit.clients.fossid.model.result.MatchType
74
+ import org.ossreviewtoolkit.clients.fossid.model.result.Snippet
72
75
import org.ossreviewtoolkit.clients.fossid.model.rules.IgnoreRule
73
76
import org.ossreviewtoolkit.clients.fossid.model.rules.RuleScope
74
77
import org.ossreviewtoolkit.clients.fossid.model.rules.RuleType
@@ -78,23 +81,29 @@ import org.ossreviewtoolkit.clients.fossid.model.status.UnversionedScanDescripti
78
81
import org.ossreviewtoolkit.clients.fossid.runScan
79
82
import org.ossreviewtoolkit.downloader.VersionControlSystem
80
83
import org.ossreviewtoolkit.downloader.vcs.Git
84
+ import org.ossreviewtoolkit.model.ArtifactProvenance
81
85
import org.ossreviewtoolkit.model.CopyrightFinding
86
+ import org.ossreviewtoolkit.model.Hash
82
87
import org.ossreviewtoolkit.model.Identifier
83
88
import org.ossreviewtoolkit.model.Issue
84
89
import org.ossreviewtoolkit.model.LicenseFinding
85
90
import org.ossreviewtoolkit.model.Package
86
91
import org.ossreviewtoolkit.model.PackageType
92
+ import org.ossreviewtoolkit.model.RemoteArtifact
87
93
import org.ossreviewtoolkit.model.ScanResult
88
94
import org.ossreviewtoolkit.model.Severity
89
95
import org.ossreviewtoolkit.model.TextLocation
90
96
import org.ossreviewtoolkit.model.VcsInfo
91
97
import org.ossreviewtoolkit.model.VcsType
92
98
import org.ossreviewtoolkit.model.config.ScannerConfiguration
99
+ import org.ossreviewtoolkit.model.utils.Snippet as OrtSnippet
100
+ import org.ossreviewtoolkit.model.utils.SnippetFinding
93
101
import org.ossreviewtoolkit.scanner.ScanContext
94
102
import org.ossreviewtoolkit.scanner.scanners.fossid.FossId.Companion.SCAN_CODE_KEY
95
103
import org.ossreviewtoolkit.scanner.scanners.fossid.FossId.Companion.SCAN_ID_KEY
96
104
import org.ossreviewtoolkit.scanner.scanners.fossid.FossId.Companion.SERVER_URL_KEY
97
105
import org.ossreviewtoolkit.scanner.scanners.fossid.FossId.Companion.convertGitUrlToProjectName
106
+ import org.ossreviewtoolkit.utils.spdx.SpdxExpression
98
107
99
108
@Suppress(" LargeClass" )
100
109
class FossIdTest : WordSpec ({
@@ -314,6 +323,7 @@ class FossIdTest : WordSpec({
314
323
summary.licenseFindings shouldContainExactlyInAnyOrder expectedLicenseFindings
315
324
}
316
325
326
+ // TODO: Deprecation: Remove the pending files in issues. This is a breaking change.
317
327
" report pending files as issues" {
318
328
val projectCode = projectCode(PROJECT )
319
329
val scanCode = scanCode(PROJECT , null)
@@ -328,7 +338,7 @@ class FossIdTest : WordSpec({
328
338
.expectCheckScanStatus(scanCode, ScanStatus .FINISHED )
329
339
.expectCreateScan(projectCode, scanCode, vcsInfo, "")
330
340
.expectDownload(scanCode)
331
- .mockFiles(scanCode, pendingRange = 4..5)
341
+ .mockFiles(scanCode, pendingRange = 4..5, snippetRange = 1..5 )
332
342
333
343
val fossId = createFossId(config)
334
344
@@ -341,6 +351,34 @@ class FossIdTest : WordSpec({
341
351
summary.issues.map { it.copy(timestamp = Instant .EPOCH ) } shouldBe expectedIssues
342
352
}
343
353
354
+ " report pending files as snippets" {
355
+ val projectCode = projectCode(PROJECT )
356
+ val scanCode = scanCode(PROJECT , null)
357
+ val config = createConfig(deltaScans = false)
358
+ val vcsInfo = createVcsInfo()
359
+ val scan = createScan(vcsInfo.url, "${vcsInfo.revision}_other ", scanCode)
360
+ val pkgId = createIdentifier(index = 42)
361
+
362
+ FossIdRestService .create(config.serverUrl)
363
+ .expectProjectRequest(projectCode)
364
+ .expectListScans(projectCode, listOf(scan))
365
+ .expectCheckScanStatus(scanCode, ScanStatus .FINISHED )
366
+ .expectCreateScan(projectCode, scanCode, vcsInfo, "")
367
+ .expectDownload(scanCode)
368
+ .mockFiles(scanCode, pendingRange = 1..5, snippetRange = 1..5)
369
+
370
+ val fossId = createFossId(config)
371
+
372
+ val summary = fossId.scan(createPackage(pkgId, vcsInfo)).summary
373
+
374
+ val expectedPendingFile = (1..5).map(::createPendingFile).toSet()
375
+ val expectedSnippetFindings = (1..5).map(::createSnippetFindings).flatten()
376
+
377
+ summary.snippetFindings shouldHaveSize expectedPendingFile.size * 5
378
+ summary.snippetFindings.map { it.sourceLocation.path }.toSet() shouldBe expectedPendingFile
379
+ summary.snippetFindings shouldBe expectedSnippetFindings
380
+ }
381
+
344
382
" create a new project if none exists yet" {
345
383
val projectCode = projectCode(PROJECT )
346
384
val scanCode = scanCode(PROJECT , null)
@@ -1238,6 +1276,52 @@ private fun createIgnoredFile(index: Int): IgnoredFile =
1238
1276
*/
1239
1277
private fun createPendingFile (index : Int ): String = " /pending/file/$index "
1240
1278
1279
+ /* *
1280
+ * Generate a FossID snippet based on the given [index].
1281
+ */
1282
+ private fun createSnippet (index : Int ): Snippet = Snippet (
1283
+ index,
1284
+ " created$index " ,
1285
+ index,
1286
+ index,
1287
+ index,
1288
+ MatchType .PARTIAL ,
1289
+ " reason$index " ,
1290
+ " author$index " ,
1291
+ " artifact$index " ,
1292
+ " version$index " ,
1293
+ " MIT" ,
1294
+ " releaseDate$index " ,
1295
+ " mirror$index " ,
1296
+ " file$index " ,
1297
+ " fileLicense$index " ,
1298
+ " url$index " ,
1299
+ " hits$index " ,
1300
+ index,
1301
+ " updated$index " ,
1302
+ " cpe$index " ,
1303
+ " $index " ,
1304
+ " matchField$index " ,
1305
+ " classification$index " ,
1306
+ " highlighting$index "
1307
+ )
1308
+
1309
+ /* *
1310
+ * Generate a ORT snippet finding based on the given [index].
1311
+ */
1312
+ private fun createSnippetFindings (index : Int ): Set <SnippetFinding > = (1 .. 5 ).map { snippetIndex ->
1313
+ SnippetFinding (
1314
+ TextLocation (" /pending/file/$index " , TextLocation .UNKNOWN_LINE ),
1315
+ OrtSnippet (
1316
+ snippetIndex.toFloat(),
1317
+ TextLocation (" file$snippetIndex " , TextLocation .UNKNOWN_LINE ),
1318
+ ArtifactProvenance (RemoteArtifact (" url$snippetIndex " , Hash .NONE )),
1319
+ " pkg:generic/author$snippetIndex /artifact$snippetIndex @version$snippetIndex " ,
1320
+ SpdxExpression .Companion .parse(" MIT" )
1321
+ )
1322
+ )
1323
+ }.toSet()
1324
+
1241
1325
/* *
1242
1326
* Prepare this service mock to answer a request for a project with the given [projectCode]. Return a response with
1243
1327
* the given [status] and [error].
@@ -1348,12 +1432,14 @@ private fun FossIdServiceWithVersion.mockFiles(
1348
1432
identifiedRange : IntRange = IntRange .EMPTY ,
1349
1433
markedRange : IntRange = IntRange .EMPTY ,
1350
1434
ignoredRange : IntRange = IntRange .EMPTY ,
1351
- pendingRange : IntRange = IntRange .EMPTY
1435
+ pendingRange : IntRange = IntRange .EMPTY ,
1436
+ snippetRange : IntRange = IntRange .EMPTY
1352
1437
): FossIdServiceWithVersion {
1353
1438
val identifiedFiles = identifiedRange.map(::createIdentifiedFile)
1354
1439
val markedFiles = markedRange.map(::createMarkedIdentifiedFile)
1355
1440
val ignoredFiles = ignoredRange.map(::createIgnoredFile)
1356
1441
val pendingFiles = pendingRange.map(::createPendingFile)
1442
+ val snippets = snippetRange.map(::createSnippet)
1357
1443
1358
1444
coEvery { listIdentifiedFiles(USER , API_KEY , scanCode) } returns
1359
1445
PolymorphicResponseBody (
@@ -1367,6 +1453,8 @@ private fun FossIdServiceWithVersion.mockFiles(
1367
1453
PolymorphicResponseBody (status = 1 , data = PolymorphicList (ignoredFiles))
1368
1454
coEvery { listPendingFiles(USER , API_KEY , scanCode) } returns
1369
1455
PolymorphicResponseBody (status = 1 , data = PolymorphicList (pendingFiles))
1456
+ coEvery { listSnippets(USER , API_KEY , scanCode, any()) } returns
1457
+ PolymorphicResponseBody (status = 1 , data = PolymorphicList (snippets))
1370
1458
1371
1459
return this
1372
1460
}
0 commit comments