FOSSology  4.4.0
Open Source License Compliance by Open Source Software
ShowJobsDaoTest.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2015 Siemens AG
4  Author: Johannes Najjar, anupam.ghosh@siemens.com, Shaheem Azmal
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
8 
9 namespace Fossology\Lib\Dao;
10 
14 use Mockery as M;
15 
16 class ShowJobsDaoTest extends \PHPUnit\Framework\TestCase
17 {
19  private $testDb;
21  private $dbManager;
23  private $uploadDao;
25  private $showJobsDao;
27  private $uploadPermissionDao;
28 
29  private $job_pks = array(2,1);
30 
31  protected function setUp() : void
32  {
33  $this->testDb = new TestPgDb();
34  $this->dbManager = &$this->testDb->getDbManager();
35 
36  $this->testDb->createPlainTables(
37  array(
38  'upload',
39  'uploadtree',
40  'job',
41  'perm_upload',
42  'jobqueue',
43  'jobdepends',
44  ));
45  $this->testDb->createInheritedTables(array('uploadtree_a'));
46 
47  $uploadArray = array(array('upload_pk'=>1, 'uploadtree_tablename'=>'uploadtree'),
48  array('upload_pk'=>2, 'uploadtree_tablename'=>'uploadtree_a'));
49  foreach ($uploadArray as $uploadEntry) {
50  $this->dbManager->insertTableRow('upload', $uploadEntry);
51  }
52 
53  $this->dbManager->prepare($stmt = 'insert.job',
54  "INSERT INTO job (job_pk, job_queued, job_name, job_upload_fk, job_user_fk) VALUES ($1, $2, $3, $4, $5)");
55  $jobArray = array(array(1,date('c',time()-5), "FCKeditor_2.6.4.zip", 1,1 ),
56  array(2,date('c'), "zlib_1.2.8.zip", 2,2));
57  foreach ($jobArray as $uploadEntry) {
58  $this->dbManager->freeResult($this->dbManager->execute($stmt, $uploadEntry));
59  }
60 
61  $logger = M::mock('Monolog\Logger');
62  $logger->shouldReceive('debug');
63  $this->uploadPermissionDao = M::mock('Fossology\Lib\Dao\UploadPermissionDao');
64  $this->uploadDao = new UploadDao($this->dbManager, $logger, $this->uploadPermissionDao);
65  $this->showJobsDao = new ShowJobsDao($this->dbManager, $this->uploadDao);
66 
67  $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
68  }
69 
70  protected function tearDown() : void
71  {
72  $this->addToAssertionCount(\Hamcrest\MatcherAssert::getCount()-$this->assertCountBefore);
73  $this->testDb = null;
74  $this->dbManager = null;
75  }
76 
77 
78 
79  public function testUploads2Jobs()
80  {
81  $jobs = array(3=>2, 4=>3, 5=>5, 6=>8%6, 7=>13%6, 8=>21%6);
82  foreach ($jobs as $jobId => $jobUpload) {
83  $this->dbManager->insertTableRow('job', array('job_pk' => $jobId, 'job_upload_fk' => $jobUpload));
84  }
85  $uploadDao = M::mock('Fossology\Lib\Dao\UploadDao');
86  $showJobDao = new ShowJobsDao($this->dbManager,$uploadDao);
87  $jobsWithoutUpload = $showJobDao->uploads2Jobs(array());
88  assertThat($jobsWithoutUpload, is(emptyArray()));
89  $jobsWithUploadIdOne = $showJobDao->uploads2Jobs(array(1));
90  assertThat($jobsWithUploadIdOne, equalTo(array(array(1,7),0)));
91  $jobsAtAll = $showJobDao->uploads2Jobs(array(1,2,3,4,5));
92  assertThat($jobsAtAll, equalTo(array(array(1,7, 2,3,6, 4,8, 5),0)));
93  $jobsWithUploadFour = $showJobDao->uploads2Jobs(array(4));
94  assertThat($jobsWithUploadFour[0], is(emptyArray()));
95  }
96 
97  public function testUploads2JobsPaged()
98  {
99  $jobs = array_combine(range(3,13),range(3,13));
100  foreach ($jobs as $jobId => $jobUpload) {
101  $this->dbManager->insertTableRow('job', array('job_pk' => $jobId, 'job_upload_fk' => $jobUpload));
102  }
103  $uploadDao = M::mock('Fossology\Lib\Dao\UploadDao');
104  $showJobDao = new ShowJobsDao($this->dbManager,$uploadDao);
105 
106  $jobsPage1 = $showJobDao->uploads2Jobs(range(1,17),0);
107  assertThat($jobsPage1[0], arrayWithSize(10));
108  assertThat($jobsPage1[1], is(1));
109  $jobsPage2 = $showJobDao->uploads2Jobs(array_combine(range(10,16),range(11,17)),1);
110  assertThat($jobsPage2[0], arrayWithSize(3));
111  assertThat($jobsPage2[1], is(0));
112  $jobsPage3 = $showJobDao->uploads2Jobs(array(),2);
113  assertThat($jobsPage3, arrayWithSize(0));
114  }
115 
116 
117  public function testgetJobName()
118  {
119  $testJobName = $this->showJobsDao->getJobName(1);
120  assertThat($testJobName, equalTo("FCKeditor_2.6.4.zip"));
121 
122  $testJobNameIfNothingQueued = $this->showJobsDao->getJobName($uploadId = 3);
123  assertThat($testJobNameIfNothingQueued, equalTo($uploadId));
124  }
125 
126  public function testMyJobs()
127  {
128  $groupId = 2;
129  $GLOBALS['SysConf']['auth'][Auth::GROUP_ID] = $groupId;
130  $GLOBALS['SysConf']['auth'][Auth::USER_ID] = 1;
131 
132  $this->uploadPermissionDao->shouldReceive('isAccessible')->withArgs(array(anything(),$groupId))
133  ->andReturnUsing(function($upload,$group)
134  {
135  return ($upload==1 || $upload==2 || $upload==4);
136  });
137  $testOurJobs = $this->showJobsDao->myJobs(true);
138  assertThat($testOurJobs[0], is(arrayContainingInAnyOrder($this->job_pks)));
139  $testMyJobs = $this->showJobsDao->myJobs(false);
140  assertThat($testMyJobs, equalTo(array(array(1), 0)));
141 
142  $this->dbManager->queryOnce("UPDATE job SET job_queued=job_queued-INTERVAL '30 days' WHERE job_pk=1");
143  $this->dbManager->prepare(__METHOD__.'insert.perm_upload',
144  "INSERT INTO perm_upload (perm_upload_pk, perm, upload_fk, group_fk) VALUES ($1, $2, $3, $4)");
145  $testOutdatedJobs = $this->showJobsDao->myJobs(true);
146  assertThat($testOutdatedJobs, equalTo(array(array(2), 0)));
147  }
148 
149  public function testgetNumItemsPerSec()
150  {
151  $numSecs = 30;
152  $testFilesPerSec = $this->showJobsDao->getNumItemsPerSec(5*$numSecs, $numSecs);
153  assertThat($testFilesPerSec,is(greaterThan(1)));
154 
155  $testFilesPerSec = $this->showJobsDao->getNumItemsPerSec(0.9*$numSecs, $numSecs);
156  assertThat($testFilesPerSec,is(lessThanOrEqualTo(1)));
157  }
158 
159  public function testGetJobInfo()
160  {
161  $this->dbManager->prepare($stmt = 'insert.jobqueue',
162  "INSERT INTO jobqueue (jq_pk, jq_job_fk, jq_type, jq_args, jq_starttime, jq_endtime, jq_endtext, jq_end_bits, jq_schedinfo, jq_itemsprocessed)"
163  . "VALUES ($1, $2, $3, $4,$5, $6,$7,$8,$9,$10)");
164 
165  $nowTime = time();
166  $diffTime = 2345;
167  $nomosTime = date('Y-m-d H:i:sO',$nowTime-$diffTime);
168  $uploadArrayQue = array(array(8, $jobId=1, "nomos", 1,$nomosTime,null ,"Started", 0,"localhost.5963", $itemNomos=147),
169  array(1, $jobId, "ununpack", 1, "2015-04-21 18:29:19.23825+05:30", "2015-04-21 18:29:26.396562+05:30", "Completed",1,null,$itemCount=646 ));
170  foreach ($uploadArrayQue as $uploadEntry) {
171  $this->dbManager->freeResult($this->dbManager->execute($stmt, $uploadEntry));
172  }
173 
174  $this->dbManager->prepare($stmt = 'insert.uploadtree_a',
175  "INSERT INTO uploadtree_a (uploadtree_pk, parent, upload_fk, pfile_fk, ufile_mode, lft, rgt, ufile_name)"
176  . "VALUES ($1, $2, $3, $4,$5, $6, $7, $8)");
177  $uploadTreeArray = array(array(123, 121, 1, 103, 32768, 542, 543, "fckeditorcode_ie.js"),
178  array(121,120, 1, 0, 536888320, 537, 544, "js"),
179  array(715,651, 2,607 ,33188 ,534 ,535 ,"zconf.h.cmakein"),
180  array(915, 651, 2, 606 ,33188 ,532 ,533 ,"zconf.h"),
181  );
182  foreach ($uploadTreeArray as $uploadEntry) {
183  $this->dbManager->freeResult($this->dbManager->execute($stmt, $uploadEntry));
184  }
185 
186  $this->dbManager->prepare($stmt = 'insert.jobdepends',
187  "INSERT INTO jobdepends (jdep_jq_fk, jdep_jq_depends_fk) VALUES ($1, $2 )");
188  $jqWithTwoDependencies = 8;
189  $jobDependsArray = array(array(2,1),
190  array(3,2),
191  array(4,2),
192  array(5,2),
193  array(6,2),
194  array($jqWithTwoDependencies,4),
195  array($jqWithTwoDependencies,4),
196  );
197  foreach ($jobDependsArray as $uploadEntry) {
198  $this->dbManager->freeResult($this->dbManager->execute($stmt, $uploadEntry));
199  }
200 
201  $testMyJobInfo = $this->showJobsDao->getJobInfo($this->job_pks);
202  assertThat($testMyJobInfo,hasKey($jobId));
203  assertThat($testMyJobInfo[$jobId]['jobqueue'][$jqWithTwoDependencies]['depends'], is(arrayWithSize(2)));
204 
205  $testFilesPerSec = 0.23;
206  $formattedEstimatedTime = $this->showJobsDao->getEstimatedTime($job_pk=1, $jq_Type="nomos", $testFilesPerSec);
207  assertThat($formattedEstimatedTime, matchesPattern ('/\\d+:\\d{2}:\\d{2}/'));
208  $hourMinSec = explode(':', $formattedEstimatedTime);
209  assertThat($hourMinSec[0]*3600+$hourMinSec[1]*60+$hourMinSec[2],
210  is(closeTo(($itemCount-$itemNomos)/$testFilesPerSec,0.5+$testFilesPerSec)));
211 
212  $testGetEstimatedTime = $this->showJobsDao->getEstimatedTime($job_pk=1, $jq_Type, 0);
213  assertThat($testGetEstimatedTime, matchesPattern ('/\\d+:\\d{2}:\\d{2}/'));
214  $hourMinSec = explode(':', $testGetEstimatedTime);
215  $tolerance = 0.5+($itemCount-$itemNomos)/$itemNomos+(time()-$nowTime);
216  assertThat($hourMinSec[0]*3600+$hourMinSec[1]*60+$hourMinSec[2],
217  is(closeTo(($itemCount-$itemNomos)/$itemNomos*$diffTime,$tolerance)));
218 
219  $fewFilesPerSec = 0.003;
220  $formattedLongTime = $this->showJobsDao->getEstimatedTime($job_pk=1, $jq_Type="nomos", $fewFilesPerSec);
221  assertThat($formattedLongTime, matchesPattern ('/\\d+:\\d{2}:\\d{2}/'));
222  $hourMinSec = explode(':', $formattedLongTime);
223  assertThat($hourMinSec[0]*3600+$hourMinSec[1]*60+$hourMinSec[2],
224  is(closeTo(($itemCount-$itemNomos)/$fewFilesPerSec,0.5+$fewFilesPerSec)));
225  }
226 
227  public function testGetEstimatedTimeShouldNotDivideByZero()
228  {
229  $this->dbManager->prepare($stmt = 'insert.jobqueue',
230  "INSERT INTO jobqueue (jq_pk, jq_job_fk, jq_type, jq_args, jq_starttime, jq_endtime, jq_endtext, jq_end_bits, jq_schedinfo, jq_itemsprocessed)"
231  . "VALUES ($1, $2, $3, $4,$5, $6,$7,$8,$9,$10)");
232 
233  $nowTime = time();
234  $diffTime = 2345;
235  $nomosTime = date('Y-m-d H:i:sO',$nowTime-$diffTime);
236  $uploadArrayQue = array(array(8, $jobId=1, $jqType="nomos", 1,$nomosTime,null ,"Started", 0,"localhost.5963", $itemNomos=147),
237  array(1, $jobId, "ununpack", 1, "2015-04-21 18:29:19.23825+05:30", "2015-04-21 18:29:26.396562+05:30", "Completed",1,null,$itemCount=646 ));
238  foreach ($uploadArrayQue as $uploadEntry) {
239  $this->dbManager->freeResult($this->dbManager->execute($stmt, $uploadEntry));
240  }
241 
242  $showJobsDaoMock = M::mock('Fossology\\Lib\\Dao\\ShowJobsDao[getNumItemsPerSec]',array($this->dbManager, $this->uploadDao));
243  $showJobsDaoMock->shouldReceive('getNumItemsPerSec')->andReturn(0);
244 
245  $estimated = $showJobsDaoMock->getEstimatedTime($jobId, $jqType);
246  assertThat($estimated, equalTo('0:00:00'));
247  }
248 }
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16