2 Bacula(R) - The Network Backup Solution
4 Copyright (C) 2000-2016 Kern Sibbald
6 The original author of Bacula is Kern Sibbald, with contributions
7 from many others, a complete list can be found in the file AUTHORS.
9 You may use this file and others of this release according to the
10 license defined in the LICENSE file, which includes the Affero General
11 Public License, v3.0 ("AGPLv3") and some additional permissions and
12 terms pursuant to its AGPLv3 Section 7.
14 This notice must be preserved when any source code is
15 conveyed and/or propagated.
17 Bacula(R) is a registered trademark of Kern Sibbald.
20 * Program to test CATS DB routines
24 #define _BDB_PRIV_INTERFACE_
27 #include "cats/cats.h"
28 #include "cats/bvfs.h"
29 #include "findlib/find.h"
33 static const char *file = "COPYRIGHT";
34 //static DBId_t fnid=0;
35 static const char *db_name = "bacula";
36 static const char *db_user = "bacula";
37 static const char *db_password = "";
38 static const char *db_host = NULL;
39 static const char *db_address = NULL;
40 static int db_port = 0;
41 static int64_t pid = 0;
44 #define PLINE "\n============================================================\n"
49 "\n%sVersion: %s (%s)\n"
50 " -d <nn> set debug level to <nn>\n"
51 " -dt print timestamp in debug output\n"
52 " -n <name> specify the database name (default bacula)\n"
53 " -u <user> specify database user name (default bacula)\n"
54 " -P <password specify database password (default none)\n"
55 " -h <host> specify database host (default NULL)\n"
56 " -w <working> specify working directory\n"
57 " -p <path> specify path\n"
58 " -f <file> specify file\n"
59 " -l <limit> maximum tuple to fetch\n"
60 " -q print only errors\n"
62 " -? print this message\n\n"), 2011, BDEMO, VERSION, BDATE);
71 bool _warn(const char *file, int l, const char *op, int value, const char *label)
77 printf("WRN %.30s %s:%i on %s\n", label, file, l, op);
80 printf("OK %.30s\n", label);
85 #define warn(x, label) _warn(__FILE__, __LINE__, #x, (x), label)
87 bool _ok(const char *file, int l, const char *op, int value, const char *label)
93 printf("ERR %.30s %s:%i on %s\n", label, file, l, op);
97 printf("OK %.30s\n", label);
103 #define ok(x, label) _ok(__FILE__, __LINE__, #x, (x), label)
105 bool _nok(const char *file, int l, const char *op, int value, const char *label)
111 printf("ERR %.30s %s:%i on !%s\n", label, file, l, op);
115 printf("OK %.30s\n", label);
121 #define nok(x, label) _nok(__FILE__, __LINE__, #x, (x), label)
125 printf("Result %i/%i OK\n", _nb - _err, _nb);
129 static void cmp_pool(POOL_DBR &pr, POOL_DBR &pr2)
131 ok(pr.MaxVols == pr2.MaxVols, " Check Pool MaxVols");
132 ok(pr.UseOnce == pr2.UseOnce, " Check Pool UseOnce");
133 ok(pr.UseCatalog == pr2.UseCatalog, " Check Pool UseCatalog");
134 ok(pr.AcceptAnyVolume == pr2.AcceptAnyVolume," Check Pool AcceptAnyVolume");
135 ok(pr.AutoPrune == pr2.AutoPrune, " Check Pool AutoPrune");
136 ok(pr.Recycle == pr2.Recycle, " Check Pool Recycle");
137 ok(pr.VolRetention == pr2.VolRetention , " Check Pool VolRetention");
138 ok(pr.VolUseDuration == pr2.VolUseDuration, " Check Pool VolUseDuration");
139 ok(pr.MaxVolJobs == pr2.MaxVolJobs, " Check Pool MaxVolJobs");
140 ok(pr.MaxVolFiles == pr2.MaxVolFiles, " Check Pool MaxVolFiles");
141 ok(pr.MaxVolBytes == pr2.MaxVolBytes, " Check Pool MaxVolBytes");
142 ok(!strcmp(pr.PoolType, pr2.PoolType), " Check Pool PoolType");
143 ok(pr.LabelType == pr2.LabelType, " Check Pool LabelType");
144 ok(!strcmp(pr.LabelFormat, pr2.LabelFormat), " Check Pool LabelFormat");
145 ok(pr.RecyclePoolId == pr2.RecyclePoolId, " Check Pool RecyclePoolId");
146 ok(pr.ScratchPoolId == pr2.ScratchPoolId, " Check Pool ScratchPoolId");
147 ok(pr.ActionOnPurge == pr2.ActionOnPurge, " Check Pool ActionOnPurge");
150 static void cmp_client(CLIENT_DBR &cr, CLIENT_DBR &cr2)
152 ok(!strcmp(cr2.Name, cr.Name), " Check Client Name");
153 ok(!strcmp(cr2.Uname, cr.Uname), " Check Client Uname");
154 ok(cr.AutoPrune == cr2.AutoPrune, " Check Client Autoprune");
155 ok(cr.JobRetention == cr2.JobRetention, " Check Client JobRetention");
156 ok(cr.FileRetention == cr2.FileRetention," Check Client FileRetention");
159 static void cmp_job(JOB_DBR &jr, JOB_DBR &jr2)
161 ok(jr.VolSessionId == jr2.VolSessionId, " Check VolSessionId");
162 ok(jr.VolSessionTime == jr2.VolSessionTime, " Check VolSessionTime");
163 ok(jr.PoolId == jr2.PoolId, " Check PoolId");
164 ok(jr.StartTime == jr2.StartTime, " Check StartTime");
165 ok(jr.EndTime == jr2.EndTime, " Check EndTime");
166 ok(jr.JobFiles == jr2.JobFiles, " Check JobFiles");
167 ok(jr.JobBytes == jr2.JobBytes, " Check JobBytes");
168 ok(jr.JobTDate == jr2.JobTDate, " Check JobTDate");
169 ok(!strcmp(jr.Job, jr2.Job), " Check Job");
170 ok(jr.JobStatus == jr2.JobStatus, " Check JobStatus");
171 ok(jr.JobType == jr2.JobType, " Check Type");
172 ok(jr.JobLevel == jr2.JobLevel, " Check Level");
173 ok(jr.ClientId == jr2.ClientId, " Check ClientId");
174 ok(!strcmp(jr.Name, jr2.Name), " Check Name");
175 ok(jr.PriorJobId == jr2.PriorJobId, " Check PriorJobId");
176 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
177 ok(jr.JobId == jr2.JobId, " Check JobId");
178 ok(jr.FileSetId == jr2.FileSetId, " Check FileSetId");
179 ok(jr.SchedTime == jr2.SchedTime, " Check SchedTime");
180 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
181 ok(jr.ReadBytes == jr2.ReadBytes, " Check ReadBytes");
182 ok(jr.HasBase == jr2.HasBase, " Check HasBase");
183 ok(jr.PurgedFiles == jr2.PurgedFiles, " Check PurgedFiles");
187 #define aPATH "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
188 #define aFILE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
190 static int list_files(void *ctx, int nb_col, char **row)
192 uint32_t *k = (uint32_t*) ctx;
194 ok(nb_col > 4, "Check result columns");
195 ok(!strcmp(row[0], aPATH aPATH aPATH aPATH "/"), "Check path");
196 ok(!strcmp(row[1], aFILE aFILE ".txt"), "Check filename");
197 ok(str_to_int64(row[2]) == 10, "Check FileIndex");
198 ok(str_to_int64(row[3]) == jcr->JobId, "Check JobId");
202 static int count_col(void *ctx, int nb_col, char **row)
204 *((int32_t*) ctx) = nb_col;
208 /* number of thread started */
210 int main (int argc, char *argv[])
213 char *path=NULL, *client=NULL;
216 bool full_test=false;
220 POOLMEM *buf = get_pool_memory(PM_FNAME);
221 POOLMEM *buf2 = get_pool_memory(PM_FNAME);
222 POOLMEM *buf3 = get_pool_memory(PM_FNAME);
224 setlocale(LC_ALL, "");
225 bindtextdomain("bacula", LOCALEDIR);
226 textdomain("bacula");
230 Pmsg0(0, "Starting cats_test tool" PLINE);
232 my_name_is(argc, argv, "");
233 init_msg(NULL, NULL);
237 while ((ch = getopt(argc, argv, "qh:c:l:d:n:P:Su:vFw:?p:f:T")) != -1) {
242 case 'd': /* debug level */
243 if (*optarg == 't') {
244 dbg_timestamp = true;
246 debug_level = atoi(optarg);
247 if (debug_level <= 0) {
253 limit = str_to_int64(optarg);
269 working_directory = optarg;
277 db_password = optarg;
310 Pmsg0(0, _("Wrong number of arguments: \n"));
318 * - With multiple thread in //
320 * - Test all sql_cmds.c
321 * - Test all sql.c (db_)
322 * - Test all sql_create.c
326 jcr = new_jcr(sizeof(JCR), NULL);
327 jcr->setJobType(JT_CONSOLE);
328 jcr->setJobLevel(L_NONE);
329 jcr->JobStatus = JS_Running;
330 bstrncpy(jcr->Job, "**dummy**", sizeof(jcr->Job));
331 jcr->JobId = pid; /* this is JobId on tape */
332 jcr->start_time = jcr->sched_time = time(NULL);
334 /* Test DB connexion */
335 Pmsg1(0, PLINE "Test DB connection \"%s\"" PLINE, db_name);
338 db = db_init_database(jcr /* JCR */,
339 NULL /* dbi driver */,
340 db_name, db_user, db_password, db_address, db_port + 100,
341 NULL /* db_socket */,
342 db_ssl_key, db_ssl_cert, db_ssl_ca,
343 db_ssl_capath, db_ssl_cipher,
344 0 /* mult_db_connections */, false);
345 ok(db != NULL, "Test bad connection");
350 nok(db_open_database(jcr, db), "Open bad Database");
351 db_close_database(jcr, db);
354 db = db_init_database(jcr /* JCR */,
355 NULL /* dbi driver */,
356 db_name, db_user, db_password, db_address, db_port,
357 NULL /* db_socket */,
358 db_ssl_key, db_ssl_cert, db_ssl_ca,
359 db_ssl_capath, db_ssl_cipher,
360 false /* mult_db_connections */, false);
362 ok(db != NULL, "Test db connection");
367 if (!ok(db_open_database(jcr, db), "Open Database")) {
368 Pmsg1(000, _("Could not open database \"%s\".\n"), db_name);
369 Jmsg(jcr, M_FATAL, 0, _("Could not open, database \"%s\".\n"), db_name);
370 Jmsg(jcr, M_FATAL, 0, _("%s"), db_strerror(db));
371 Pmsg1(000, "%s", db_strerror(db));
372 db_close_database(jcr, db);
376 dbtype = db_get_type_index(db);
379 /* Check if the SQL library is thread-safe */
380 ok(check_tables_version(jcr, db), "Check table version");
381 ok(db_sql_query(db, "SELECT VersionId FROM Version",
382 db_int_handler, &j), "SELECT VersionId");
384 ok(UPDATE_DB(jcr, db, (char*)"UPDATE Version SET VersionId = 1"),
386 nok(check_tables_version(jcr, db), "Check table version");
387 Mmsg(buf, "UPDATE Version SET VersionId = %d", j);
388 ok(UPDATE_DB(jcr, db, buf), "Restore VersionId");
390 if (dbtype != SQL_TYPE_SQLITE3) {
391 ok(db_check_max_connections(jcr, db, 1), "Test min Max Connexion");
392 nok(db_check_max_connections(jcr, db, 10000), "Test max Max Connexion");
395 ok(db_open_batch_connexion(jcr, db), "Opening batch connection");
396 db_close_database(jcr, jcr->db_batch);
397 jcr->db_batch = NULL;
399 /* ---------------------------------------------------------------- */
401 uint32_t storageid=0;
402 ok(db_sql_query(db, "SELECT MIN(StorageId) FROM Storage",
403 db_int_handler, &storageid), "Get StorageId");
404 ok(storageid > 0, "Check StorageId");
406 Pmsg0(0, "Please, run REGRESS_DEBUG=1 tests/bacula-backup-test before this test");
410 /* ---------------------------------------------------------------- */
411 Pmsg0(0, PLINE "Doing Basic SQL tests" PLINE);
412 ok(db_sql_query(db, "SELECT 1,2,3,4,5", count_col, &j), "Count 5 rows");
413 ok(j == 5, "Check number of columns");
414 ok(db_sql_query(db, "SELECT 1,2,3,4,5,'a','b','c','d','e'",
415 count_col, &j), "Count 10 rows");
416 ok(j == 10, "Check number of columns");
418 bsnprintf(temp, sizeof(temp), "t%lld", pid);
419 ok(db_sql_query(db, "SELECT 2", db_int_handler, &j), "Good SELECT query");
420 ok(db_sql_query(db, "SELECT 1 FROM Media WHERE VolumeName='missing'",
421 db_int_handler, &j), "Good empty SELECT query");
424 i64.value = 0; i64.count = 0;
425 ok(db_sql_query(db, "SELECT 1",db_int64_handler, &i64),"db_int64_handler");
426 ok(i64.value == 1, "Check db_int64_handler return");
429 ok(db_sql_query(db, "SELECT FileId FROM File ORDER By FileId LIMIT 10",
430 db_list_handler, &lctx), "db_list_ctx");
431 ok(lctx.count == 10, "Check db_list_ctx count ");
432 ok(!strcmp(lctx.list, "1,2,3,4,5,6,7,8,9,10"), "Check db_list_ctx list");
434 nok(db_sql_query(db, "blabla", db_int_handler, &j), "Bad query");
436 Mmsg(buf, "CREATE Table %s (a int)", temp);
437 ok(db_sql_query(db, buf, NULL, NULL), "CREATE query");
439 Mmsg(buf, "INSERT INTO %s (a) VALUES (1)", temp);
440 ok(INSERT_DB(jcr, db, buf), "INSERT query");
441 ok(INSERT_DB(jcr, db, buf), "INSERT query");
442 ok(sql_affected_rows(db) == 1, "Check sql_affected_rows");
444 Mmsg(buf, "INSERT INTO aaa%s (a) VALUES (1)", temp);
445 nok(INSERT_DB(jcr, db, buf), "Bad INSERT query");
446 ok(sql_affected_rows(db) == 0, "Check sql_affected_rows");
448 Mmsg(buf, "UPDATE %s SET a = 2", temp);
449 ok(UPDATE_DB(jcr, db, buf), "UPDATE query");
450 ok(sql_affected_rows(db) == 2, "Check sql_affected_rows");
452 Mmsg(buf, "UPDATE %s SET a = 2 WHERE a = 1", temp);
453 nok(UPDATE_DB(jcr, db, buf), "Empty UPDATE query");
455 Mmsg(buf, "UPDATE aaa%s SET a = 2", temp);
456 nok(UPDATE_DB(jcr, db, buf), "Bad UPDATE query");
458 Mmsg(buf, "DELETE FROM %s", temp);
459 ok(DELETE_DB(jcr, db, buf), "DELETE query");
460 nok(DELETE_DB(jcr, db, buf), "Empty DELETE query"); /* TODO bug ? */
462 Mmsg(buf, "DELETE FROM aaa%s", temp);
463 ok(DELETE_DB(jcr, db, buf), "Bad DELETE query"); /* TODO bug ? */
465 Mmsg(buf, "DROP TABLE %s", temp);
466 ok(QUERY_DB(jcr, db, buf), "DROP query");
467 nok(QUERY_DB(jcr, db, buf), "Empty DROP query");
469 /* ---------------------------------------------------------------- */
471 strcpy(buf, "This string should be 'escaped'");
472 db_escape_string(jcr, db, buf2, buf, strlen(buf));
473 ok((strlen(buf) + 2) == strlen(buf2),"Quoted string should be longer");
474 Mmsg(buf, "INSERT INTO Path (Path) VALUES ('%lld-%s')", pid, buf2);
475 ok(db_sql_query(db, buf, NULL, NULL), "Inserting quoted string");
477 /* ---------------------------------------------------------------- */
478 Pmsg0(0, PLINE "Doing Job tests" PLINE);
481 memset(&jr, 0, sizeof(jr));
482 memset(&jr2, 0, sizeof(jr2));
484 ok(db_get_job_record(jcr, db, &jr), "Get Job record for JobId=1");
485 ok(jr.JobFiles > 10, "Check number of files");
487 jr.JobId = (JobId_t)pid;
488 Mmsg(buf, "%s-%lld", jr.Job, pid);
490 ok(db_create_job_record(jcr, db, &jr), "Create Job record");
491 ok(db_update_job_start_record(jcr, db, &jr), "Update Start Record");
492 ok(db_update_job_end_record(jcr, db, &jr), "Update End Record");
493 jr2.JobId = jr.JobId;
494 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by JobId");
497 memset(&jr2, 0, sizeof(jr2));
498 strcpy(jr2.Job, jr.Job);
499 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by Job name");
502 memset(&jr2, 0, sizeof(jr2));
504 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (JobId)");
506 memset(&jr2, 0, sizeof(jr2));
507 strcpy(jr2.Job, "test");
508 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (Job)");
510 /* ---------------------------------------------------------------- */
513 memset(&ar, 0, sizeof(ar));
514 Mmsg(buf2, aPATH aPATH aPATH aPATH "/" aFILE aFILE ".txt");
516 Mmsg(buf3, "gD ImIZ IGk B Po Po A A A JY BNNvf5 BNKzS7 BNNuwC A A C");
519 ar.Stream = STREAM_UNIX_ATTRIBUTES;
520 ar.FileType = FT_REG;
521 jcr->JobId = ar.JobId = jr.JobId;
522 jcr->JobStatus = JS_Running;
523 ok(db_create_attributes_record(jcr, db, &ar), "Inserting Filename");
524 ok(db_write_batch_file_records(jcr), "Commit batch session");
525 Mmsg(buf, "SELECT FileIndex FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
526 ok(db_sql_query(db, buf, db_int_handler, &j), "Get Inserted record");
527 ok(j == ar.FileIndex, "Check FileIndex");
528 Mmsg(buf, "SELECT COUNT(1) FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
529 ok(db_sql_query(db, buf, db_int_handler, &j), "List records");
530 ok(j == 1, "Check batch session records");
532 Mmsg(buf, "%lld", (uint64_t)jcr->JobId);
533 ok(db_get_file_list(jcr, jcr->db_batch, buf, false, false, list_files, &j),
534 "List files with db_get_file_list()");
535 ok(j == 1, "Check db_get_file_list results");
536 /* ---------------------------------------------------------------- */
538 Pmsg0(0, PLINE "Doing Client tests" PLINE);
540 memset(&cr, 0, sizeof(cr));
541 memset(&cr2, 0, sizeof(cr2));
544 cr.FileRetention = 10;
545 cr.JobRetention = 15;
546 bsnprintf(cr.Name, sizeof(cr.Name), "client-%lld-fd", pid);
547 bsnprintf(cr.Uname, sizeof(cr.Uname), "uname-%lld", pid);
549 ok(db_create_client_record(jcr, db, &cr), "db_create_client_record()");
550 ok(cr.ClientId > 0, "Check ClientId");
552 cr2.ClientId = cr.ClientId; /* Save it */
555 Pmsg0(0, "Search client by ClientId\n");
556 ok(db_create_client_record(jcr, db, &cr),"Should get the client record");
557 ok(cr.ClientId == cr2.ClientId, "Check if ClientId is the same");
559 ok(db_get_client_record(jcr, db, &cr2), "Search client by ClientId");
562 Pmsg0(0, "Search client by Name\n");
563 memset(&cr2, 0, sizeof(cr2));
564 strcpy(cr2.Name, cr.Name);
565 ok(db_get_client_record(jcr, db, &cr2),"Search client by Name");
568 Pmsg0(0, "Search non existing client by Name\n");
569 memset(&cr2, 0, sizeof(cr2));
570 bsnprintf(cr2.Name, sizeof(cr2.Name), "hollow-client-%lld-fd", pid);
571 nok(db_get_client_record(jcr, db, &cr2), "Search non existing client");
572 ok(cr2.ClientId == 0, "Check ClientId after failed search");
575 strcpy(cr.Uname, "NewUname");
576 ok(db_update_client_record(jcr, db, &cr), "Update Client record");
577 memset(&cr2, 0, sizeof(cr2));
578 cr2.ClientId = cr.ClientId;
579 ok(db_get_client_record(jcr, db, &cr2),"Search client by ClientId");
584 ok(db_get_client_ids(jcr, db, &nb, &ret_ids), "Get Client Ids");
585 ok(nb > 0, "Should find at least 1 Id");
586 for (i = 0; i < nb; i++) {
587 if (ret_ids[i] == cr2.ClientId) {
591 ok(i < nb, "Check if ClientId was found");
593 /* ---------------------------------------------------------------- */
594 Pmsg0(0, PLINE "Doing Pool tests" PLINE);
596 memset(&pr, 0, sizeof(pr));
597 memset(&pr2, 0, sizeof(pr2));
599 bsnprintf(pr.Name, sizeof(pr.Name), "pool-%lld", pid);
602 pr.UseCatalog = true;
603 pr.AcceptAnyVolume = true;
606 pr.VolRetention = 1000;
607 pr.VolUseDuration = 1000;
609 pr.MaxVolFiles = 1000;
610 pr.MaxVolBytes = 1000000;
611 strcpy(pr.PoolType, "Backup");
613 pr.LabelFormat[0] = 0;
614 pr.RecyclePoolId = 0;
615 pr.ScratchPoolId = 0;
616 pr.ActionOnPurge = 1;
618 ok(db_create_pool_record(jcr, db, &pr), "db_create_pool_record()");
619 ok(pr.PoolId > 0, "Check PoolId");
621 pr2.PoolId = pr.PoolId;
624 Pmsg0(0, "Search pool by PoolId\n");
625 nok(db_create_pool_record(jcr, db, &pr),"Can't create pool twice");
626 ok(db_get_pool_numvols(jcr, db, &pr2), "Search pool by PoolId");
630 pr2.AutoPrune = false;
633 pr2.VolUseDuration++;
637 strcpy(pr2.PoolType, "Restore");
638 strcpy(pr2.LabelFormat, "VolFormat");
639 pr2.RecyclePoolId = 0;
640 pr2.ScratchPoolId = 0;
641 pr2.ActionOnPurge = 2;
643 ok(db_update_pool_record(jcr, db, &pr2), "Update Pool record");
644 memset(&pr, 0, sizeof(pr));
645 pr.PoolId = pr2.PoolId;
646 ok(db_get_pool_numvols(jcr, db, &pr), "Search pool by PoolId");
649 ok(db_delete_pool_record(jcr, db, &pr), "Delete Pool");
650 nok(db_delete_pool_record(jcr, db, &pr), "Delete non existing Pool");
651 nok(db_update_pool_record(jcr, db, &pr), "Update non existing Pool");
652 ok(db_create_pool_record(jcr, db, &pr), "Recreate Pool");
654 /* ---------------------------------------------------------------- */
655 Pmsg0(0, PLINE "Doing Media tests" PLINE);
658 memset(&mr, 0, sizeof(mr));
659 memset(&mr2, 0, sizeof(mr2));
661 bsnprintf(mr.VolumeName, sizeof(mr.VolumeName), "media-%lld", pid);
662 bsnprintf(mr.MediaType, sizeof(mr.MediaType), "type-%lld", pid);
664 /* from set_pool_dbr_defaults_in_media_dbr(&mr, &pr); */
665 mr.PoolId = pr.PoolId;
666 bstrncpy(mr.VolStatus, NT_("Append"), sizeof(mr.VolStatus));
667 mr.Recycle = pr.Recycle;
668 mr.VolRetention = pr.VolRetention;
669 mr.VolUseDuration = pr.VolUseDuration;
670 mr.ActionOnPurge = pr.ActionOnPurge;
671 mr.RecyclePoolId = pr.RecyclePoolId;
672 mr.MaxVolJobs = pr.MaxVolJobs;
673 mr.MaxVolFiles = pr.MaxVolFiles;
674 mr.MaxVolBytes = pr.MaxVolBytes;
675 mr.LabelType = pr.LabelType;
678 mr.VolCapacityBytes = 1000;
682 mr.VolReadTime = 10000;
683 mr.VolWriteTime = 99999;
687 mr.ScratchPoolId = 0;
688 mr.RecyclePoolId = 0;
690 ok(db_create_media_record(jcr, db, &mr), "Create Media");
691 nok(db_create_media_record(jcr, db, &mr), "Create Media twice");
693 /* ---------------------------------------------------------------- */
694 Pmsg0(0, PLINE "Doing ... tests" PLINE);
696 db_close_database(jcr, db);
698 free_pool_memory(buf);
699 free_pool_memory(buf2);
700 free_pool_memory(buf3);