2 Bacula(R) - The Network Backup Solution
4 Copyright (C) 2000-2015 Kern Sibbald
5 Copyright (C) 2011-2014 Free Software Foundation Europe e.V.
7 The original author of Bacula is Kern Sibbald, with contributions
8 from many others, a complete list can be found in the file AUTHORS.
10 You may use this file and others of this release according to the
11 license defined in the LICENSE file, which includes the Affero General
12 Public License, v3.0 ("AGPLv3") and some additional permissions and
13 terms pursuant to its AGPLv3 Section 7.
15 This notice must be preserved when any source code is
16 conveyed and/or propagated.
18 Bacula(R) is a registered trademark of Kern Sibbald.
21 * Program to test CATS DB routines
25 #define _BDB_PRIV_INTERFACE_
28 #include "cats/cats.h"
29 #include "cats/bvfs.h"
30 #include "findlib/find.h"
34 static const char *file = "COPYRIGHT";
35 //static DBId_t fnid=0;
36 static const char *db_name = "bacula";
37 static const char *db_user = "bacula";
38 static const char *db_password = "";
39 static const char *db_host = NULL;
40 static const char *db_address = NULL;
41 static int db_port = 0;
42 static int64_t pid = 0;
45 #define PLINE "\n============================================================\n"
50 "\n%sVersion: %s (%s)\n"
51 " -d <nn> set debug level to <nn>\n"
52 " -dt print timestamp in debug output\n"
53 " -n <name> specify the database name (default bacula)\n"
54 " -u <user> specify database user name (default bacula)\n"
55 " -P <password specify database password (default none)\n"
56 " -h <host> specify database host (default NULL)\n"
57 " -w <working> specify working directory\n"
58 " -p <path> specify path\n"
59 " -f <file> specify file\n"
60 " -l <limit> maximum tuple to fetch\n"
61 " -q print only errors\n"
63 " -? print this message\n\n"), 2011, BDEMO, VERSION, BDATE);
72 bool _warn(const char *file, int l, const char *op, int value, const char *label)
78 printf("WRN %.30s %s:%i on %s\n", label, file, l, op);
81 printf("OK %.30s\n", label);
86 #define warn(x, label) _warn(__FILE__, __LINE__, #x, (x), label)
88 bool _ok(const char *file, int l, const char *op, int value, const char *label)
94 printf("ERR %.30s %s:%i on %s\n", label, file, l, op);
98 printf("OK %.30s\n", label);
104 #define ok(x, label) _ok(__FILE__, __LINE__, #x, (x), label)
106 bool _nok(const char *file, int l, const char *op, int value, const char *label)
112 printf("ERR %.30s %s:%i on !%s\n", label, file, l, op);
116 printf("OK %.30s\n", label);
122 #define nok(x, label) _nok(__FILE__, __LINE__, #x, (x), label)
126 printf("Result %i/%i OK\n", _nb - _err, _nb);
130 static void cmp_pool(POOL_DBR &pr, POOL_DBR &pr2)
132 ok(pr.MaxVols == pr2.MaxVols, " Check Pool MaxVols");
133 ok(pr.UseOnce == pr2.UseOnce, " Check Pool UseOnce");
134 ok(pr.UseCatalog == pr2.UseCatalog, " Check Pool UseCatalog");
135 ok(pr.AcceptAnyVolume == pr2.AcceptAnyVolume," Check Pool AcceptAnyVolume");
136 ok(pr.AutoPrune == pr2.AutoPrune, " Check Pool AutoPrune");
137 ok(pr.Recycle == pr2.Recycle, " Check Pool Recycle");
138 ok(pr.VolRetention == pr2.VolRetention , " Check Pool VolRetention");
139 ok(pr.VolUseDuration == pr2.VolUseDuration, " Check Pool VolUseDuration");
140 ok(pr.MaxVolJobs == pr2.MaxVolJobs, " Check Pool MaxVolJobs");
141 ok(pr.MaxVolFiles == pr2.MaxVolFiles, " Check Pool MaxVolFiles");
142 ok(pr.MaxVolBytes == pr2.MaxVolBytes, " Check Pool MaxVolBytes");
143 ok(!strcmp(pr.PoolType, pr2.PoolType), " Check Pool PoolType");
144 ok(pr.LabelType == pr2.LabelType, " Check Pool LabelType");
145 ok(!strcmp(pr.LabelFormat, pr2.LabelFormat), " Check Pool LabelFormat");
146 ok(pr.RecyclePoolId == pr2.RecyclePoolId, " Check Pool RecyclePoolId");
147 ok(pr.ScratchPoolId == pr2.ScratchPoolId, " Check Pool ScratchPoolId");
148 ok(pr.ActionOnPurge == pr2.ActionOnPurge, " Check Pool ActionOnPurge");
151 static void cmp_client(CLIENT_DBR &cr, CLIENT_DBR &cr2)
153 ok(!strcmp(cr2.Name, cr.Name), " Check Client Name");
154 ok(!strcmp(cr2.Uname, cr.Uname), " Check Client Uname");
155 ok(cr.AutoPrune == cr2.AutoPrune, " Check Client Autoprune");
156 ok(cr.JobRetention == cr2.JobRetention, " Check Client JobRetention");
157 ok(cr.FileRetention == cr2.FileRetention," Check Client FileRetention");
160 static void cmp_job(JOB_DBR &jr, JOB_DBR &jr2)
162 ok(jr.VolSessionId == jr2.VolSessionId, " Check VolSessionId");
163 ok(jr.VolSessionTime == jr2.VolSessionTime, " Check VolSessionTime");
164 ok(jr.PoolId == jr2.PoolId, " Check PoolId");
165 ok(jr.StartTime == jr2.StartTime, " Check StartTime");
166 ok(jr.EndTime == jr2.EndTime, " Check EndTime");
167 ok(jr.JobFiles == jr2.JobFiles, " Check JobFiles");
168 ok(jr.JobBytes == jr2.JobBytes, " Check JobBytes");
169 ok(jr.JobTDate == jr2.JobTDate, " Check JobTDate");
170 ok(!strcmp(jr.Job, jr2.Job), " Check Job");
171 ok(jr.JobStatus == jr2.JobStatus, " Check JobStatus");
172 ok(jr.JobType == jr2.JobType, " Check Type");
173 ok(jr.JobLevel == jr2.JobLevel, " Check Level");
174 ok(jr.ClientId == jr2.ClientId, " Check ClientId");
175 ok(!strcmp(jr.Name, jr2.Name), " Check Name");
176 ok(jr.PriorJobId == jr2.PriorJobId, " Check PriorJobId");
177 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
178 ok(jr.JobId == jr2.JobId, " Check JobId");
179 ok(jr.FileSetId == jr2.FileSetId, " Check FileSetId");
180 ok(jr.SchedTime == jr2.SchedTime, " Check SchedTime");
181 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
182 ok(jr.ReadBytes == jr2.ReadBytes, " Check ReadBytes");
183 ok(jr.HasBase == jr2.HasBase, " Check HasBase");
184 ok(jr.PurgedFiles == jr2.PurgedFiles, " Check PurgedFiles");
188 #define aPATH "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
189 #define aFILE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
191 static int list_files(void *ctx, int nb_col, char **row)
193 uint32_t *k = (uint32_t*) ctx;
195 ok(nb_col > 4, "Check result columns");
196 ok(!strcmp(row[0], aPATH aPATH aPATH aPATH "/"), "Check path");
197 ok(!strcmp(row[1], aFILE aFILE ".txt"), "Check filename");
198 ok(str_to_int64(row[2]) == 10, "Check FileIndex");
199 ok(str_to_int64(row[3]) == jcr->JobId, "Check JobId");
203 static int count_col(void *ctx, int nb_col, char **row)
205 *((int32_t*) ctx) = nb_col;
209 /* number of thread started */
211 int main (int argc, char *argv[])
214 char *path=NULL, *client=NULL;
217 bool full_test=false;
221 POOLMEM *buf = get_pool_memory(PM_FNAME);
222 POOLMEM *buf2 = get_pool_memory(PM_FNAME);
223 POOLMEM *buf3 = get_pool_memory(PM_FNAME);
225 setlocale(LC_ALL, "");
226 bindtextdomain("bacula", LOCALEDIR);
227 textdomain("bacula");
231 Pmsg0(0, "Starting cats_test tool" PLINE);
233 my_name_is(argc, argv, "");
234 init_msg(NULL, NULL);
238 while ((ch = getopt(argc, argv, "qh:c:l:d:n:P:Su:vFw:?p:f:T")) != -1) {
243 case 'd': /* debug level */
244 if (*optarg == 't') {
245 dbg_timestamp = true;
247 debug_level = atoi(optarg);
248 if (debug_level <= 0) {
254 limit = str_to_int64(optarg);
270 working_directory = optarg;
278 db_password = optarg;
311 Pmsg0(0, _("Wrong number of arguments: \n"));
319 * - With multiple thread in //
321 * - Test all sql_cmds.c
322 * - Test all sql.c (db_)
323 * - Test all sql_create.c
327 jcr = new_jcr(sizeof(JCR), NULL);
328 jcr->setJobType(JT_CONSOLE);
329 jcr->setJobLevel(L_NONE);
330 jcr->JobStatus = JS_Running;
331 bstrncpy(jcr->Job, "**dummy**", sizeof(jcr->Job));
332 jcr->JobId = pid; /* this is JobId on tape */
333 jcr->start_time = jcr->sched_time = time(NULL);
335 /* Test DB connexion */
336 Pmsg1(0, PLINE "Test DB connection \"%s\"" PLINE, db_name);
339 db = db_init_database(jcr /* JCR */,
340 NULL /* dbi driver */,
341 db_name, db_user, db_password, db_address, db_port + 100,
342 NULL /* db_socket */,
343 0 /* mult_db_connections */, false);
344 ok(db != NULL, "Test bad connection");
349 nok(db_open_database(jcr, db), "Open bad Database");
350 db_close_database(jcr, db);
353 db = db_init_database(jcr /* JCR */,
354 NULL /* dbi driver */,
355 db_name, db_user, db_password, db_address, db_port,
356 NULL /* db_socket */,
357 false /* mult_db_connections */, false);
359 ok(db != NULL, "Test db connection");
364 if (!ok(db_open_database(jcr, db), "Open Database")) {
365 Pmsg1(000, _("Could not open database \"%s\".\n"), db_name);
366 Jmsg(jcr, M_FATAL, 0, _("Could not open, database \"%s\".\n"), db_name);
367 Jmsg(jcr, M_FATAL, 0, _("%s"), db_strerror(db));
368 Pmsg1(000, "%s", db_strerror(db));
369 db_close_database(jcr, db);
373 dbtype = db_get_type_index(db);
376 /* Check if the SQL library is thread-safe */
377 ok(check_tables_version(jcr, db), "Check table version");
378 ok(db_sql_query(db, "SELECT VersionId FROM Version",
379 db_int_handler, &j), "SELECT VersionId");
381 ok(UPDATE_DB(jcr, db, (char*)"UPDATE Version SET VersionId = 1"),
383 nok(check_tables_version(jcr, db), "Check table version");
384 Mmsg(buf, "UPDATE Version SET VersionId = %d", j);
385 ok(UPDATE_DB(jcr, db, buf), "Restore VersionId");
387 if (dbtype != SQL_TYPE_SQLITE3) {
388 ok(db_check_max_connections(jcr, db, 1), "Test min Max Connexion");
389 nok(db_check_max_connections(jcr, db, 10000), "Test max Max Connexion");
392 ok(db_open_batch_connexion(jcr, db), "Opening batch connection");
393 db_close_database(jcr, jcr->db_batch);
394 jcr->db_batch = NULL;
396 /* ---------------------------------------------------------------- */
398 uint32_t storageid=0;
399 ok(db_sql_query(db, "SELECT MIN(StorageId) FROM Storage",
400 db_int_handler, &storageid), "Get StorageId");
401 ok(storageid > 0, "Check StorageId");
403 Pmsg0(0, "Please, run REGRESS_DEBUG=1 tests/bacula-backup-test before this test");
407 /* ---------------------------------------------------------------- */
408 Pmsg0(0, PLINE "Doing Basic SQL tests" PLINE);
409 ok(db_sql_query(db, "SELECT 1,2,3,4,5", count_col, &j), "Count 5 rows");
410 ok(j == 5, "Check number of columns");
411 ok(db_sql_query(db, "SELECT 1,2,3,4,5,'a','b','c','d','e'",
412 count_col, &j), "Count 10 rows");
413 ok(j == 10, "Check number of columns");
415 bsnprintf(temp, sizeof(temp), "t%lld", pid);
416 ok(db_sql_query(db, "SELECT 2", db_int_handler, &j), "Good SELECT query");
417 ok(db_sql_query(db, "SELECT 1 FROM Media WHERE VolumeName='missing'",
418 db_int_handler, &j), "Good empty SELECT query");
421 i64.value = 0; i64.count = 0;
422 ok(db_sql_query(db, "SELECT 1",db_int64_handler, &i64),"db_int64_handler");
423 ok(i64.value == 1, "Check db_int64_handler return");
426 ok(db_sql_query(db, "SELECT FileId FROM File ORDER By FileId LIMIT 10",
427 db_list_handler, &lctx), "db_list_ctx");
428 ok(lctx.count == 10, "Check db_list_ctx count ");
429 ok(!strcmp(lctx.list, "1,2,3,4,5,6,7,8,9,10"), "Check db_list_ctx list");
431 nok(db_sql_query(db, "blabla", db_int_handler, &j), "Bad query");
433 Mmsg(buf, "CREATE Table %s (a int)", temp);
434 ok(db_sql_query(db, buf, NULL, NULL), "CREATE query");
436 Mmsg(buf, "INSERT INTO %s (a) VALUES (1)", temp);
437 ok(INSERT_DB(jcr, db, buf), "INSERT query");
438 ok(INSERT_DB(jcr, db, buf), "INSERT query");
439 ok(sql_affected_rows(db) == 1, "Check sql_affected_rows");
441 Mmsg(buf, "INSERT INTO aaa%s (a) VALUES (1)", temp);
442 nok(INSERT_DB(jcr, db, buf), "Bad INSERT query");
443 ok(sql_affected_rows(db) == 0, "Check sql_affected_rows");
445 Mmsg(buf, "UPDATE %s SET a = 2", temp);
446 ok(UPDATE_DB(jcr, db, buf), "UPDATE query");
447 ok(sql_affected_rows(db) == 2, "Check sql_affected_rows");
449 Mmsg(buf, "UPDATE %s SET a = 2 WHERE a = 1", temp);
450 nok(UPDATE_DB(jcr, db, buf), "Empty UPDATE query");
452 Mmsg(buf, "UPDATE aaa%s SET a = 2", temp);
453 nok(UPDATE_DB(jcr, db, buf), "Bad UPDATE query");
455 Mmsg(buf, "DELETE FROM %s", temp);
456 ok(DELETE_DB(jcr, db, buf), "DELETE query");
457 nok(DELETE_DB(jcr, db, buf), "Empty DELETE query"); /* TODO bug ? */
459 Mmsg(buf, "DELETE FROM aaa%s", temp);
460 ok(DELETE_DB(jcr, db, buf), "Bad DELETE query"); /* TODO bug ? */
462 Mmsg(buf, "DROP TABLE %s", temp);
463 ok(QUERY_DB(jcr, db, buf), "DROP query");
464 nok(QUERY_DB(jcr, db, buf), "Empty DROP query");
466 /* ---------------------------------------------------------------- */
468 strcpy(buf, "This string should be 'escaped'");
469 db_escape_string(jcr, db, buf2, buf, strlen(buf));
470 ok((strlen(buf) + 2) == strlen(buf2),"Quoted string should be longer");
471 Mmsg(buf, "INSERT INTO Path (Path) VALUES ('%lld-%s')", pid, buf2);
472 ok(db_sql_query(db, buf, NULL, NULL), "Inserting quoted string");
474 /* ---------------------------------------------------------------- */
475 Pmsg0(0, PLINE "Doing Job tests" PLINE);
478 memset(&jr, 0, sizeof(jr));
479 memset(&jr2, 0, sizeof(jr2));
481 ok(db_get_job_record(jcr, db, &jr), "Get Job record for JobId=1");
482 ok(jr.JobFiles > 10, "Check number of files");
484 jr.JobId = (JobId_t)pid;
485 Mmsg(buf, "%s-%lld", jr.Job, pid);
487 ok(db_create_job_record(jcr, db, &jr), "Create Job record");
488 ok(db_update_job_start_record(jcr, db, &jr), "Update Start Record");
489 ok(db_update_job_end_record(jcr, db, &jr), "Update End Record");
490 jr2.JobId = jr.JobId;
491 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by JobId");
494 memset(&jr2, 0, sizeof(jr2));
495 strcpy(jr2.Job, jr.Job);
496 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by Job name");
499 memset(&jr2, 0, sizeof(jr2));
501 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (JobId)");
503 memset(&jr2, 0, sizeof(jr2));
504 strcpy(jr2.Job, "test");
505 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (Job)");
507 /* ---------------------------------------------------------------- */
510 memset(&ar, 0, sizeof(ar));
511 Mmsg(buf2, aPATH aPATH aPATH aPATH "/" aFILE aFILE ".txt");
513 Mmsg(buf3, "gD ImIZ IGk B Po Po A A A JY BNNvf5 BNKzS7 BNNuwC A A C");
516 ar.Stream = STREAM_UNIX_ATTRIBUTES;
517 ar.FileType = FT_REG;
518 jcr->JobId = ar.JobId = jr.JobId;
519 jcr->JobStatus = JS_Running;
520 ok(db_create_attributes_record(jcr, db, &ar), "Inserting Filename");
521 ok(db_write_batch_file_records(jcr), "Commit batch session");
522 Mmsg(buf, "SELECT FileIndex FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
523 ok(db_sql_query(db, buf, db_int_handler, &j), "Get Inserted record");
524 ok(j == ar.FileIndex, "Check FileIndex");
525 Mmsg(buf, "SELECT COUNT(1) FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
526 ok(db_sql_query(db, buf, db_int_handler, &j), "List records");
527 ok(j == 1, "Check batch session records");
529 Mmsg(buf, "%lld", (uint64_t)jcr->JobId);
530 ok(db_get_file_list(jcr, jcr->db_batch, buf, false, false, list_files, &j),
531 "List files with db_get_file_list()");
532 ok(j == 1, "Check db_get_file_list results");
533 /* ---------------------------------------------------------------- */
535 Pmsg0(0, PLINE "Doing Client tests" PLINE);
537 memset(&cr, 0, sizeof(cr));
538 memset(&cr2, 0, sizeof(cr2));
541 cr.FileRetention = 10;
542 cr.JobRetention = 15;
543 bsnprintf(cr.Name, sizeof(cr.Name), "client-%lld-fd", pid);
544 bsnprintf(cr.Uname, sizeof(cr.Uname), "uname-%lld", pid);
546 ok(db_create_client_record(jcr, db, &cr), "db_create_client_record()");
547 ok(cr.ClientId > 0, "Check ClientId");
549 cr2.ClientId = cr.ClientId; /* Save it */
552 Pmsg0(0, "Search client by ClientId\n");
553 ok(db_create_client_record(jcr, db, &cr),"Should get the client record");
554 ok(cr.ClientId == cr2.ClientId, "Check if ClientId is the same");
556 ok(db_get_client_record(jcr, db, &cr2), "Search client by ClientId");
559 Pmsg0(0, "Search client by Name\n");
560 memset(&cr2, 0, sizeof(cr2));
561 strcpy(cr2.Name, cr.Name);
562 ok(db_get_client_record(jcr, db, &cr2),"Search client by Name");
565 Pmsg0(0, "Search non existing client by Name\n");
566 memset(&cr2, 0, sizeof(cr2));
567 bsnprintf(cr2.Name, sizeof(cr2.Name), "hollow-client-%lld-fd", pid);
568 nok(db_get_client_record(jcr, db, &cr2), "Search non existing client");
569 ok(cr2.ClientId == 0, "Check ClientId after failed search");
572 strcpy(cr.Uname, "NewUname");
573 ok(db_update_client_record(jcr, db, &cr), "Update Client record");
574 memset(&cr2, 0, sizeof(cr2));
575 cr2.ClientId = cr.ClientId;
576 ok(db_get_client_record(jcr, db, &cr2),"Search client by ClientId");
581 ok(db_get_client_ids(jcr, db, &nb, &ret_ids), "Get Client Ids");
582 ok(nb > 0, "Should find at least 1 Id");
583 for (i = 0; i < nb; i++) {
584 if (ret_ids[i] == cr2.ClientId) {
588 ok(i < nb, "Check if ClientId was found");
590 /* ---------------------------------------------------------------- */
591 Pmsg0(0, PLINE "Doing Pool tests" PLINE);
593 memset(&pr, 0, sizeof(pr));
594 memset(&pr2, 0, sizeof(pr2));
596 bsnprintf(pr.Name, sizeof(pr.Name), "pool-%lld", pid);
599 pr.UseCatalog = true;
600 pr.AcceptAnyVolume = true;
603 pr.VolRetention = 1000;
604 pr.VolUseDuration = 1000;
606 pr.MaxVolFiles = 1000;
607 pr.MaxVolBytes = 1000000;
608 strcpy(pr.PoolType, "Backup");
610 pr.LabelFormat[0] = 0;
611 pr.RecyclePoolId = 0;
612 pr.ScratchPoolId = 0;
613 pr.ActionOnPurge = 1;
615 ok(db_create_pool_record(jcr, db, &pr), "db_create_pool_record()");
616 ok(pr.PoolId > 0, "Check PoolId");
618 pr2.PoolId = pr.PoolId;
621 Pmsg0(0, "Search pool by PoolId\n");
622 nok(db_create_pool_record(jcr, db, &pr),"Can't create pool twice");
623 ok(db_get_pool_numvols(jcr, db, &pr2), "Search pool by PoolId");
627 pr2.AutoPrune = false;
630 pr2.VolUseDuration++;
634 strcpy(pr2.PoolType, "Restore");
635 strcpy(pr2.LabelFormat, "VolFormat");
636 pr2.RecyclePoolId = 0;
637 pr2.ScratchPoolId = 0;
638 pr2.ActionOnPurge = 2;
640 ok(db_update_pool_record(jcr, db, &pr2), "Update Pool record");
641 memset(&pr, 0, sizeof(pr));
642 pr.PoolId = pr2.PoolId;
643 ok(db_get_pool_numvols(jcr, db, &pr), "Search pool by PoolId");
646 ok(db_delete_pool_record(jcr, db, &pr), "Delete Pool");
647 nok(db_delete_pool_record(jcr, db, &pr), "Delete non existing Pool");
648 nok(db_update_pool_record(jcr, db, &pr), "Update non existing Pool");
649 ok(db_create_pool_record(jcr, db, &pr), "Recreate Pool");
651 /* ---------------------------------------------------------------- */
652 Pmsg0(0, PLINE "Doing Media tests" PLINE);
655 memset(&mr, 0, sizeof(mr));
656 memset(&mr2, 0, sizeof(mr2));
658 bsnprintf(mr.VolumeName, sizeof(mr.VolumeName), "media-%lld", pid);
659 bsnprintf(mr.MediaType, sizeof(mr.MediaType), "type-%lld", pid);
661 /* from set_pool_dbr_defaults_in_media_dbr(&mr, &pr); */
662 mr.PoolId = pr.PoolId;
663 bstrncpy(mr.VolStatus, NT_("Append"), sizeof(mr.VolStatus));
664 mr.Recycle = pr.Recycle;
665 mr.VolRetention = pr.VolRetention;
666 mr.VolUseDuration = pr.VolUseDuration;
667 mr.ActionOnPurge = pr.ActionOnPurge;
668 mr.RecyclePoolId = pr.RecyclePoolId;
669 mr.MaxVolJobs = pr.MaxVolJobs;
670 mr.MaxVolFiles = pr.MaxVolFiles;
671 mr.MaxVolBytes = pr.MaxVolBytes;
672 mr.LabelType = pr.LabelType;
675 mr.VolCapacityBytes = 1000;
679 mr.VolReadTime = 10000;
680 mr.VolWriteTime = 99999;
684 mr.ScratchPoolId = 0;
685 mr.RecyclePoolId = 0;
687 ok(db_create_media_record(jcr, db, &mr), "Create Media");
688 nok(db_create_media_record(jcr, db, &mr), "Create Media twice");
690 /* ---------------------------------------------------------------- */
691 Pmsg0(0, PLINE "Doing ... tests" PLINE);
693 db_close_database(jcr, db);
695 free_pool_memory(buf);
696 free_pool_memory(buf2);
697 free_pool_memory(buf3);