25 function ReportCachePurgeAll()
33 const PERCENTAGE = 315;
35 private $uploadTreeId;
41 private $agentLicenseEventProcessor;
47 private $itemTreeBounds;
49 private $clearingDecisionProcessor;
51 private $clearingEventProcessor;
55 private $includeSubFolders;
57 protected function setUp() :
void
59 $this->uploadTreeId = 432;
63 $this->timestamp = time();
64 $this->includeSubFolders =
false;
66 $this->clearingDao = M::mock(ClearingDao::class);
67 $this->agentLicenseEventProcessor = M::mock(AgentLicenseEventProcessor::class);
70 $this->itemTreeBounds = M::mock(ItemTreeBounds::class);
71 $this->itemTreeBounds->shouldReceive(
"getItemId")->withNoArgs()->andReturn($this->uploadTreeId);
72 $this->itemTreeBounds->shouldReceive(
"getPfileId")->withNoArgs()->andReturn($this->pfileId);
74 $this->
dbManager = M::mock(DbManager::class);
75 $this->
dbManager->shouldReceive(
'begin')->withNoArgs();
76 $this->
dbManager->shouldReceive(
'commit')->withNoArgs();
79 $this->clearingDao, $this->agentLicenseEventProcessor, $this->clearingEventProcessor,
81 $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
84 protected function tearDown() :
void
86 $this->addToAssertionCount(\Hamcrest\MatcherAssert::getCount()-$this->assertCountBefore);
90 public function testMakeDecisionFromLastEvents()
92 $isGlobal = DecisionScopes::ITEM;
95 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
96 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
97 ->andReturn(array($addedEvent));
98 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
99 ->with($this->itemTreeBounds)
100 ->andReturn(array());
102 $clearingDecision = M::mock(ClearingDecision::class);
103 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
104 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IDENTIFIED);
105 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
107 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
108 ->with($this->itemTreeBounds, $this->groupId)
109 ->andReturn($clearingDecision);
111 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()
112 ->with($this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, $isGlobal, is(arrayContainingInAnyOrder(123)));
114 $this->clearingDecisionProcessor->makeDecisionFromLastEvents($this->itemTreeBounds, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, $isGlobal);
117 public function testMakeDecisionFromLastEventsWithNoLicenseKnownTypeShouldNotCreateANewDecisionWhenNoLicensesShouldBeRemoved()
119 $isGlobal = DecisionScopes::REPO;
122 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
123 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
124 ->andReturn(array($addedEvent));
125 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
126 ->with($this->itemTreeBounds)->andReturn(array());
128 $clearingDecision = M::mock(ClearingDecision::class);
129 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
130 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IDENTIFIED);
131 $clearingDecision->shouldReceive(
"getScope")->withNoArgs()->andReturn(DecisionScopes::ITEM);
132 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
134 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
135 ->with($this->itemTreeBounds, $this->groupId)
136 ->andReturn($clearingDecision);
138 $this->clearingDao->shouldReceive(
"insertClearingEvent")->with($this->itemTreeBounds->getItemId(), $this->userId, $this->groupId, $addedEvent->getLicenseId(),
true)->andReturn($eventId);
140 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()->with($this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, $isGlobal, array($eventId));
141 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
146 public function testMakeDecisionFromLastEventsWithNoLicenseKnownTypeShouldNotCreateANewDecisionWhenNoLicensesShouldBeRemovedAndTheScopeDoesNotChange()
148 $isGlobal = DecisionScopes::REPO;
151 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
152 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
153 ->andReturn(array($addedEvent));
154 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
155 ->with($this->itemTreeBounds)->andReturn(array());
157 $clearingDecision = M::mock(ClearingDecision::class);
158 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
159 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IDENTIFIED);
160 $clearingDecision->shouldReceive(
"getScope")->withNoArgs()->andReturn($isGlobal);
161 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
163 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
164 ->with($this->itemTreeBounds, $this->groupId)
165 ->andReturn($clearingDecision);
168 $this->clearingDao->shouldReceive(
"insertClearingEvent")->with($this->itemTreeBounds->getItemId(), $this->userId, $this->groupId, $addedEvent->getLicenseId(),
true)->andReturn($eventId);
169 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()->with($this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, $isGlobal, array($eventId));
170 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
175 public function testMakeDecisionFromLastEventsWithNoLicenseKnownType()
179 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
180 ->with($this->itemTreeBounds)->andReturn(array());
182 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
183 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
184 ->andReturn(array());
186 $clearingDecision = M::mock(ClearingDecision::class);
187 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
188 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IRRELEVANT);
189 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
191 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
192 ->with($this->itemTreeBounds, $this->groupId)
193 ->andReturn($clearingDecision);
195 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()->with( $this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, DecisionScopes::REPO, array());
196 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
201 public function testMakeDecisionFromLastEventsWithNoLicenseKnownTypeAndAnExistingAddingUserEvent()
205 $addedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId(), $licenseRef->getShortName(), $licenseRef->getFullName(), ClearingEventTypes::USER, $isRemoved =
false);
209 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
210 ->with($this->itemTreeBounds)->andReturn(array());
212 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
213 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
214 ->andReturn(array($licenseRef->getId() => $addedEvent));
216 $clearingDecision = M::mock(ClearingDecision::class);
217 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
218 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IRRELEVANT);
219 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
221 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
222 ->with($this->itemTreeBounds, $this->groupId)
223 ->andReturn($clearingDecision);
226 $this->clearingDao->shouldReceive(
"insertClearingEvent")->with($this->itemTreeBounds->getItemId(), $this->userId, $this->groupId, $addedEvent->getLicenseId(),
true)->andReturn($eventId);
227 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()->with( $this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, DecisionScopes::REPO, array($eventId));
228 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
233 public function testMakeDecisionFromLastEventsWithNoLicenseKnownTypeAndAnExistingRemovingUserEvent()
237 $removedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId(), $licenseRef->getShortName(), $licenseRef->getFullName(), ClearingEventTypes::USER, $isRemoved =
true);
241 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
242 ->with($this->itemTreeBounds)->andReturn(array());
244 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
245 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
246 ->andReturn(array($licenseRef->getId() => $removedEvent));
248 $clearingDecision = M::mock(ClearingDecision::class);
249 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
250 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IRRELEVANT);
251 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
253 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
254 ->with($this->itemTreeBounds, $this->groupId)
255 ->andReturn($clearingDecision);
257 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->once()->with( $this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, DecisionScopes::REPO, array());
258 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
265 public function testMakeDecisionFromLastEventsWithDelayedScanner()
271 $removedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId(), $licenseRef->getShortName(), $licenseRef->getFullName(), ClearingEventTypes::USER, $isRemoved =
true);
273 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
274 ->with($this->itemTreeBounds, $this->groupId, $this->includeSubFolders)
275 ->andReturn(array($licenseRef->getId() => $removedEvent));
277 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
278 ->with($this->itemTreeBounds)->andReturn($scannerResults);
280 $clearingDecision = M::mock(ClearingDecision::class);
281 $clearingDecision->shouldReceive(
"getTimeStamp")->withNoArgs()->andReturn($this->timestamp-3600);
282 $clearingDecision->shouldReceive(
"getType")->withNoArgs()->andReturn(DecisionTypes::IDENTIFIED);
283 $clearingDecision->shouldReceive(
"getClearingEvents")->withNoArgs()->andReturn(array());
285 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")
286 ->with($this->itemTreeBounds,$this->groupId)
287 ->andReturn($clearingDecision);
289 $this->clearingDao->shouldReceive(
"insertClearingEvent")
292 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")
294 ->with($this->uploadTreeId, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, DecisionScopes::ITEM,
295 is(arrayContainingInAnyOrder($removedEvent->getEventId())));
296 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
298 $this->clearingDecisionProcessor->makeDecisionFromLastEvents($this->itemTreeBounds, $this->userId, $this->groupId, DecisionTypes::IDENTIFIED, $isGlobal);
301 public function testMakeDecisionFromLastEventsWithInvalidType()
303 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")->never();
304 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerDetectedLicenses")->never();
305 $this->clearingDao->shouldReceive(
"getRelevantClearingDecision")->never();
307 $this->clearingDao->shouldReceive(
"createDecisionFromEvents")->never();
308 $this->clearingDao->shouldReceive(
"removeWipClearingDecision")->never();
313 public function testGetCurrentClearingsWithoutDecisions()
315 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
316 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)
317 ->andReturn(array());
318 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")->with($this->itemTreeBounds, $this->groupId)->andReturn(array());
320 list($licenseDecisions, $removedClearings) = $this->clearingDecisionProcessor->getCurrentClearings($this->itemTreeBounds, $this->groupId);
322 assertThat($licenseDecisions, is(emptyArray()));
323 assertThat($removedClearings, is(emptyArray()));
326 public function testGetCurrentClearingsWithUserDecisionsOnly()
328 $addedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseId=13,
"licA",
"License A");
330 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
331 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)
332 ->andReturn(array());
333 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
334 ->with($this->itemTreeBounds, $this->groupId)
335 ->andReturn(array($licenseId => $addedEvent));
337 list($licenseDecisions, $removedClearings) = $this->clearingDecisionProcessor->getCurrentClearings($this->itemTreeBounds, $this->groupId);
339 assertThat($licenseDecisions, is(arrayWithSize(1)));
342 $result = $licenseDecisions[$addedEvent->getLicenseId()];
343 assertThat($result->getLicenseRef(), is($addedEvent->getLicenseRef()));
344 assertThat($result->getClearingEvent(), is($addedEvent));
345 assertThat($result->getAgentDecisionEvents(), is(emptyArray()));
346 assertThat($removedClearings, is(emptyArray()));
349 public function testGetCurrentClearingsWithAgentDecisionsOnly()
353 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
354 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)
355 ->andReturn($scannerResults);
356 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
357 ->with($this->itemTreeBounds, $this->groupId)
358 ->andReturn(array());
360 list($licenseDecisions, $removedClearings) = $this->clearingDecisionProcessor->getCurrentClearings($this->itemTreeBounds, $this->groupId);
362 assertThat($licenseDecisions, is(arrayWithSize(1)));
365 $result = $licenseDecisions[$licenseRef->getId()];
366 assertThat($result->getLicenseRef(), is($licenseRef));
367 assertThat($result->getClearingEvent(), is(nullValue()));
368 assertThat($result->getAgentDecisionEvents(), is(arrayWithSize(1)));
369 assertThat($removedClearings, is(emptyArray()));
372 public function testGetCurrentClearingsWithUserAndAgentDecision()
377 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
378 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)
379 ->andReturn($scannerResults);
381 $licenseId = $licenseRef->getId();
383 $addedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseId, $licenseRef->getShortName(), $licenseRef->getFullName());
384 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
385 ->with($this->itemTreeBounds, $this->groupId)
386 ->andReturn(array($licenseId => $addedEvent));
388 list($licenseDecisions, $removedClearings) = $this->clearingDecisionProcessor->getCurrentClearings($this->itemTreeBounds, $this->groupId);
390 assertThat($licenseDecisions, is(arrayWithSize(1)));
393 $result = $licenseDecisions[$licenseRef->getId()];
394 assertThat($result->getLicenseRef(), is($licenseRef));
395 assertThat($result->getClearingEvent(), is($addedEvent));
396 assertThat($result->getAgentDecisionEvents(), is(arrayWithSize(1)));
397 assertThat($removedClearings, is(emptyArray()));
400 public function testGetCurrentClearingsWithUserRemovedDecisionsOnly()
404 $removedEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId(), $licenseRef->getShortName(), $licenseRef->getFullName(), ClearingEventTypes::USER,
true);
406 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
407 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)->andReturn($scannerResults);
409 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
410 ->with($this->itemTreeBounds, $this->groupId)
411 ->andReturn(array($licenseRef->getId() => $removedEvent));
413 list($licenseDecisions, $removedClearings) = $this->clearingDecisionProcessor->getCurrentClearings($this->itemTreeBounds, $this->groupId);
415 assertThat($licenseDecisions, is(emptyArray()));
416 assertThat($removedClearings, is(arrayWithSize(1)));
419 $result = $removedClearings[$removedEvent->getLicenseId()];
420 assertThat($result->getLicenseRef(), is($removedEvent->getLicenseRef()));
421 assertThat($result->getClearingEvent(), is($removedEvent));
422 $agentClearingEvents = $result->getAgentDecisionEvents();
423 assertThat($agentClearingEvents, is(arrayWithSize(1)));
425 $agentEvent = $agentClearingEvents[0];
427 assertThat($agentEvent->getAgentRef(), is($agentRef));
428 assertThat($agentEvent->getLicenseRef(), is($licenseRef));
429 assertThat($agentEvent->getMatchId(), is(self::MATCH_ID));
430 assertThat($agentEvent->getPercentage(), is(self::PERCENTAGE));
433 public function testGetUnhandledScannerDetectedLicenses()
438 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
439 ->with($this->itemTreeBounds, $this->groupId)
440 ->andReturn(array());
441 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
442 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)->andReturn($scannerResults);
444 $hasUnhandledScannerDetectedLicenses = $this->clearingDecisionProcessor->hasUnhandledScannerDetectedLicenses($this->itemTreeBounds, $this->groupId);
446 assertThat($hasUnhandledScannerDetectedLicenses);
449 public function testGetUnhandledScannerDetectedLicensesWithMatch()
453 $clearingEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId(), $licenseRef->getShortName(), $licenseRef->getFullName());
455 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")->once()
456 ->with($this->itemTreeBounds, $this->groupId)
457 ->andReturn(array($clearingEvent->getLicenseId()=>$clearingEvent));
458 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")->once()
459 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)->andReturn($scannerResults);
461 $hasUnhandledScannerDetectedLicenses = $this->clearingDecisionProcessor->hasUnhandledScannerDetectedLicenses($this->itemTreeBounds, $this->groupId);
463 assertThat( $hasUnhandledScannerDetectedLicenses, is(False));
466 public function testGetUnhandledScannerDetectedLicensesWithoutMatch()
471 $clearingEvent = $this->
createClearingEvent(123, $this->timestamp, $licenseRef->getId()+$offset, $licenseRef->getShortName(), $licenseRef->getFullName());
473 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
474 ->with($this->itemTreeBounds, $this->groupId)
475 ->andReturn(array($clearingEvent->getLicenseId()=>$clearingEvent));
476 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
477 ->with($this->itemTreeBounds,LicenseMap::TRIVIAL)->andReturn($scannerResults);
479 $hasUnhandledScannerDetectedLicenses = $this->clearingDecisionProcessor->hasUnhandledScannerDetectedLicenses($this->itemTreeBounds, $this->groupId);
481 assertThat($hasUnhandledScannerDetectedLicenses, is(True));
484 public function testGetUnhandledScannerDetectedLicensesWithMappedMatch()
489 $clearingEvent = $this->
createClearingEvent($eventId=123, $this->timestamp, $licenseRef->getId()+$offset, $licenseRef->getShortName(), $licenseRef->getFullName());
491 $this->clearingDao->shouldReceive(
"getRelevantClearingEvents")
492 ->with($this->itemTreeBounds, $this->groupId)
493 ->andReturn(array($clearingEvent->getLicenseId()=>$clearingEvent));
494 $this->agentLicenseEventProcessor->shouldReceive(
"getScannerEvents")
495 ->with($this->itemTreeBounds,LicenseMap::CONCLUSION)->andReturn($scannerResults);
497 $licenseMap = M::mock(LicenseMap::class);
498 $licenseMap->shouldReceive(
'getProjectedId')->andReturnUsing(
function($id) {
501 $licenseMap->shouldReceive(
'getUsage')->andReturn(LicenseMap::CONCLUSION);
503 $hasUnhandledScannerDetectedLicenses = $this->clearingDecisionProcessor->hasUnhandledScannerDetectedLicenses($this->itemTreeBounds, $this->groupId, array(), $licenseMap);
505 assertThat( $hasUnhandledScannerDetectedLicenses, is(False) );
520 private function createClearingEvent($eventId, $timestamp, $licenseId, $licenseShortName, $licenseFullName, $eventType = ClearingEventTypes::USER, $isRemoved =
false, $reportInfo =
"<reportInfo>", $comment =
"<comment>")
522 $licenseRef =
new LicenseRef($licenseId, $licenseShortName, $licenseFullName, $licenseShortName);
523 $clearingLicense =
new ClearingLicense($licenseRef, $isRemoved, $reportInfo, $comment);
524 return new ClearingEvent($eventId, $this->uploadTreeId, $timestamp, $this->userId, $this->groupId, $eventType, $clearingLicense);
532 $licenseRef =
new LicenseRef($licenseId, $licenseShortname, $licenseFullName, $licenseShortname);
534 $agentRef = M::mock(AgentRef::class);
536 $scannerEvents = array(
537 $licenseId => array(
new AgentClearingEvent($licenseRef, $agentRef, self::MATCH_ID, self::PERCENTAGE))
540 return array($scannerEvents, $licenseRef, $agentRef);
createClearingEvent($eventId, $timestamp, $licenseId, $licenseShortName, $licenseFullName, $eventType=ClearingEventTypes::USER, $isRemoved=false, $reportInfo="<reportInfo>", $comment="<comment>")
createScannerDetectedLicenses($licenseId=13, $licenseShortname="licA", $licenseFullName="License-A")
Utility functions to process ClearingDecision.
const NO_LICENSE_KNOWN_DECISION_TYPE
Functions to process clearing events.
fo_dbManager * dbManager
fo_dbManager object
Contains business rules for FOSSology.