2 Bacula® - The Network Backup Solution
4 Copyright (C) 2011-2011 Free Software Foundation Europe e.V.
6 The main author of Bacula is Kern Sibbald, with contributions from
7 many others, a complete list can be found in the file AUTHORS.
8 This program is Free Software; you can redistribute it and/or
9 modify it under the terms of version three of the GNU Affero General Public
10 License as published by the Free Software Foundation and included
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU Affero General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23 Bacula® is a registered trademark of Kern Sibbald.
24 The licensor of Bacula is the Free Software Foundation Europe
25 (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
26 Switzerland, email:ftf@fsfeurope.org.
29 * Program to test CATS DB routines
37 #include "cats/cats.h"
38 #include "cats/bvfs.h"
39 #include "findlib/find.h"
43 static const char *file = "COPYRIGHT";
44 //static DBId_t fnid=0;
45 static const char *db_name = "bacula";
46 static const char *db_user = "bacula";
47 static const char *db_password = "";
48 static const char *db_host = NULL;
49 static const char *db_address = NULL;
50 static int db_port = 0;
51 static int64_t pid = 0;
54 #define PLINE "\n============================================================\n"
59 "\nVersion: %s (%s)\n"
60 " -d <nn> set debug level to <nn>\n"
61 " -dt print timestamp in debug output\n"
62 " -n <name> specify the database name (default bacula)\n"
63 " -u <user> specify database user name (default bacula)\n"
64 " -P <password specify database password (default none)\n"
65 " -h <host> specify database host (default NULL)\n"
66 " -w <working> specify working directory\n"
67 " -p <path> specify path\n"
68 " -f <file> specify file\n"
69 " -l <limit> maximum tuple to fetch\n"
70 " -q print only errors\n"
72 " -? print this message\n\n"), 2011, VERSION, BDATE);
81 bool _warn(const char *file, int l, const char *op, int value, const char *label)
87 printf("WRN %.30s %s:%i on %s\n", label, file, l, op);
90 printf("OK %.30s\n", label);
95 #define warn(x, label) _warn(__FILE__, __LINE__, #x, (x), label)
97 bool _ok(const char *file, int l, const char *op, int value, const char *label)
103 printf("ERR %.30s %s:%i on %s\n", label, file, l, op);
107 printf("OK %.30s\n", label);
113 #define ok(x, label) _ok(__FILE__, __LINE__, #x, (x), label)
115 bool _nok(const char *file, int l, const char *op, int value, const char *label)
121 printf("ERR %.30s %s:%i on !%s\n", label, file, l, op);
125 printf("OK %.30s\n", label);
131 #define nok(x, label) _nok(__FILE__, __LINE__, #x, (x), label)
135 printf("Result %i/%i OK\n", _nb - _err, _nb);
139 static void cmp_pool(POOL_DBR &pr, POOL_DBR &pr2)
141 ok(pr.MaxVols == pr2.MaxVols, " Check Pool MaxVols");
142 ok(pr.UseOnce == pr2.UseOnce, " Check Pool UseOnce");
143 ok(pr.UseCatalog == pr2.UseCatalog, " Check Pool UseCatalog");
144 ok(pr.AcceptAnyVolume == pr2.AcceptAnyVolume," Check Pool AcceptAnyVolume");
145 ok(pr.AutoPrune == pr2.AutoPrune, " Check Pool AutoPrune");
146 ok(pr.Recycle == pr2.Recycle, " Check Pool Recycle");
147 ok(pr.VolRetention == pr2.VolRetention , " Check Pool VolRetention");
148 ok(pr.VolUseDuration == pr2.VolUseDuration, " Check Pool VolUseDuration");
149 ok(pr.MaxVolJobs == pr2.MaxVolJobs, " Check Pool MaxVolJobs");
150 ok(pr.MaxVolFiles == pr2.MaxVolFiles, " Check Pool MaxVolFiles");
151 ok(pr.MaxVolBytes == pr2.MaxVolBytes, " Check Pool MaxVolBytes");
152 ok(!strcmp(pr.PoolType, pr2.PoolType), " Check Pool PoolType");
153 ok(pr.LabelType == pr2.LabelType, " Check Pool LabelType");
154 ok(!strcmp(pr.LabelFormat, pr2.LabelFormat), " Check Pool LabelFormat");
155 ok(pr.RecyclePoolId == pr2.RecyclePoolId, " Check Pool RecyclePoolId");
156 ok(pr.ScratchPoolId == pr2.ScratchPoolId, " Check Pool ScratchPoolId");
157 ok(pr.ActionOnPurge == pr2.ActionOnPurge, " Check Pool ActionOnPurge");
160 static void cmp_client(CLIENT_DBR &cr, CLIENT_DBR &cr2)
162 ok(!strcmp(cr2.Name, cr.Name), " Check Client Name");
163 ok(!strcmp(cr2.Uname, cr.Uname), " Check Client Uname");
164 ok(cr.AutoPrune == cr2.AutoPrune, " Check Client Autoprune");
165 ok(cr.JobRetention == cr2.JobRetention, " Check Client JobRetention");
166 ok(cr.FileRetention == cr2.FileRetention," Check Client FileRetention");
169 static void cmp_job(JOB_DBR &jr, JOB_DBR &jr2)
171 ok(jr.VolSessionId == jr2.VolSessionId, " Check VolSessionId");
172 ok(jr.VolSessionTime == jr2.VolSessionTime, " Check VolSessionTime");
173 ok(jr.PoolId == jr2.PoolId, " Check PoolId");
174 ok(jr.StartTime == jr2.StartTime, " Check StartTime");
175 ok(jr.EndTime == jr2.EndTime, " Check EndTime");
176 ok(jr.JobFiles == jr2.JobFiles, " Check JobFiles");
177 ok(jr.JobBytes == jr2.JobBytes, " Check JobBytes");
178 ok(jr.JobTDate == jr2.JobTDate, " Check JobTDate");
179 ok(!strcmp(jr.Job, jr2.Job), " Check Job");
180 ok(jr.JobStatus == jr2.JobStatus, " Check JobStatus");
181 ok(jr.JobType == jr2.JobType, " Check Type");
182 ok(jr.JobLevel == jr2.JobLevel, " Check Level");
183 ok(jr.ClientId == jr2.ClientId, " Check ClientId");
184 ok(!strcmp(jr.Name, jr2.Name), " Check Name");
185 ok(jr.PriorJobId == jr2.PriorJobId, " Check PriorJobId");
186 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
187 ok(jr.JobId == jr2.JobId, " Check JobId");
188 ok(jr.FileSetId == jr2.FileSetId, " Check FileSetId");
189 ok(jr.SchedTime == jr2.SchedTime, " Check SchedTime");
190 ok(jr.RealEndTime == jr2.RealEndTime, " Check RealEndTime");
191 ok(jr.ReadBytes == jr2.ReadBytes, " Check ReadBytes");
192 ok(jr.HasBase == jr2.HasBase, " Check HasBase");
193 ok(jr.PurgedFiles == jr2.PurgedFiles, " Check PurgedFiles");
197 #define aPATH "/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
198 #define aFILE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
200 static int list_files(void *ctx, int nb_col, char **row)
202 uint32_t *k = (uint32_t*) ctx;
204 ok(!strcmp(row[0], aPATH aPATH aPATH aPATH "/"), "Check path");
205 ok(!strcmp(row[1], aFILE aFILE ".txt"), "Check filename");
206 ok(str_to_int64(row[2]) == 10, "Check FileIndex");
207 ok(str_to_int64(row[3]) == jcr->JobId, "Check JobId");
211 static int count_col(void *ctx, int nb_col, char **row)
213 *((int32_t*) ctx) = nb_col;
217 /* number of thread started */
219 int main (int argc, char *argv[])
222 char *path=NULL, *client=NULL;
225 bool full_test=false;
229 POOLMEM *buf = get_pool_memory(PM_FNAME);
230 POOLMEM *buf2 = get_pool_memory(PM_FNAME);
231 POOLMEM *buf3 = get_pool_memory(PM_FNAME);
233 setlocale(LC_ALL, "");
234 bindtextdomain("bacula", LOCALEDIR);
235 textdomain("bacula");
239 Pmsg0(0, "Starting cats_test tool" PLINE);
241 my_name_is(argc, argv, "");
242 init_msg(NULL, NULL);
246 while ((ch = getopt(argc, argv, "qh:c:l:d:n:P:Su:vFw:?p:f:T")) != -1) {
251 case 'd': /* debug level */
252 if (*optarg == 't') {
253 dbg_timestamp = true;
255 debug_level = atoi(optarg);
256 if (debug_level <= 0) {
262 limit = str_to_int64(optarg);
278 working_directory = optarg;
286 db_password = optarg;
319 Pmsg0(0, _("Wrong number of arguments: \n"));
327 * - With multiple thread in //
329 * - Test all sql_cmds.c
330 * - Test all sql.c (db_)
331 * - Test all sql_create.c
335 jcr = new_jcr(sizeof(JCR), NULL);
336 jcr->set_JobType(JT_CONSOLE);
337 jcr->set_JobLevel(L_NONE);
338 jcr->JobStatus = JS_Running;
339 bstrncpy(jcr->Job, "**dummy**", sizeof(jcr->Job));
340 jcr->JobId = pid; /* this is JobId on tape */
341 jcr->start_time = jcr->sched_time = time(NULL);
343 /* Test DB connexion */
344 Pmsg1(0, PLINE "Test DB connection \"%s\"" PLINE, db_name);
347 db = db_init(jcr /* JCR */,
348 NULL /* dbi driver */,
349 db_name, db_user, db_password, db_address, db_port + 100,
350 NULL /* db_socket */,
351 0 /* mult_db_connections */);
352 ok(db != NULL, "Test bad connection");
357 nok(db_open_database(jcr, db), "Open bad Database");
358 db_close_database(jcr, db);
361 db = db_init(jcr /* JCR */,
362 NULL /* dbi driver */,
363 db_name, db_user, db_password, db_address, db_port,
364 NULL /* db_socket */,
365 0 /* mult_db_connections */);
367 ok(db != NULL, "Test db connection");
372 if (!ok(db_open_database(jcr, db), "Open Database")) {
373 Pmsg1(000, _("Could not open database \"%s\".\n"), db_name);
374 Jmsg(jcr, M_FATAL, 0, _("Could not open, database \"%s\".\n"), db_name);
375 Jmsg(jcr, M_FATAL, 0, _("%s"), db_strerror(db));
376 Pmsg1(000, "%s", db_strerror(db));
377 db_close_database(jcr, db);
383 /* Check if the SQL library is thread-safe */
384 db_check_backend_thread_safe();
385 ok(check_tables_version(jcr, db), "Check table version");
386 ok(db_sql_query(db, "SELECT VersionId FROM Version",
387 db_int_handler, &j), "SELECT VersionId");
389 ok(UPDATE_DB(jcr, db, (char*)"UPDATE Version SET VersionId = 1"),
391 nok(check_tables_version(jcr, db), "Check table version");
392 Mmsg(buf, "UPDATE Version SET VersionId = %d", j);
393 ok(UPDATE_DB(jcr, db, buf), "Restore VersionId");
395 if (dbtype != SQL_TYPE_SQLITE3) {
396 ok(db_check_max_connections(jcr, db, 1), "Test min Max Connexion");
397 nok(db_check_max_connections(jcr, db, 10000), "Test max Max Connexion");
400 ok(db_open_batch_connexion(jcr, db), "Opening batch connection");
401 db_close_database(jcr, jcr->db_batch);
402 jcr->db_batch = NULL;
404 /* ---------------------------------------------------------------- */
406 uint32_t storageid=0;
407 ok(db_sql_query(db, "SELECT MIN(StorageId) FROM Storage",
408 db_int_handler, &storageid), "Get StorageId");
409 ok(storageid > 0, "Check StorageId");
411 Pmsg0(0, "Please, run REGRESS_DEBUG=1 tests/bacula-backup-test before this test");
415 /* ---------------------------------------------------------------- */
416 Pmsg0(0, PLINE "Doing Basic SQL tests" PLINE);
417 ok(db_sql_query(db, "SELECT 1,2,3,4,5", count_col, &j), "Count 5 rows");
418 ok(j == 5, "Check number of columns");
419 ok(db_sql_query(db, "SELECT 1,2,3,4,5,'a','b','c','d','e'",
420 count_col, &j), "Count 10 rows");
421 ok(j == 10, "Check number of columns");
423 bsnprintf(temp, sizeof(temp), "t%lld", pid);
424 ok(db_sql_query(db, "SELECT 2", db_int_handler, &j), "Good SELECT query");
425 ok(db_sql_query(db, "SELECT 1 FROM Media WHERE VolumeName='missing'",
426 db_int_handler, &j), "Good empty SELECT query");
429 i64.value = 0; i64.count = 0;
430 ok(db_sql_query(db, "SELECT 1",db_int64_handler, &i64),"db_int64_handler");
431 ok(i64.value == 1, "Check db_int64_handler return");
434 ok(db_sql_query(db, "SELECT FileId FROM File ORDER By FileId LIMIT 10",
435 db_list_handler, &lctx), "db_list_ctx");
436 ok(lctx.count == 10, "Check db_list_ctx count ");
437 ok(!strcmp(lctx.list, "1,2,3,4,5,6,7,8,9,10"), "Check db_list_ctx list");
439 nok(db_sql_query(db, "blabla", db_int_handler, &j), "Bad query");
441 Mmsg(buf, "CREATE Table %s (a int)", temp);
442 ok(db_sql_query(db, buf, NULL, NULL), "CREATE query");
444 Mmsg(buf, "INSERT INTO %s (a) VALUES (1)", temp);
445 ok(INSERT_DB(jcr, db, buf), "INSERT query");
446 ok(INSERT_DB(jcr, db, buf), "INSERT query");
447 ok(sql_affected_rows(db) == 1, "Check sql_affected_rows");
449 Mmsg(buf, "INSERT INTO aaa%s (a) VALUES (1)", temp);
450 nok(INSERT_DB(jcr, db, buf), "Bad INSERT query");
451 ok(sql_affected_rows(db) == 0, "Check sql_affected_rows");
453 Mmsg(buf, "UPDATE %s SET a = 2", temp);
454 ok(UPDATE_DB(jcr, db, buf), "UPDATE query");
455 ok(sql_affected_rows(db) == 2, "Check sql_affected_rows");
457 Mmsg(buf, "UPDATE %s SET a = 2 WHERE a = 1", temp);
458 nok(UPDATE_DB(jcr, db, buf), "Empty UPDATE query");
460 Mmsg(buf, "UPDATE aaa%s SET a = 2", temp);
461 nok(UPDATE_DB(jcr, db, buf), "Bad UPDATE query");
463 Mmsg(buf, "DELETE FROM %s", temp);
464 ok(DELETE_DB(jcr, db, buf), "DELETE query");
465 nok(DELETE_DB(jcr, db, buf), "Empty DELETE query"); /* TODO bug ? */
467 Mmsg(buf, "DELETE FROM aaa%s", temp);
468 ok(DELETE_DB(jcr, db, buf), "Bad DELETE query"); /* TODO bug ? */
470 Mmsg(buf, "DROP TABLE %s", temp);
471 ok(QUERY_DB(jcr, db, buf), "DROP query");
472 nok(QUERY_DB(jcr, db, buf), "Empty DROP query");
474 /* ---------------------------------------------------------------- */
476 strcpy(buf, "This string should be 'escaped'");
477 db_escape_string(jcr, db, buf2, buf, strlen(buf));
478 ok((strlen(buf) + 2) == strlen(buf2),"Quoted string should be longer");
479 Mmsg(buf, "INSERT INTO Path (Path) VALUES ('%lld-%s')", pid, buf2);
480 ok(db_sql_query(db, buf, NULL, NULL), "Inserting quoted string");
482 /* ---------------------------------------------------------------- */
483 Pmsg0(0, PLINE "Doing Job tests" PLINE);
486 memset(&jr, 0, sizeof(jr));
487 memset(&jr2, 0, sizeof(jr2));
489 ok(db_get_job_record(jcr, db, &jr), "Get Job record for JobId=1");
490 ok(jr.JobFiles > 10, "Check number of files");
492 jr.JobId = (JobId_t)pid;
493 Mmsg(buf, "%s-%lld", jr.Job, pid);
495 ok(db_create_job_record(jcr, db, &jr), "Create Job record");
496 ok(db_update_job_start_record(jcr, db, &jr), "Update Start Record");
497 ok(db_update_job_end_record(jcr, db, &jr), "Update End Record");
498 jr2.JobId = jr.JobId;
499 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by JobId");
502 memset(&jr2, 0, sizeof(jr2));
503 strcpy(jr2.Job, jr.Job);
504 ok(db_get_job_record(jcr, db, &jr2), "Get Job record by Job name");
507 memset(&jr2, 0, sizeof(jr2));
509 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (JobId)");
511 memset(&jr2, 0, sizeof(jr2));
512 strcpy(jr2.Job, "test");
513 nok(db_get_job_record(jcr, db, &jr2), "Get non existing Job record (Job)");
515 /* ---------------------------------------------------------------- */
518 memset(&ar, 0, sizeof(ar));
519 Mmsg(buf2, aPATH aPATH aPATH aPATH "/" aFILE aFILE ".txt");
521 Mmsg(buf3, "gD ImIZ IGk B Po Po A A A JY BNNvf5 BNKzS7 BNNuwC A A C");
524 ar.Stream = STREAM_UNIX_ATTRIBUTES;
525 ar.FileType = FT_REG;
526 jcr->JobId = ar.JobId = jr.JobId;
527 jcr->JobStatus = JS_Running;
528 ok(db_create_file_attributes_record(jcr, db, &ar), "Inserting Filename");
529 ok(db_write_batch_file_records(jcr), "Commit batch session");
530 Mmsg(buf, "SELECT FileIndex FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
531 ok(db_sql_query(db, buf, db_int_handler, &j), "Get Inserted record");
532 ok(j == ar.FileIndex, "Check FileIndex");
533 Mmsg(buf, "SELECT COUNT(1) FROM File WHERE JobId=%lld",(int64_t)jcr->JobId);
534 ok(db_sql_query(db, buf, db_int_handler, &j), "List records");
535 ok(j == 1, "Check batch session records");
537 Mmsg(buf, "%lld", (uint64_t)jcr->JobId);
538 ok(db_get_file_list(jcr, jcr->db_batch, buf, false, false, list_files, &j),
539 "List files with db_get_file_list()");
540 ok(j == 1, "Check db_get_file_list results");
541 /* ---------------------------------------------------------------- */
543 Pmsg0(0, PLINE "Doing Client tests" PLINE);
545 memset(&cr, 0, sizeof(cr));
546 memset(&cr2, 0, sizeof(cr2));
549 cr.FileRetention = 10;
550 cr.JobRetention = 15;
551 bsnprintf(cr.Name, sizeof(cr.Name), "client-%lld-fd", pid);
552 bsnprintf(cr.Uname, sizeof(cr.Uname), "uname-%lld", pid);
554 ok(db_create_client_record(jcr, db, &cr), "db_create_client_record()");
555 ok(cr.ClientId > 0, "Check ClientId");
557 cr2.ClientId = cr.ClientId; /* Save it */
560 Pmsg0(0, "Search client by ClientId\n");
561 ok(db_create_client_record(jcr, db, &cr),"Should get the client record");
562 ok(cr.ClientId == cr2.ClientId, "Check if ClientId is the same");
564 ok(db_get_client_record(jcr, db, &cr2), "Search client by ClientId");
567 Pmsg0(0, "Search client by Name\n");
568 memset(&cr2, 0, sizeof(cr2));
569 strcpy(cr2.Name, cr.Name);
570 ok(db_get_client_record(jcr, db, &cr2),"Search client by Name");
573 Pmsg0(0, "Search non existing client by Name\n");
574 memset(&cr2, 0, sizeof(cr2));
575 bsnprintf(cr2.Name, sizeof(cr2.Name), "hollow-client-%lld-fd", pid);
576 nok(db_get_client_record(jcr, db, &cr2), "Search non existing client");
577 ok(cr2.ClientId == 0, "Check ClientId after failed search");
580 strcpy(cr.Uname, "NewUname");
581 ok(db_update_client_record(jcr, db, &cr), "Update Client record");
582 memset(&cr2, 0, sizeof(cr2));
583 cr2.ClientId = cr.ClientId;
584 ok(db_get_client_record(jcr, db, &cr2),"Search client by ClientId");
589 ok(db_get_client_ids(jcr, db, &nb, &ret_ids), "Get Client Ids");
590 ok(nb > 0, "Should find at least 1 Id");
591 for (i = 0; i < nb; i++) {
592 if (ret_ids[i] == cr2.ClientId) {
596 ok(i < nb, "Check if ClientId was found");
598 /* ---------------------------------------------------------------- */
599 Pmsg0(0, PLINE "Doing Pool tests" PLINE);
601 memset(&pr, 0, sizeof(pr));
602 memset(&pr2, 0, sizeof(pr2));
604 bsnprintf(pr.Name, sizeof(pr.Name), "pool-%lld", pid);
607 pr.UseCatalog = true;
608 pr.AcceptAnyVolume = true;
611 pr.VolRetention = 1000;
612 pr.VolUseDuration = 1000;
614 pr.MaxVolFiles = 1000;
615 pr.MaxVolBytes = 1000000;
616 strcpy(pr.PoolType, "Backup");
618 pr.LabelFormat[0] = 0;
619 pr.RecyclePoolId = 0;
620 pr.ScratchPoolId = 0;
621 pr.ActionOnPurge = 1;
623 ok(db_create_pool_record(jcr, db, &pr), "db_create_pool_record()");
624 ok(pr.PoolId > 0, "Check PoolId");
626 pr2.PoolId = pr.PoolId;
629 Pmsg0(0, "Search pool by PoolId\n");
630 nok(db_create_pool_record(jcr, db, &pr),"Can't create pool twice");
631 ok(db_get_pool_record(jcr, db, &pr2), "Search pool by PoolId");
635 pr2.AutoPrune = false;
638 pr2.VolUseDuration++;
642 strcpy(pr2.PoolType, "Restore");
643 strcpy(pr2.LabelFormat, "VolFormat");
644 pr2.RecyclePoolId = 0;
645 pr2.ScratchPoolId = 0;
646 pr2.ActionOnPurge = 2;
648 ok(db_update_pool_record(jcr, db, &pr2), "Update Pool record");
649 memset(&pr, 0, sizeof(pr));
650 pr.PoolId = pr2.PoolId;
651 ok(db_get_pool_record(jcr, db, &pr), "Search pool by PoolId");
654 ok(db_delete_pool_record(jcr, db, &pr), "Delete Pool");
655 nok(db_delete_pool_record(jcr, db, &pr), "Delete non existing Pool");
656 nok(db_update_pool_record(jcr, db, &pr), "Update non existing Pool");
657 ok(db_create_pool_record(jcr, db, &pr), "Recreate Pool");
659 /* ---------------------------------------------------------------- */
660 Pmsg0(0, PLINE "Doing Media tests" PLINE);
663 memset(&mr, 0, sizeof(mr));
664 memset(&mr2, 0, sizeof(mr2));
666 bsnprintf(mr.VolumeName, sizeof(mr.VolumeName), "media-%lld", pid);
667 bsnprintf(mr.MediaType, sizeof(mr.MediaType), "type-%lld", pid);
669 /* from set_pool_dbr_defaults_in_media_dbr(&mr, &pr); */
670 mr.PoolId = pr.PoolId;
671 bstrncpy(mr.VolStatus, NT_("Append"), sizeof(mr.VolStatus));
672 mr.Recycle = pr.Recycle;
673 mr.VolRetention = pr.VolRetention;
674 mr.VolUseDuration = pr.VolUseDuration;
675 mr.ActionOnPurge = pr.ActionOnPurge;
676 mr.RecyclePoolId = pr.RecyclePoolId;
677 mr.MaxVolJobs = pr.MaxVolJobs;
678 mr.MaxVolFiles = pr.MaxVolFiles;
679 mr.MaxVolBytes = pr.MaxVolBytes;
680 mr.LabelType = pr.LabelType;
683 mr.VolCapacityBytes = 1000;
687 mr.VolReadTime = 10000;
688 mr.VolWriteTime = 99999;
692 mr.ScratchPoolId = 0;
693 mr.RecyclePoolId = 0;
695 ok(db_create_media_record(jcr, db, &mr), "Create Media");
696 nok(db_create_media_record(jcr, db, &mr), "Create Media twice");
698 /* ---------------------------------------------------------------- */
699 Pmsg0(0, PLINE "Doing ... tests" PLINE);
701 db_close_database(jcr, db);
703 free_pool_memory(buf);
704 free_pool_memory(buf2);
705 free_pool_memory(buf3);