]> git.saurik.com Git - apple/security.git/blob - SecurityTests/regressions/dl/dl-11-create-relation.c
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / regressions / dl / dl-11-create-relation.c
1 /*
2 * Copyright (c) 2005 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 *
23 * 01DL_CreateReleation.c
24 */
25
26 #include <stdlib.h>
27 #include <unistd.h>
28 #include <Security/cssmapi.h>
29 #include <Security/cssmapple.h>
30
31 #include "testmore.h"
32 #include "testenv.h"
33 #include "testcssm.h"
34
35 #define DBNAME "testdl"
36
37 CSSM_APPLEDL_OPEN_PARAMETERS openParameters =
38 {
39 sizeof(CSSM_APPLEDL_OPEN_PARAMETERS),
40 CSSM_APPLEDL_OPEN_PARAMETERS_VERSION,
41 CSSM_FALSE,
42 kCSSM_APPLEDL_MASK_MODE,
43 0600
44 };
45 CSSM_DBINFO dbInfo =
46 {
47 0 /* NumberOfRecordTypes */,
48 NULL,
49 NULL,
50 NULL,
51 CSSM_TRUE /* IsLocal */,
52 NULL, /* AccessPath - URL, dir path, etc. */
53 NULL /* reserved */
54 };
55 CSSM_DB_SCHEMA_ATTRIBUTE_INFO attributeInfo[] =
56 {
57 {
58 1,
59 "One",
60 {},
61 CSSM_DB_ATTRIBUTE_FORMAT_STRING
62 },
63 {
64 2,
65 "Two",
66 {},
67 CSSM_DB_ATTRIBUTE_FORMAT_STRING
68 }
69 };
70 CSSM_DB_SCHEMA_INDEX_INFO indexInfo[] =
71 {
72 {
73 1,
74 0,
75 CSSM_DB_INDEX_UNIQUE,
76 CSSM_DB_INDEX_ON_ATTRIBUTE
77 },
78 {
79 1,
80 1,
81 CSSM_DB_INDEX_NONUNIQUE,
82 CSSM_DB_INDEX_ON_ATTRIBUTE
83 },
84 {
85 2,
86 2,
87 CSSM_DB_INDEX_NONUNIQUE,
88 CSSM_DB_INDEX_ON_ATTRIBUTE
89 }
90 };
91 CSSM_DATA values[] =
92 {
93 { 5, (uint8 *)"value" }
94 };
95 CSSM_DB_ATTRIBUTE_DATA attributeData[] =
96 {
97 {
98 {
99 CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
100 { "One" },
101 CSSM_DB_ATTRIBUTE_FORMAT_STRING
102 },
103 sizeof(values) / sizeof(CSSM_DATA),
104 values
105 },
106 {
107 {
108 CSSM_DB_ATTRIBUTE_NAME_AS_STRING,
109 { "Two" },
110 CSSM_DB_ATTRIBUTE_FORMAT_STRING
111 },
112 sizeof(values) / sizeof(CSSM_DATA),
113 values
114 }
115 };
116 CSSM_DB_RECORD_ATTRIBUTE_DATA attributes =
117 {
118 42,
119 0,
120 sizeof(attributeData) / sizeof(CSSM_DB_ATTRIBUTE_DATA),
121 attributeData
122 };
123
124 int
125 static test1(CSSM_DL_HANDLE dl)
126 {
127 int pass = 1;
128 CSSM_DL_DB_HANDLE dldb = { dl };
129 CSSM_DB_UNIQUE_RECORD_PTR uniqueId;
130
131 pass &= ok_status(CSSM_DL_DbCreate(dl, DBNAME, NULL /* DbLocation */,
132 &dbInfo,
133 CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
134 NULL /* CredAndAclEntry */,
135 &openParameters,
136 &dldb.DBHandle),
137 "CSSM_DL_DbCreate");
138
139 pass &= is_status(CSSM_DL_DataInsert(dldb,
140 attributes.DataRecordType,
141 &attributes,
142 NULL,
143 &uniqueId),
144 CSSMERR_DL_INVALID_RECORDTYPE, "CSSM_DL_DataInsert no table");
145
146 pass &= ok_status(CSSM_DL_CreateRelation(dldb,
147 42,
148 "Fourty Two",
149 sizeof(attributeInfo) / sizeof(CSSM_DB_SCHEMA_ATTRIBUTE_INFO),
150 attributeInfo,
151 sizeof(indexInfo) / sizeof(CSSM_DB_SCHEMA_INDEX_INFO),
152 indexInfo), "CSSM_DL_CreateRelation");
153
154 pass &= ok_status(CSSM_DL_DataInsert(dldb,
155 attributes.DataRecordType,
156 &attributes,
157 NULL,
158 &uniqueId), "CSSM_DL_DataInsert");
159
160 pass &= is_status(CSSM_DL_DataInsert(dldb,
161 attributes.DataRecordType,
162 &attributes,
163 NULL,
164 &uniqueId),
165 CSSMERR_DL_INVALID_UNIQUE_INDEX_DATA, "CSSM_DL_DataInsert dupe");
166
167 pass &= ok_status(CSSM_DL_FreeUniqueRecord(dldb, uniqueId),
168 "CSSM_DL_FreeUniqueRecord");
169
170 pass &= ok_status(CSSM_DL_DbClose(dldb),
171 "CSSM_DL_DbClose");
172
173 return pass;
174 }
175
176 int
177 static test2(CSSM_DL_HANDLE dl)
178 {
179 int pass = 1;
180 CSSM_DL_DB_HANDLE dldb = { dl };
181 CSSM_DB_UNIQUE_RECORD_PTR uniqueId;
182
183 pass &= ok_status(CSSM_DL_DbCreate(dl, DBNAME, NULL /* DbLocation */,
184 &dbInfo,
185 CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
186 NULL /* CredAndAclEntry */,
187 NULL,
188 &dldb.DBHandle),
189 "CSSM_DL_DbCreate");
190
191 pass &= ok_status(CSSM_DL_DbClose(dldb),
192 "CSSM_DL_DbClose");
193
194 pass &= ok_status(CSSM_DL_DbOpen(dl, DBNAME, NULL /* DbLocation */,
195 CSSM_DB_ACCESS_READ | CSSM_DB_ACCESS_WRITE,
196 NULL /* CredAndAclEntry */,
197 &openParameters,
198 &dldb.DBHandle),
199 "CSSM_DL_DbOpen");
200
201 pass &= is_status(CSSM_DL_DataInsert(dldb,
202 attributes.DataRecordType,
203 &attributes,
204 NULL,
205 &uniqueId),
206 CSSMERR_DL_INVALID_RECORDTYPE, "CSSM_DL_DataInsert no table");
207
208 pass &= ok_status(CSSM_DL_CreateRelation(dldb,
209 42,
210 "Fourty Two",
211 sizeof(attributeInfo) / sizeof(CSSM_DB_SCHEMA_ATTRIBUTE_INFO),
212 attributeInfo,
213 sizeof(indexInfo) / sizeof(CSSM_DB_SCHEMA_INDEX_INFO),
214 indexInfo), "CSSM_DL_CreateRelation");
215
216 pass &= ok_status(CSSM_DL_DataInsert(dldb,
217 attributes.DataRecordType,
218 &attributes,
219 NULL,
220 &uniqueId), "CSSM_DL_DataInsert fails unless 4039735 is fixed");
221
222 pass &= is_status(CSSM_DL_DataInsert(dldb,
223 attributes.DataRecordType,
224 &attributes,
225 NULL,
226 &uniqueId),
227 CSSMERR_DL_INVALID_UNIQUE_INDEX_DATA,
228 "CSSM_DL_DataInsert dupe");
229
230 pass &= ok_status(CSSM_DL_FreeUniqueRecord(dldb, uniqueId),
231 "CSSM_DL_FreeUniqueRecord");
232
233 pass &= ok_status(CSSM_DL_DbClose(dldb),
234 "CSSM_DL_DbDelete");
235
236 return pass;
237 }
238
239 int
240 main(int argc, char * const *argv)
241 {
242 int guid_alt = argc > 1 && !strcmp(argv[1], "-g");
243 /* {2cb56191-ee6f-432d-a377-853d3c6b949e} */
244 CSSM_GUID s3dl_guid =
245 {
246 0x2cb56191, 0xee6f, 0x432d,
247 { 0xa3, 0x77, 0x85, 0x3d, 0x3c, 0x6b, 0x94, 0x9e }
248 };
249 const CSSM_GUID *guid = guid_alt ? & s3dl_guid : &gGuidAppleFileDL;
250
251 int pass = 1;
252
253 plan_tests(23);
254
255 CSSM_DL_HANDLE dl;
256 pass &= ok(cssm_attach(guid, &dl), "cssm_attach");
257 pass &= ok(tests_begin(argc, argv), "tests_begin");
258
259 pass &= ok(test1(dl), "insert record in new table with ac off");
260 pass &= ok_status(CSSM_DL_DbDelete(dl, DBNAME, NULL /* DbLocation */,
261 NULL /* AccessCred */), "CSSM_DL_DbDelete");
262 pass &= ok(test2(dl),
263 "insert record in existing db in new table with ac off");
264 pass &= ok_status(CSSM_DL_DbDelete(dl, DBNAME, NULL /* DbLocation */,
265 NULL /* AccessCred */), "CSSM_DL_DbDelete");
266 pass &= ok(cssm_detach(guid, dl), "cssm_detach");
267
268 return !tests_end(pass);
269 }