dta-tests.c

Go to the documentation of this file.
00001 /**
00002  *  @file
00003  *
00004  *  Test the new domain transition analysis code introduced in SETools
00005  *  3.3.
00006  *
00007  *  @author Jeremy A. Mowery jmowery@tresys.com
00008  *  @author Jason Tang jtang@tresys.com
00009  *
00010  *  Copyright (C) 2007 Tresys Technology, LLC
00011  *
00012  *  This library is free software; you can redistribute it and/or
00013  *  modify it under the terms of the GNU Lesser General Public
00014  *  License as published by the Free Software Foundation; either
00015  *  version 2.1 of the License, or (at your option) any later version.
00016  *
00017  *  This library is distributed in the hope that it will be useful,
00018  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020  *  Lesser General Public License for more details.
00021  *
00022  *  You should have received a copy of the GNU Lesser General Public
00023  *  License along with this library; if not, write to the Free Software
00024  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00025  */
00026 
00027 #include <config.h>
00028 
00029 #include <CUnit/CUnit.h>
00030 #include <apol/avrule-query.h>
00031 #include <apol/domain-trans-analysis.h>
00032 #include <apol/policy.h>
00033 #include <apol/policy-path.h>
00034 #include <stdbool.h>
00035 #include <string.h>
00036 
00037 #define POLICY TEST_POLICIES "/setools-3.3/apol/dta_test.policy.conf"
00038 
00039 static apol_policy_t *p = NULL;
00040 
00041 static void dta_forward(void)
00042 {
00043         apol_policy_reset_domain_trans_table(p);
00044         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00045         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00046         int retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_FORWARD);
00047         CU_ASSERT_EQUAL_FATAL(retval, 0);
00048         retval = apol_domain_trans_analysis_set_start_type(p, d, "tuna_t");
00049         CU_ASSERT_EQUAL_FATAL(retval, 0);
00050 
00051         apol_vector_t *v = NULL;
00052         retval = apol_domain_trans_analysis_do(p, d, &v);
00053         apol_domain_trans_analysis_destroy(&d);
00054         CU_ASSERT_EQUAL_FATAL(retval, 0);
00055         CU_ASSERT_PTR_NOT_NULL(v);
00056 
00057         qpol_policy_t *q = apol_policy_get_qpol(p);
00058         size_t i;
00059         for (i = 0; i < apol_vector_get_size(v); i++) {
00060                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00061 
00062                 const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00063                 CU_ASSERT_PTR_NOT_NULL(qt);
00064                 const char *name, *ep_name;
00065                 retval = qpol_type_get_name(q, qt, &name);
00066                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00067                 CU_ASSERT_STRING_EQUAL(name, "tuna_t");
00068 
00069                 qt = apol_domain_trans_result_get_end_type(dtr);
00070                 CU_ASSERT_PTR_NOT_NULL(qt);
00071                 retval = qpol_type_get_name(q, qt, &name);
00072                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00073                 CU_ASSERT(strcmp(name, "boat_t") == 0 || strcmp(name, "sand_t") == 0);
00074 
00075                 qt = apol_domain_trans_result_get_entrypoint_type(dtr);
00076                 CU_ASSERT_PTR_NOT_NULL(qt);
00077                 retval = qpol_type_get_name(q, qt, &ep_name);
00078                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00079 
00080                 if (strcmp(name, "boat_t") == 0) {
00081                         CU_ASSERT_STRING_EQUAL(ep_name, "net_t");
00082                 } else if (strcmp(name, "sand_t") == 0) {
00083                         CU_ASSERT(strcmp(ep_name, "reel_t") == 0 || strcmp(ep_name, "wave_t") == 0);
00084                 }
00085         }
00086 
00087         apol_vector_destroy(&v);
00088 }
00089 
00090 static void dta_forward_multi_end(void)
00091 {
00092         apol_policy_reset_domain_trans_table(p);
00093         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00094         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00095         int retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_FORWARD);
00096         CU_ASSERT_EQUAL_FATAL(retval, 0);
00097         retval = apol_domain_trans_analysis_set_start_type(p, d, "shark_t");
00098         CU_ASSERT_EQUAL_FATAL(retval, 0);
00099 
00100         apol_vector_t *v = NULL;
00101         retval = apol_domain_trans_analysis_do(p, d, &v);
00102         apol_domain_trans_analysis_destroy(&d);
00103         CU_ASSERT_EQUAL_FATAL(retval, 0);
00104         CU_ASSERT_PTR_NOT_NULL(v);
00105         CU_ASSERT(apol_vector_get_size(v) == 2);
00106 
00107         qpol_policy_t *q = apol_policy_get_qpol(p);
00108         size_t i;
00109         for (i = 0; i < apol_vector_get_size(v); i++) {
00110                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00111 
00112                 const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00113                 CU_ASSERT_PTR_NOT_NULL(qt);
00114                 const char *name, *ep_name;
00115                 retval = qpol_type_get_name(q, qt, &name);
00116                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00117                 CU_ASSERT_STRING_EQUAL(name, "shark_t");
00118 
00119                 qt = apol_domain_trans_result_get_end_type(dtr);
00120                 CU_ASSERT_PTR_NOT_NULL(qt);
00121                 retval = qpol_type_get_name(q, qt, &name);
00122                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00123                 CU_ASSERT(strcmp(name, "surf_t") == 0 || strcmp(name, "sand_t") == 0);
00124 
00125                 qt = apol_domain_trans_result_get_entrypoint_type(dtr);
00126                 CU_ASSERT_PTR_NOT_NULL(qt);
00127                 retval = qpol_type_get_name(q, qt, &ep_name);
00128                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00129 
00130                 CU_ASSERT_STRING_EQUAL(ep_name, "wave_t");
00131         }
00132 
00133         apol_vector_destroy(&v);
00134 }
00135 
00136 static void dta_forward_access(void)
00137 {
00138         apol_policy_reset_domain_trans_table(p);
00139         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00140         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00141         int retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_FORWARD);
00142         CU_ASSERT_EQUAL_FATAL(retval, 0);
00143         retval = apol_domain_trans_analysis_set_start_type(p, d, "tuna_t");
00144         CU_ASSERT_EQUAL_FATAL(retval, 0);
00145         retval = apol_domain_trans_analysis_append_access_type(p, d, "boat_t");
00146         CU_ASSERT_EQUAL_FATAL(retval, 0);
00147         retval = apol_domain_trans_analysis_append_access_type(p, d, "sand_t");
00148         CU_ASSERT_EQUAL_FATAL(retval, 0);
00149         retval = apol_domain_trans_analysis_append_access_type(p, d, "wave_t");
00150         CU_ASSERT_EQUAL_FATAL(retval, 0);
00151         retval = apol_domain_trans_analysis_append_class(p, d, "file");
00152         CU_ASSERT_EQUAL_FATAL(retval, 0);
00153         retval = apol_domain_trans_analysis_append_perm(p, d, "write");
00154         CU_ASSERT_EQUAL_FATAL(retval, 0);
00155 
00156         apol_vector_t *v = NULL;
00157         retval = apol_domain_trans_analysis_do(p, d, &v);
00158         CU_ASSERT_EQUAL_FATAL(retval, 0);
00159         CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00160 
00161         qpol_policy_t *q = apol_policy_get_qpol(p);
00162         size_t i;
00163         for (i = 0; i < apol_vector_get_size(v); i++) {
00164                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00165 
00166                 const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00167                 CU_ASSERT_PTR_NOT_NULL(qt);
00168                 const char *name;
00169                 retval = qpol_type_get_name(q, qt, &name);
00170                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00171                 CU_ASSERT_STRING_EQUAL(name, "tuna_t");
00172 
00173                 qt = apol_domain_trans_result_get_end_type(dtr);
00174                 CU_ASSERT_PTR_NOT_NULL(qt);
00175                 retval = qpol_type_get_name(q, qt, &name);
00176                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00177                 CU_ASSERT_STRING_EQUAL(name, "boat_t");
00178 
00179                 const apol_vector_t *rules_v = apol_domain_trans_result_get_access_rules(dtr);
00180                 CU_ASSERT_FATAL(rules_v != NULL && apol_vector_get_size(rules_v) > 0);
00181                 size_t j;
00182                 for (j = 0; j < apol_vector_get_size(rules_v); j++) {
00183                         const qpol_avrule_t *qa = (const qpol_avrule_t *)apol_vector_get_element(rules_v, j);
00184                         char *render = apol_avrule_render(p, qa);
00185                         CU_ASSERT_PTR_NOT_NULL_FATAL(render);
00186                         CU_ASSERT_STRING_EQUAL(render, "allow boat_t wave_t : file { write getattr execute };");
00187                         free(render);
00188                 }
00189         }
00190 
00191         apol_vector_destroy(&v);
00192 
00193         retval = apol_domain_trans_analysis_set_start_type(p, d, "boat_t");
00194         CU_ASSERT_EQUAL_FATAL(retval, 0);
00195         retval = apol_domain_trans_analysis_append_access_type(p, d, NULL);
00196         CU_ASSERT_EQUAL_FATAL(retval, 0);
00197         retval = apol_domain_trans_analysis_append_class(p, d, NULL);
00198         CU_ASSERT_EQUAL_FATAL(retval, 0);
00199         retval = apol_domain_trans_analysis_append_perm(p, d, NULL);
00200         CU_ASSERT_EQUAL_FATAL(retval, 0);
00201 
00202         apol_policy_reset_domain_trans_table(p);
00203         retval = apol_domain_trans_analysis_do(p, d, &v);
00204         apol_domain_trans_analysis_destroy(&d);
00205         CU_ASSERT_EQUAL_FATAL(retval, 0);
00206         CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00207 
00208         for (i = 0; i < apol_vector_get_size(v); i++) {
00209                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00210 
00211                 const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00212                 CU_ASSERT_PTR_NOT_NULL(qt);
00213                 const char *name;
00214                 retval = qpol_type_get_name(q, qt, &name);
00215                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00216                 CU_ASSERT_STRING_EQUAL(name, "boat_t");
00217 
00218                 qt = apol_domain_trans_result_get_end_type(dtr);
00219                 CU_ASSERT_PTR_NOT_NULL(qt);
00220                 retval = qpol_type_get_name(q, qt, &name);
00221                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00222                 CU_ASSERT(strcmp(name, "sand_t") == 0 || strcmp(name, "dock_t") == 0);
00223         }
00224         apol_vector_destroy(&v);
00225 }
00226 
00227 static void dta_reverse(void)
00228 {
00229         apol_policy_reset_domain_trans_table(p);
00230         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00231         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00232         int retval;
00233         retval = apol_domain_trans_analysis_set_start_type(p, d, "sand_t");
00234         CU_ASSERT_EQUAL_FATAL(retval, 0);
00235         retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_REVERSE);
00236         CU_ASSERT_EQUAL_FATAL(retval, 0);
00237 
00238         apol_vector_t *v = NULL;
00239         retval = apol_domain_trans_analysis_do(p, d, &v);
00240         apol_domain_trans_analysis_destroy(&d);
00241         CU_ASSERT_EQUAL_FATAL(retval, 0);
00242         CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00243 
00244         qpol_policy_t *q = apol_policy_get_qpol(p);
00245         size_t i;
00246         for (i = 0; i < apol_vector_get_size(v); i++) {
00247                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00248 
00249                 const qpol_type_t *qt = apol_domain_trans_result_get_end_type(dtr);
00250                 CU_ASSERT_PTR_NOT_NULL(qt);
00251                 const char *name;
00252                 retval = qpol_type_get_name(q, qt, &name);
00253                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00254                 CU_ASSERT_STRING_EQUAL(name, "sand_t");
00255 
00256                 qt = apol_domain_trans_result_get_start_type(dtr);
00257                 CU_ASSERT_PTR_NOT_NULL(qt);
00258                 retval = qpol_type_get_name(q, qt, &name);
00259                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00260                 CU_ASSERT(strcmp(name, "boat_t") == 0 || strcmp(name, "grouper_t") == 0 || strcmp(name, "shark_t") == 0 ||
00261                           strcmp(name, "tuna_t") == 0);
00262         }
00263 
00264         apol_vector_destroy(&v);
00265 }
00266 
00267 static void dta_reverse_regexp(void)
00268 {
00269         apol_policy_reset_domain_trans_table(p);
00270         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00271         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00272         int retval;
00273         retval = apol_domain_trans_analysis_set_start_type(p, d, "sand_t");
00274         CU_ASSERT_EQUAL_FATAL(retval, 0);
00275         retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_REVERSE);
00276         CU_ASSERT_EQUAL_FATAL(retval, 0);
00277         retval = apol_domain_trans_analysis_set_result_regex(p, d, "u");
00278         CU_ASSERT_EQUAL_FATAL(retval, 0);
00279 
00280         apol_vector_t *v = NULL;
00281         retval = apol_domain_trans_analysis_do(p, d, &v);
00282         apol_domain_trans_analysis_destroy(&d);
00283         CU_ASSERT_EQUAL_FATAL(retval, 0);
00284         CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00285 
00286         qpol_policy_t *q = apol_policy_get_qpol(p);
00287         size_t i;
00288         bool found_tuna_wave = false, found_grouper_reel = false, found_grouper_wave = false;
00289         for (i = 0; i < apol_vector_get_size(v); i++) {
00290                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00291 
00292                 const qpol_type_t *qt = apol_domain_trans_result_get_end_type(dtr);
00293                 CU_ASSERT_PTR_NOT_NULL(qt);
00294                 const char *name, *ep_name;
00295                 retval = qpol_type_get_name(q, qt, &name);
00296                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00297                 CU_ASSERT_STRING_EQUAL(name, "sand_t");
00298 
00299                 qt = apol_domain_trans_result_get_start_type(dtr);
00300                 CU_ASSERT_PTR_NOT_NULL(qt);
00301                 retval = qpol_type_get_name(q, qt, &name);
00302                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00303                 CU_ASSERT(strcmp(name, "tuna_t") == 0 || strcmp(name, "grouper_t") == 0);
00304 
00305                 qt = apol_domain_trans_result_get_entrypoint_type(dtr);
00306                 CU_ASSERT_PTR_NOT_NULL(qt);
00307                 retval = qpol_type_get_name(q, qt, &ep_name);
00308                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00309 
00310                 if (strcmp(name, "tuna_t") == 0) {
00311                         if (strcmp(ep_name, "wave_t") == 0) {
00312                                 found_tuna_wave = true;
00313                         }
00314                 } else if (strcmp(name, "grouper_t") == 0) {
00315                         if (strcmp(ep_name, "reel_t") == 0) {
00316                                 found_grouper_reel = true;
00317                         } else if (strcmp(ep_name, "wave_t") == 0) {
00318                                 found_grouper_wave = true;
00319                         }
00320                 }
00321         }
00322         CU_ASSERT(found_tuna_wave && found_grouper_reel && found_grouper_wave);
00323 
00324         apol_vector_destroy(&v);
00325 }
00326 
00327 static void dta_reflexive(void)
00328 {
00329         apol_policy_reset_domain_trans_table(p);
00330         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00331         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00332         int retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_FORWARD);
00333         CU_ASSERT_EQUAL_FATAL(retval, 0);
00334         retval = apol_domain_trans_analysis_set_start_type(p, d, "sand_t");
00335         CU_ASSERT_EQUAL_FATAL(retval, 0);
00336 
00337         apol_vector_t *v = NULL;
00338         retval = apol_domain_trans_analysis_do(p, d, &v);
00339         CU_ASSERT_EQUAL_FATAL(retval, 0);
00340         CU_ASSERT(v != NULL && apol_vector_get_size(v) == 0);
00341         apol_vector_destroy(&v);
00342 
00343         retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_REVERSE);
00344         CU_ASSERT_EQUAL_FATAL(retval, 0);
00345 
00346         retval = apol_domain_trans_analysis_do(p, d, &v);
00347         CU_ASSERT_EQUAL_FATAL(retval, 0);
00348         CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00349         size_t i;
00350         qpol_policy_t *q = apol_policy_get_qpol(p);
00351         for (i = 0; i < apol_vector_get_size(v); i++) {
00352                 const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00353 
00354                 const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00355                 CU_ASSERT_PTR_NOT_NULL(qt);
00356                 const char *name;
00357                 retval = qpol_type_get_name(q, qt, &name);
00358                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00359                 CU_ASSERT_STRING_NOT_EQUAL(name, "sand_t");
00360         }
00361         apol_vector_destroy(&v);
00362 
00363         apol_domain_trans_analysis_destroy(&d);
00364 }
00365 
00366 struct dta_invalid_item
00367 {
00368         const char *start_type;
00369         const char *end_type;
00370         const char *entrypoint_type;
00371         const bool missing_proc_trans;
00372         const bool missing_entrypoint;
00373         const bool missing_exec;
00374         const bool missing_setexec;
00375         const bool missing_type_trans;
00376         bool used;
00377 };
00378 
00379 static void dta_invalid(void)
00380 {
00381         struct dta_invalid_item items[] = {
00382                 {"boat_t", "dock_t", "net_t", false, false, true, false, false, false},
00383                 {"boat_t", "sand_t", "reel_t", false, false, true, false, false, false},
00384                 {"crab_t", "dock_t", "net_t", false, false, false, true, false, false},
00385                 {"crab_t", "dock_t", "rope_t", false, false, true, true, false, false},
00386                 {"crab_t", "dock_t", "wave_t", false, true, true, false, false, false},
00387                 {"gull_t", "dock_t", "net_t", false, false, false, true, true, false},
00388                 {"gull_t", "dock_t", "rope_t", false, false, true, true, true, false},
00389                 {"gull_t", "sand_t", "net_t", true, true, false, false, false, false},
00390                 {"marlin_t", "boat_t", "line_t", false, false, true, false, false, false},
00391                 {"marlin_t", "boat_t", "net_t", false, false, true, false, false, false},
00392                 {"ray_t", "boat_t", "line_t", true, false, true, false, false, false},
00393                 {"ray_t", "sand_t", "wave_t", true, false, false, false, false, false},
00394                 {"shark_t", "sand_t", "reel_t", false, false, true, false, false, false},
00395                 {"tuna_t", "boat_t", "line_t", false, false, true, false, false, false},
00396                 {"tuna_t", "boat_t", "reel_t", false, true, false, false, false, false},
00397                 {NULL, NULL, NULL, false, false, false, false, false, false}
00398         };
00399         const char *start_types[] = {
00400                 "boat_t", "crab_t", "gull_t", "marlin_t", "ray_t", "shark_t", "tuna_t", NULL
00401         };
00402         apol_domain_trans_analysis_t *d = apol_domain_trans_analysis_create();
00403         CU_ASSERT_PTR_NOT_NULL_FATAL(d);
00404         int retval = apol_domain_trans_analysis_set_direction(p, d, APOL_DOMAIN_TRANS_DIRECTION_FORWARD);
00405         CU_ASSERT_EQUAL_FATAL(retval, 0);
00406         retval = apol_domain_trans_analysis_set_valid(p, d, APOL_DOMAIN_TRANS_SEARCH_INVALID);
00407         CU_ASSERT_EQUAL_FATAL(retval, 0);
00408 
00409         qpol_policy_t *q = apol_policy_get_qpol(p);
00410         apol_vector_t *v = NULL;
00411         struct dta_invalid_item *item;
00412         for (const char **start = start_types; *start != NULL; start++) {
00413                 apol_policy_reset_domain_trans_table(p);
00414                 retval = apol_domain_trans_analysis_set_start_type(p, d, *start);
00415                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00416 
00417                 retval = apol_domain_trans_analysis_do(p, d, &v);
00418                 CU_ASSERT_EQUAL_FATAL(retval, 0);
00419                 CU_ASSERT(v != NULL && apol_vector_get_size(v) > 0);
00420 
00421                 for (size_t i = 0; i < apol_vector_get_size(v); i++) {
00422                         const apol_domain_trans_result_t *dtr = (const apol_domain_trans_result_t *)apol_vector_get_element(v, i);
00423 
00424                         const char *result_start, *result_end, *result_entry;
00425 
00426                         const qpol_type_t *qt = apol_domain_trans_result_get_start_type(dtr);
00427                         CU_ASSERT_PTR_NOT_NULL(qt);
00428                         retval = qpol_type_get_name(q, qt, &result_start);
00429                         CU_ASSERT_EQUAL_FATAL(retval, 0);
00430                         CU_ASSERT_STRING_EQUAL(result_start, *start);
00431 
00432                         qt = apol_domain_trans_result_get_end_type(dtr);
00433                         CU_ASSERT_PTR_NOT_NULL(qt);
00434                         retval = qpol_type_get_name(q, qt, &result_end);
00435                         CU_ASSERT_EQUAL_FATAL(retval, 0);
00436 
00437                         qt = apol_domain_trans_result_get_entrypoint_type(dtr);
00438                         CU_ASSERT_PTR_NOT_NULL(qt);
00439                         retval = qpol_type_get_name(q, qt, &result_entry);
00440                         CU_ASSERT_EQUAL_FATAL(retval, 0);
00441 
00442                         CU_ASSERT(apol_domain_trans_result_is_trans_valid(dtr) == 0);
00443 
00444                         for (item = items + 0; item->start_type != NULL; item++) {
00445                                 if (strcmp(result_start, item->start_type) == 0 &&
00446                                     strcmp(result_end, item->end_type) == 0 &&
00447                                     strcmp(result_entry, item->entrypoint_type) == 0 && !item->used) {
00448                                         item->used = true;
00449 
00450                                         const apol_vector_t *cv;
00451                                         if (item->missing_proc_trans) {
00452                                                 cv = apol_domain_trans_result_get_proc_trans_rules(dtr);
00453                                                 CU_ASSERT(cv != NULL && apol_vector_get_size(cv) == 0);
00454                                         }
00455                                         if (item->missing_entrypoint) {
00456                                                 cv = apol_domain_trans_result_get_entrypoint_rules(dtr);
00457                                                 CU_ASSERT(cv != NULL && apol_vector_get_size(cv) == 0);
00458                                         }
00459                                         if (item->missing_exec) {
00460                                                 cv = apol_domain_trans_result_get_exec_rules(dtr);
00461                                                 CU_ASSERT(cv != NULL && apol_vector_get_size(cv) == 0);
00462                                         }
00463                                         if (item->missing_setexec) {
00464                                                 cv = apol_domain_trans_result_get_setexec_rules(dtr);
00465                                                 CU_ASSERT(cv != NULL && apol_vector_get_size(cv) == 0);
00466                                         }
00467                                         if (item->missing_type_trans) {
00468                                                 cv = apol_domain_trans_result_get_type_trans_rules(dtr);
00469                                                 CU_ASSERT(cv != NULL && apol_vector_get_size(cv) == 0);
00470                                         }
00471                                         break;
00472                                 }
00473                         }
00474                         if (item->start_type == NULL) {
00475                                 CU_FAIL();
00476                         }
00477                 }
00478                 apol_vector_destroy(&v);
00479         }
00480 
00481         for (item = items + 0; item->start_type != NULL; item++) {
00482                 CU_ASSERT(item->used);
00483         }
00484         apol_domain_trans_analysis_destroy(&d);
00485 }
00486 
00487 CU_TestInfo dta_tests[] = {
00488         {"dta forward", dta_forward}
00489         ,
00490         {"dta forward + access", dta_forward_access}
00491         ,
00492         {"dta forward with multiple endpoints for same entrypoint", dta_forward_multi_end}
00493         ,
00494         {"dta reverse", dta_reverse}
00495         ,
00496         {"dta reverse + regexp", dta_reverse_regexp}
00497         ,
00498         {"dta reflexive", dta_reflexive}
00499         ,
00500         {"dta invalid transitions", dta_invalid}
00501         ,
00502         CU_TEST_INFO_NULL
00503 };
00504 
00505 int dta_init()
00506 {
00507         apol_policy_path_t *ppath = apol_policy_path_create(APOL_POLICY_PATH_TYPE_MONOLITHIC, POLICY, NULL);
00508         if (ppath == NULL) {
00509                 return 1;
00510         }
00511 
00512         if ((p = apol_policy_create_from_policy_path(ppath, QPOL_POLICY_OPTION_NO_NEVERALLOWS, NULL, NULL)) == NULL) {
00513                 apol_policy_path_destroy(&ppath);
00514                 return 1;
00515         }
00516         apol_policy_path_destroy(&ppath);
00517 
00518         int retval = apol_policy_build_domain_trans_table(p);
00519         if (retval != 0) {
00520                 return 1;
00521         }
00522         return 0;
00523 }
00524 
00525 int dta_cleanup()
00526 {
00527         apol_policy_destroy(&p);
00528         return 0;
00529 }