dl-11-create-relation.c [plain text]
#include <stdlib.h>
#include <unistd.h>
#include <Security/cssmapi.h>
#include <Security/cssmapple.h>
#include "testmore.h"
#include "testenv.h"
#include "testcssm.h"
#define DBNAME "testdl"
CSSM_APPLEDL_OPEN_PARAMETERS openParameters =
{
sizeof(CSSM_APPLEDL_OPEN_PARAMETERS),
CSSM_APPLEDL_OPEN_PARAMETERS_VERSION,
CSSM_FALSE,
kCSSM_APPLEDL_MASK_MODE,
0600
};
CSSM_DBINFO dbInfo =
{
0 ,
NULL,
NULL,
NULL,
CSSM_TRUE ,
NULL,
NULL
};
CSSM_DB_SCHEMA_ATTRIBUTE_INFO attributeInfo[] =
{
{
1,
"One",
{},
CSSM_DB_ATTRIBUTE_FORMAT_STRING
},
{
2,
"Two",
{},
CSSM_DB_ATTRIBUTE_FORMAT_STRING
}
};
CSSM_DB_SCHEMA_INDEX_INFO indexInfo[] =
{
{
1,
0,
CSSM_DB_INDEX_UNIQUE,
CSSM_DB_INDEX_ON_ATTRIBUTE
},
{
1,
1,
CSSM_DB_INDEX_NONUNIQUE,
CSSM_DB_INDEX_ON_ATTRIBUTE
},
{
2,
2,
CSSM_DB_INDEX_NONUNIQUE,
CSSM_DB_INDEX_ON_ATTRIBUTE
}
};
CSSM_DATA values[] =
{
{ 5, (uint8 *)"value" }
};
CSSM_DB_ATTRIBUTE_DATA attributeData[] =
{
{
{
CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
{ "One" },
CSSM_DB_ATTRIBUTE_FORMAT_STRING
},
sizeof(values) / sizeof(CSSM_DATA),
values
},
{
{
CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
{ "Two" },
CSSM_DB_ATTRIBUTE_FORMAT_STRING
},
sizeof(values) / sizeof(CSSM_DATA),
values
}
};
CSSM_DB_RECORD_ATTRIBUTE_DATA attributes =
{
42,
0,
sizeof(attributeData) / sizeof(CSSM_DB_ATTRIBUTE_DATA),
attributeData
};
int
static test1(CSSM_DL_HANDLE dl)
{
int pass = 1;
CSSM_DL_DB_HANDLE dldb = { dl };
CSSM_DB_UNIQUE_RECORD_PTR uniqueId;
pass &= ok_status(CSSM_DL_DbCreate(dl, DBNAME, NULL ,
&dbInfo,
CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
NULL ,
&openParameters,
&dldb.DBHandle),
"CSSM_DL_DbCreate");
pass &= is_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId),
CSSMERR_DL_INVALID_RECORDTYPE, "CSSM_DL_DataInsert no table");
pass &= ok_status(CSSM_DL_CreateRelation(dldb,
42,
"Fourty Two",
sizeof(attributeInfo) / sizeof(CSSM_DB_SCHEMA_ATTRIBUTE_INFO),
attributeInfo,
sizeof(indexInfo) / sizeof(CSSM_DB_SCHEMA_INDEX_INFO),
indexInfo), "CSSM_DL_CreateRelation");
pass &= ok_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId), "CSSM_DL_DataInsert");
pass &= is_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId),
CSSMERR_DL_INVALID_UNIQUE_INDEX_DATA, "CSSM_DL_DataInsert dupe");
pass &= ok_status(CSSM_DL_FreeUniqueRecord(dldb, uniqueId),
"CSSM_DL_FreeUniqueRecord");
pass &= ok_status(CSSM_DL_DbClose(dldb),
"CSSM_DL_DbClose");
return pass;
}
int
static test2(CSSM_DL_HANDLE dl)
{
int pass = 1;
CSSM_DL_DB_HANDLE dldb = { dl };
CSSM_DB_UNIQUE_RECORD_PTR uniqueId;
pass &= ok_status(CSSM_DL_DbCreate(dl, DBNAME, NULL ,
&dbInfo,
CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
NULL ,
NULL,
&dldb.DBHandle),
"CSSM_DL_DbCreate");
pass &= ok_status(CSSM_DL_DbClose(dldb),
"CSSM_DL_DbClose");
pass &= ok_status(CSSM_DL_DbOpen(dl, DBNAME, NULL ,
CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
NULL ,
&openParameters,
&dldb.DBHandle),
"CSSM_DL_DbOpen");
pass &= is_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId),
CSSMERR_DL_INVALID_RECORDTYPE, "CSSM_DL_DataInsert no table");
pass &= ok_status(CSSM_DL_CreateRelation(dldb,
42,
"Fourty Two",
sizeof(attributeInfo) / sizeof(CSSM_DB_SCHEMA_ATTRIBUTE_INFO),
attributeInfo,
sizeof(indexInfo) / sizeof(CSSM_DB_SCHEMA_INDEX_INFO),
indexInfo), "CSSM_DL_CreateRelation");
pass &= ok_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId), "CSSM_DL_DataInsert fails unless 4039735 is fixed");
pass &= is_status(CSSM_DL_DataInsert(dldb,
attributes.DataRecordType,
&attributes,
NULL,
&uniqueId),
CSSMERR_DL_INVALID_UNIQUE_INDEX_DATA,
"CSSM_DL_DataInsert dupe");
pass &= ok_status(CSSM_DL_FreeUniqueRecord(dldb, uniqueId),
"CSSM_DL_FreeUniqueRecord");
pass &= ok_status(CSSM_DL_DbClose(dldb),
"CSSM_DL_DbDelete");
return pass;
}
int
main(int argc, char * const *argv)
{
int guid_alt = argc > 1 && !strcmp(argv[1], "-g");
CSSM_GUID s3dl_guid =
{
0x2cb56191, 0xee6f, 0x432d,
{ 0xa3, 0x77, 0x85, 0x3d, 0x3c, 0x6b, 0x94, 0x9e }
};
const CSSM_GUID *guid = guid_alt ? & s3dl_guid : &gGuidAppleFileDL;
int pass = 1;
plan_tests(23);
CSSM_DL_HANDLE dl;
pass &= ok(cssm_attach(guid, &dl), "cssm_attach");
pass &= ok(tests_begin(argc, argv), "tests_begin");
pass &= ok(test1(dl), "insert record in new table with ac off");
pass &= ok_status(CSSM_DL_DbDelete(dl, DBNAME, NULL ,
NULL ), "CSSM_DL_DbDelete");
pass &= ok(test2(dl),
"insert record in existing db in new table with ac off");
pass &= ok_status(CSSM_DL_DbDelete(dl, DBNAME, NULL ,
NULL ), "CSSM_DL_DbDelete");
pass &= ok(cssm_detach(guid, dl), "cssm_detach");
return !tests_end(pass);
}