1#include "test_ccapi_globals.h"
2#include "test_ccapi_iterators.h"
3#include "test_ccapi_check.h"
4#include "test_ccapi_util.h"
5
6// ---------------------------------------------------------------------------
7
8int check_cc_ccache_iterator_next(void) {
9	cc_int32 err = 0;
10	cc_context_t context = NULL;
11	cc_ccache_t ccache = NULL;
12	cc_ccache_iterator_t iterator = NULL;
13	unsigned int i;
14
15    BEGIN_TEST("cc_ccache_iterator_next");
16
17	err = cc_initialize(&context, ccapi_version_3, NULL, NULL);
18
19	if (!err) {
20		err = destroy_all_ccaches(context);
21	}
22
23	// iterate with no ccaches
24	if (!err) {
25		err = cc_context_new_ccache_iterator(context, &iterator);
26	}
27	check_once_cc_ccache_iterator_next(iterator, 0, ccNoError, "iterating over an empty collection");
28	if (iterator) {
29		cc_ccache_iterator_release(iterator);
30		iterator = NULL;
31	}
32
33	// iterate with one ccache
34	if (!err) {
35		destroy_all_ccaches(context);
36		err = cc_context_create_new_ccache(context, cc_credentials_v5, "foo@BAR.ORG", &ccache);
37	}
38	if (ccache) {
39		cc_ccache_release(ccache);
40		ccache = NULL;
41	}
42	if (!err) {
43		err = cc_context_new_ccache_iterator(context, &iterator);
44	}
45	check_once_cc_ccache_iterator_next(iterator, 1, ccNoError, "iterating over a collection of 1 ccache");
46	if (iterator) {
47		cc_ccache_iterator_release(iterator);
48		iterator = NULL;
49	}
50
51	// iterate with several ccaches
52	if (!err) {
53		destroy_all_ccaches(context);
54	}
55	for(i = 0; !err && (i < 1000); i++)
56	{
57        if (i%100 == 0) fprintf(stdout, ".");
58        err = cc_context_create_new_ccache(context, cc_credentials_v5, "foo@BAR.ORG", &ccache);
59		if (ccache) {
60			cc_ccache_release(ccache);
61			ccache = NULL;
62		}
63	}
64	if (!err) {
65		err = cc_context_new_ccache_iterator(context, &iterator);
66	}
67	check_once_cc_ccache_iterator_next(iterator, 1000, ccNoError, "iterating over a collection of 1000 ccache");
68	if (iterator) {
69		cc_ccache_iterator_release(iterator);
70		iterator = NULL;
71	}
72
73
74	if (ccache) { cc_ccache_release(ccache); }
75	if (iterator) { cc_ccache_iterator_release(iterator); }
76	if (context) {
77		destroy_all_ccaches(context);
78		cc_context_release(context);
79	}
80
81	END_TEST_AND_RETURN
82}
83
84cc_int32 check_once_cc_ccache_iterator_next(cc_ccache_iterator_t iterator, cc_uint32 expected_count, cc_int32 expected_err, const char *description) {
85	cc_int32 err = ccNoError;
86
87//	BEGIN_CHECK_ONCE(description);
88
89	cc_int32 possible_return_values[6] = {
90		ccNoError,
91		ccIteratorEnd,
92		ccErrBadParam,
93		ccErrNoMem,
94		ccErrInvalidCCacheIterator,
95		ccErrCCacheNotFound,
96	};
97	#define possible_ret_val_count sizeof(possible_return_values)/sizeof(possible_return_values[0])
98
99	cc_ccache_t ccache = NULL;
100	cc_uint32 actual_count = 0;
101
102	while (!err) {
103		err = cc_ccache_iterator_next(iterator, &ccache);
104		if (ccache) {
105			actual_count++;
106			cc_ccache_release(ccache);
107			ccache = NULL;
108		}
109	}
110	if (err == ccIteratorEnd) {
111		err = ccNoError;
112	}
113
114	// check returned error
115	check_err(err, expected_err, possible_return_values);
116
117	check_if(actual_count != expected_count, "iterator didn't iterate over all ccaches");
118
119//	END_CHECK_ONCE;
120
121	return err;
122}
123
124
125// ---------------------------------------------------------------------------
126
127int check_cc_credentials_iterator_next(void) {
128	cc_int32 err = 0;
129	cc_context_t context = NULL;
130	cc_ccache_t ccache = NULL;
131	cc_credentials_union creds_union;
132	cc_credentials_iterator_t iterator = NULL;
133	unsigned int i;
134
135	BEGIN_TEST("cc_credentials_iterator_next");
136
137	err = cc_initialize(&context, ccapi_version_3, NULL, NULL);
138
139	if (!err) {
140		err = destroy_all_ccaches(context);
141	}
142
143	// iterate with no creds
144	if (!err) {
145		err = cc_context_create_new_ccache(context, cc_credentials_v5, "foo@BAR.ORG", &ccache);
146	}
147	if (!err) {
148		err = cc_ccache_new_credentials_iterator(ccache, &iterator);
149	}
150	check_once_cc_credentials_iterator_next(iterator, 0, ccNoError, "iterating over an empty ccache");
151	if (iterator) {
152		cc_ccache_iterator_release(iterator);
153		iterator = NULL;
154	}
155	if (ccache) {
156		cc_ccache_release(ccache);
157		ccache = NULL;
158	}
159
160	// iterate with one cred
161	if (!err) {
162		destroy_all_ccaches(context);
163		err = cc_context_create_new_ccache(context, cc_credentials_v5, "foo@BAR.ORG", &ccache);
164	}
165	if (!err) {
166		new_v5_creds_union(&creds_union, "BAR.ORG");
167		err = cc_ccache_store_credentials(ccache, &creds_union);
168		release_v5_creds_union(&creds_union);
169	}
170	if (!err) {
171		err = cc_ccache_new_credentials_iterator(ccache, &iterator);
172	}
173	check_once_cc_credentials_iterator_next(iterator, 1, ccNoError, "iterating over a ccache with 1 cred");
174	if (iterator) {
175		cc_credentials_iterator_release(iterator);
176		iterator = NULL;
177	}
178	if (ccache) {
179		cc_ccache_release(ccache);
180		ccache = NULL;
181	}
182
183	// iterate with several creds
184	if (!err) {
185		destroy_all_ccaches(context);
186		err = cc_context_create_new_ccache(context, cc_credentials_v5, "foo@BAR.ORG", &ccache);
187	}
188	for(i = 0; !err && (i < 1000); i++) {
189        if (i%100 == 0) fprintf(stdout, ".");
190		new_v5_creds_union(&creds_union, "BAR.ORG");
191		err = cc_ccache_store_credentials(ccache, &creds_union);
192		release_v5_creds_union(&creds_union);
193	}
194	if (!err) {
195		err = cc_ccache_new_credentials_iterator(ccache, &iterator);
196	}
197	check_once_cc_credentials_iterator_next(iterator, 1000, ccNoError, "iterating over a ccache with 1000 creds");
198
199	if (iterator) { cc_credentials_iterator_release(iterator); }
200	if (ccache) { cc_ccache_release(ccache); }
201	if (context) {
202		destroy_all_ccaches(context);
203		cc_context_release(context);
204	}
205
206	END_TEST_AND_RETURN
207}
208
209cc_int32 check_once_cc_credentials_iterator_next(cc_credentials_iterator_t iterator, cc_uint32 expected_count, cc_int32 expected_err, const char *description) {
210	cc_int32            err             = ccNoError;
211	cc_credentials_t    creds           = NULL;
212	cc_uint32           actual_count    = 0;
213
214	cc_int32 possible_return_values[5] = {
215		ccNoError,
216		ccIteratorEnd,
217		ccErrBadParam,
218		ccErrNoMem,
219		ccErrInvalidCredentialsIterator,
220	};
221
222    BEGIN_CHECK_ONCE(description);
223
224	#define possible_ret_val_count sizeof(possible_return_values)/sizeof(possible_return_values[0])
225
226	while (!err) {
227		err = cc_credentials_iterator_next(iterator, &creds);
228		if (creds) {
229			actual_count++;
230			cc_credentials_release(creds);
231			creds = NULL;
232		}
233	}
234	if (err == ccIteratorEnd) {
235		err = ccNoError;
236	}
237
238	// check returned error
239	check_err(err, expected_err, possible_return_values);
240
241	check_if(actual_count != expected_count, "iterator didn't iterate over all ccaches");
242
243	END_CHECK_ONCE;
244
245	return err;
246}
247