FOSSology  4.6.0
Open Source License Compliance by Open Source Software
testGetMetadataDebBinary.c
Go to the documentation of this file.
1 /*
2  SPDX-FileCopyrightText: © 2011-2014 Hewlett-Packard Development Company, L.P.
3 
4  SPDX-License-Identifier: GPL-2.0-only
5 */
6 #include "pkgagent.h"
7 
8 #include <stdio.h>
9 #include "CUnit/CUnit.h"
10 
11 #define MAXSQL 4096
12 extern char *DBConfFile;
24 long prepare_Database(PGconn *db_conn, struct debpkginfo *pi)
25 {
26  long upload_pk;
27  char SQL[MAXSQL];
28  PGresult *result;
29  long control_pfilepk;
30 
31  memset(SQL,'\0',MAXSQL);
32  snprintf(SQL,MAXSQL,"BEGIN;");
33  result = PQexec(db_conn, SQL);
34  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
35  {
36  printf("Perpare pfile information ERROR!\n");
37  PQclear(result);
38  return (-1);
39  }
40  PQclear(result);
41 
42  /* insert mimetype */
43  memset(SQL,'\0',MAXSQL);
44  snprintf(SQL,MAXSQL,"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-rpm');");
45  result = PQexec(db_conn, SQL);
46  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
47  {
48  printf("Perpare mimetype information ERROR!\n");
49  PQclear(result);
50  return (-1);
51  }
52  PQclear(result);
53  memset(SQL,'\0',MAXSQL);
54  snprintf(SQL,MAXSQL,"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-debian-package');");
55  result = PQexec(db_conn, SQL);
56  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
57  {
58  printf("Perpare mimetype information ERROR!\n");
59  PQclear(result);
60  return (-1);
61  }
62  PQclear(result);
63  memset(SQL,'\0',MAXSQL);
64  snprintf(SQL,MAXSQL,"INSERT INTO mimetype (mimetype_name) VALUES ('application/x-debian-source');");
65  result = PQexec(db_conn, SQL);
66  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
67  {
68  printf("Perpare mimetype information ERROR!\n");
69  PQclear(result);
70  return (-1);
71  }
72  PQclear(result);
73  memset(SQL,'\0',MAXSQL);
74  snprintf(SQL,MAXSQL,"INSERT INTO mimetype (mimetype_name) VALUES ('application/vnd.debian.binary-package');");
75  result = PQexec(db_conn, SQL);
76  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
77  {
78  printf("Perpare modern debian mimetype information ERROR!\n");
79  PQclear(result);
80  return (-1);
81  }
82  PQclear(result);
83 
84  /* insert pfile: fossology-web_1.4.1_all.deb */
85  memset(SQL,'\0',MAXSQL);
86  snprintf(SQL,MAXSQL,"INSERT INTO pfile (pfile_sha1,pfile_md5,pfile_size) VALUES ('%.40s','%.32s','%s');",
87  "AF1DF2C4B32E4115DB5F272D9EFD0E674CF2A0BC","2239AA7DAC291B6F8D0A56396B1B8530","4560");
88  result = PQexec(db_conn, SQL);
89  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
90  {
91  printf("Perpare pfile information ERROR!\n");
92  PQclear(result);
93  return (-1);
94  }
95  PQclear(result);
96  /* insert pfile: control */
97  memset(SQL,'\0',MAXSQL);
98  snprintf(SQL,MAXSQL,"INSERT INTO pfile (pfile_sha1,pfile_md5,pfile_size) VALUES ('%.40s','%.32s','%s');",
99  "F1D2319DF20ABC4CEB02CA5A3C2021BD87B26810","87972FC55E2CDD2609ED85051BE50BAF","722");
100  result = PQexec(db_conn, SQL);
101  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
102  {
103  printf("Perpare pfile information ERROR!\n");
104  PQclear(result);
105  return (-1);
106  }
107  PQclear(result);
108 
109  /* select pfile_pk: fossology-web_1.4.1_all.deb */
110  memset(SQL,'\0',MAXSQL);
111  snprintf(SQL,MAXSQL,"SELECT pfile_pk FROM pfile WHERE pfile_sha1 = '%.40s' AND pfile_md5 = '%.32s' AND pfile_size = '%s';",
112  "AF1DF2C4B32E4115DB5F272D9EFD0E674CF2A0BC","2239AA7DAC291B6F8D0A56396B1B8530","4560");
113  result = PQexec(db_conn, SQL);
114  if (fo_checkPQresult(db_conn, result, SQL, __FILE__, __LINE__))
115  {
116  printf("Get pfile information ERROR!\n");
117  PQclear(result);
118  return (-1);
119  }
120  pi->pFileFk = atoi(PQgetvalue(result, 0, 0));
121  PQclear(result);
122 
123  /* select pfile_pk: control */
124  memset(SQL,'\0',MAXSQL);
125  snprintf(SQL,MAXSQL,"SELECT pfile_pk FROM pfile WHERE pfile_sha1 = '%.40s' AND pfile_md5 = '%.32s' AND pfile_size = '%s';",
126  "F1D2319DF20ABC4CEB02CA5A3C2021BD87B26810","87972FC55E2CDD2609ED85051BE50BAF","722");
127  result = PQexec(db_conn, SQL);
128  if (fo_checkPQresult(db_conn, result, SQL, __FILE__, __LINE__))
129  {
130  printf("Get pfile information ERROR!\n");
131  PQclear(result);
132  return (-1);
133  }
134  control_pfilepk = atoi(PQgetvalue(result, 0, 0));
135  PQclear(result);
136 
137  /* insert upload: fossology-web_1.4.1_all.deb */
138  memset(SQL,'\0',MAXSQL);
139  snprintf(SQL,MAXSQL,"INSERT INTO upload (upload_filename,upload_mode,upload_ts,pfile_fk) VALUES ('%s',40,now(),%ld);",
140  "fossology-web_1.4.1_all.deb", pi->pFileFk);
141  result = PQexec(db_conn, SQL);
142  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
143  {
144  printf("Perpare pfile information ERROR!\n");
145  PQclear(result);
146  exit(-1);
147  }
148  PQclear(result);
149  memset(SQL,'\0',MAXSQL);
150  snprintf(SQL,MAXSQL,"SELECT upload_pk FROM upload WHERE pfile_fk = '%ld';",
151  pi->pFileFk);
152  result = PQexec(db_conn, SQL);
153  if (fo_checkPQresult(db_conn, result, SQL, __FILE__, __LINE__))
154  {
155  printf("Get pfile information ERROR!\n");
156  PQclear(result);
157  return (-1);
158  }
159  upload_pk = atoi(PQgetvalue(result, 0, 0));
160  PQclear(result);
161 
162  /* insert uploadtree_a: fossology-web_1.4.1_all.deb */
163  memset(SQL,'\0',MAXSQL);
164  snprintf(SQL,MAXSQL,"INSERT INTO uploadtree_a (upload_fk,pfile_fk,lft,rgt,ufile_name) VALUES (%ld,%ld,1,48,'fossology-web_1.4.1_all.deb');",
165  upload_pk, pi->pFileFk);
166  result = PQexec(db_conn, SQL);
167  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
168  {
169  printf("Perpare pfile information ERROR!\n");
170  PQclear(result);
171  return (-1);
172  }
173  PQclear(result);
174  /* insert uploadtree_a: control */
175  memset(SQL,'\0',MAXSQL);
176  snprintf(SQL,MAXSQL,"INSERT INTO uploadtree_a (upload_fk,pfile_fk,lft,rgt,ufile_name) VALUES (%ld,%ld,9,10,'control');",
177  upload_pk, control_pfilepk);
178  result = PQexec(db_conn, SQL);
179  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
180  {
181  printf("Perpare pfile information ERROR!\n");
182  PQclear(result);
183  return (-1);
184  }
185  PQclear(result);
186 
187  memset(SQL,'\0',MAXSQL);
188  snprintf(SQL,MAXSQL,"COMMIT;");
189  result = PQexec(db_conn, SQL);
190  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
191  {
192  printf("Perpare pfile information ERROR!\n");
193  PQclear(result);
194  return (-1);
195  }
196  PQclear(result);
197 
198  return upload_pk;
199 }
200 
206 {
207  char *Source = "./testdata/control";
208  char *Pfile = "F1D2319DF20ABC4CEB02CA5A3C2021BD87B26810.87972FC55E2CDD2609ED85051BE50BAF.722";
209  if (!fo_RepExist("files",Pfile))
210  {
211  if (fo_RepImport(Source, "files", Pfile, 1) != 0)
212  {
213  printf("Failed to import %s\n", Source);
214  return (-1);
215  }
216  }
217  return (0);
218 }
219 
227 int remove_Database(PGconn *db_conn, struct debpkginfo *pi, long upload_pk)
228 {
229  char SQL[MAXSQL];
230  PGresult *result;
231 
232  memset(SQL,'\0',MAXSQL);
233  snprintf(SQL,MAXSQL,"BEGIN;");
234  result = PQexec(db_conn, SQL);
235  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
236  {
237  printf("Remove pfile database information ERROR!\n");
238  PQclear(result);
239  return (-1);
240  }
241  PQclear(result);
242 
243  memset(SQL,'\0',MAXSQL);
244  snprintf(SQL,MAXSQL,"DELETE FROM mimetype;");
245  result = PQexec(db_conn, SQL);
246  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
247  {
248  printf("Remove mimetype information ERROR!\n");
249  PQclear(result);
250  return (-1);
251  }
252  PQclear(result);
253 
254  memset(SQL,'\0',MAXSQL);
255  snprintf(SQL,MAXSQL,"DELETE FROM uploadtree_a WHERE upload_fk = %ld;", upload_pk);
256  result = PQexec(db_conn, SQL);
257  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
258  {
259  printf("Remove pfile database information ERROR!\n");
260  PQclear(result);
261  return (-1);
262  }
263  PQclear(result);
264 
265  memset(SQL,'\0',MAXSQL);
266  snprintf(SQL,MAXSQL,"DELETE FROM upload WHERE upload_pk = %ld;", upload_pk);
267  result = PQexec(db_conn, SQL);
268  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
269  {
270  printf("Remove pfile database information ERROR!\n");
271  PQclear(result);
272  return (-1);
273  }
274  PQclear(result);
275 
276  memset(SQL,'\0',MAXSQL);
277  snprintf(SQL,MAXSQL,"DELETE FROM pfile WHERE pfile_pk = %ld;", pi->pFileFk);
278  result = PQexec(db_conn, SQL);
279  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
280  {
281  printf("Remove pfile database information ERROR!\n");
282  PQclear(result);
283  return (-1);
284  }
285  PQclear(result);
286 
287  memset(SQL,'\0',MAXSQL);
288  snprintf(SQL,MAXSQL,"DELETE FROM pfile WHERE pfile_sha1 = '%.40s' AND pfile_md5 = '%.32s' AND pfile_size = '%s';", "F1D2319DF20ABC4CEB02CA5A3C2021BD87B26810","87972FC55E2CDD2609ED85051BE50BAF","722");
289  result = PQexec(db_conn, SQL);
290  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
291  {
292  printf("Remove pfile database 'control' ERROR!\n");
293  PQclear(result);
294  return (-1);
295  }
296  PQclear(result);
297 
298  memset(SQL,'\0',MAXSQL);
299  snprintf(SQL,MAXSQL,"COMMIT;");
300  result = PQexec(db_conn, SQL);
301  if (fo_checkPQcommand(db_conn, result, SQL, __FILE__ ,__LINE__))
302  {
303  printf("Perpare pfile information ERROR!\n");
304  PQclear(result);
305  return (-1);
306  }
307  PQclear(result);
308 
309  return (0);
310 }
311 
317 {
318  char *Pfile = "F1D2319DF20ABC4CEB02CA5A3C2021BD87B26810.87972FC55E2CDD2609ED85051BE50BAF.722";
319  if (fo_RepExist("files",Pfile))
320  {
321  if (fo_RepRemove("files", Pfile) != 0)
322  {
323  printf("Failed to remove %s\n", Pfile);
324  return (-1);
325  }
326  }
327  return (0);
328 }
329 
339 {
340  struct debpkginfo *pi;
341  long upload_pk;
342  //char *DBConfFile = NULL; /* use default Db.conf */
343  char *ErrorBuf;
344 
345  pi = (struct debpkginfo *)malloc(sizeof(struct debpkginfo));
346  memset(pi, 0, sizeof(struct debpkginfo));
347  int predictValue = 0;
348 
349  /* perpare testing data in database */
350  db_conn = fo_dbconnect(DBConfFile, &ErrorBuf);
351 
353  if (upload_pk == -1)
354  CU_FAIL_FATAL("Prepare database data ERROR!");
355 
356  if (prepare_Repository() == -1)
357  {
359  CU_FAIL_FATAL("Prepare repository data ERROR!");
360  }
361 
362  /* Test GetMetadataDebBinary function */
364  //printf("GetMetadataDebBinary Result is:%d\n", Result);
365 
366  /* Check data correction */
367  CU_ASSERT_STRING_EQUAL(pi->pkgName, "fossology-web");
368  CU_ASSERT_STRING_EQUAL(pi->pkgArch, "all");
369  CU_ASSERT_STRING_EQUAL(pi->version, "1.4.1");
370  CU_ASSERT_STRING_EQUAL(pi->section, "utils");
371  CU_ASSERT_STRING_EQUAL(pi->priority, "extra");
372  CU_ASSERT_STRING_EQUAL(pi->maintainer, "Matt Taggart <taggart@debian.org>");
373  CU_ASSERT_STRING_EQUAL(pi->homepage, "http://fossology.org");
374  CU_ASSERT_EQUAL(pi->dep_size, 3);
375 
376  CU_ASSERT_EQUAL(Result, predictValue);
377 
378  /* Clear testing data in database */
379  if (remove_Database(db_conn, pi, upload_pk) == -1)
380  CU_FAIL_FATAL("Remove database data ERROR!");
381  if (remove_Repository() == -1)
382  CU_FAIL_FATAL("Remove repository data ERROR!");
383 
384  PQfinish(db_conn);
385  int i;
386  for(i=0; i< pi->dep_size;i++)
387  free(pi->depends[i]);
388  free(pi->depends);
389  memset(pi, 0, sizeof(struct debpkginfo));
390  free(pi);
391 }
392 
401 {
402  struct debpkginfo *pi;
403  long upload_pk = 0;
404  char *ErrorBuf;
405 
406  pi = (struct debpkginfo *)malloc(sizeof(struct debpkginfo));
407  memset(pi, 0, sizeof(struct debpkginfo));
408  int predictValue = -1;
409 
410  /* perpare testing data in database */
411  db_conn = fo_dbconnect(DBConfFile, &ErrorBuf);
412 
413  /* Test GetMetadataDebBinary function */
415  CU_ASSERT_EQUAL(Result, predictValue);
416 
417  PQfinish(db_conn);
418  int i;
419  for(i=0; i< pi->dep_size;i++)
420  free(pi->depends[i]);
421  free(pi->depends);
422  memset(pi, 0, sizeof(struct debpkginfo));
423  free(pi);
424 }
425 
437 {
438  struct debpkginfo *pi;
439  long upload_pk;
440  char *ErrorBuf;
441 
442  int predictValue = 0;
443  pi = (struct debpkginfo *)malloc(sizeof(struct debpkginfo));
444  memset(pi, 0, sizeof(struct debpkginfo));
445 
446  /* perpare testing data in database */
447  db_conn = fo_dbconnect(DBConfFile, &ErrorBuf);
448 
450  if (upload_pk == -1)
451  CU_FAIL_FATAL("Prepare database data ERROR!");
452 
453  if (prepare_Repository() == -1)
454  {
456  CU_FAIL_FATAL("Prepare repository data ERROR!");
457  }
458 
459  /* Test ProcessUpload function */
461  printf("ProcessUpload Result is:%d\n", Result);
462 
463  CU_ASSERT_EQUAL(Result, predictValue);
464 
465  /* Clear testing data in database */
466  if (remove_Database(db_conn, pi, upload_pk) == -1)
467  CU_FAIL_FATAL("Remove database data ERROR!");
468  if (remove_Repository() == -1)
469  CU_FAIL_FATAL("Remove repository data ERROR!");
470 
471  PQfinish(db_conn);
472  memset(pi, 0, sizeof(struct debpkginfo));
473  free(pi);
474 }
479  {"Testing the function GetMetadataDebBinary", test_GetMetadataDebBinary},
480  {"Testing the function GetMetadataDebBinary with no uploadpk", test_GetMetadataDebBinary_no_uploadpk},
481  {"Testing the function ProcessUpload for debian binary package", test_ProcessUpload},
482  CU_TEST_INFO_NULL
483 };
484 
char SQL[256]
SQL query to execute.
Definition: adj2nest.c:78
FUNCTION int ProcessUpload(int upload_pk, int agent_fk)
Process a single upload - read the first 32 bytes in each file.
Definition: process.c:61
char * Pfile
Pfile name (SHA1.MD5.Size)
PGconn * fo_dbconnect(char *DBConfFile, char **ErrorBuf)
Connect to a database. The default is Db.conf.
Definition: libfossdb.c:29
int fo_checkPQresult(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres SELECT.
Definition: libfossdb.c:170
int fo_checkPQcommand(PGconn *pgConn, PGresult *result, char *sql, char *FileID, int LineNumb)
Check the result status of a postgres commands (not select) If an error occured, write the error to s...
Definition: libfossdb.c:204
int fo_RepImport(char *Source, char *Type, char *Filename, int Link)
Import a file into the repository.
Definition: libfossrepo.c:812
int fo_RepExist(char *Type, char *Filename)
Determine if a file exists.
Definition: libfossrepo.c:486
int fo_RepRemove(char *Type, char *Filename)
Delete a repository file.
Definition: libfossrepo.c:568
PGconn * db_conn
The connection to Database.
Definition: pkgagent.c:22
int GetMetadataDebBinary(long upload_pk, struct debpkginfo *pi)
Get debian binary package info.
Definition: pkgagent.c:711
pkgagent header
const char * upload_pk
Definition: sqlstatements.h:82
Holds meta info of Debian packages.
Definition: pkgagent.h:68
char section[MAXCMD]
Package section.
Definition: pkgagent.h:72
char priority[MAXCMD]
Package priority.
Definition: pkgagent.h:73
long pFileFk
Package pfile in FOSSology.
Definition: pkgagent.h:80
char ** depends
Package dependency list.
Definition: pkgagent.h:82
char version[MAXCMD]
Package version.
Definition: pkgagent.h:71
char maintainer[MAXCMD]
Package maintainer.
Definition: pkgagent.h:76
char pkgArch[MAXCMD]
Package architecture.
Definition: pkgagent.h:74
int dep_size
Package dependency list size.
Definition: pkgagent.h:83
char pkgName[MAXCMD]
Package name.
Definition: pkgagent.h:69
char homepage[MAXCMD]
Package link.
Definition: pkgagent.h:77
long prepare_Database(PGconn *db_conn, struct debpkginfo *pi)
Prepare database.
char * DBConfFile
DB conf file location.
Definition: testRun.c:21
int prepare_Repository()
Prepare repository.
int remove_Repository()
remove repository
void test_ProcessUpload()
Test pkgagent.c ProcessUpload function.
CU_TestInfo testcases_GetMetadataDebBinary[]
testcases for function GetMetadataDebBinary and ProcessUpload
void test_GetMetadataDebBinary()
Test pkgagent.c GetMetadataDebBinary function get Debian binary package info.
int remove_Database(PGconn *db_conn, struct debpkginfo *pi, long upload_pk)
remove database
void test_GetMetadataDebBinary_no_uploadpk()
Test pkgagent.c GetMetadataDebBinary function with no upload_pk in database.
static int Result
Result of calls.
Definition: test_CopyFile.c:17