Home | History | Annotate | Download | only in unit
      1 /*
      2  * Copyright 2011 Tresys Technology, LLC. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are met:
      6  *
      7  *    1. Redistributions of source code must retain the above copyright notice,
      8  *       this list of conditions and the following disclaimer.
      9  *
     10  *    2. Redistributions in binary form must reproduce the above copyright notice,
     11  *       this list of conditions and the following disclaimer in the documentation
     12  *       and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY TRESYS TECHNOLOGY, LLC ``AS IS'' AND ANY EXPRESS
     15  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     16  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     17  * EVENT SHALL TRESYS TECHNOLOGY, LLC OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     18  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     21  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     22  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     23  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  *
     25  * The views and conclusions contained in the software and documentation are those
     26  * of the authors and should not be interpreted as representing official policies,
     27  * either expressed or implied, of Tresys Technology, LLC.
     28  */
     29 
     30 #include "CuTest.h"
     31 #include "CilTest.h"
     32 
     33 #include "../../src/cil_internal.h"
     34 #include "../../src/cil_build_ast.h"
     35 
     36 void test_cil_list_init(CuTest *tc) {
     37 	struct cil_avrule *test_avrule = malloc(sizeof(*test_avrule));
     38 
     39 	cil_classpermset_init(&test_avrule->classpermset);
     40 	cil_permset_init(&test_avrule->classpermset->permset);
     41 
     42 	cil_list_init(&test_avrule->classpermset->permset->perms_list_str);
     43 	CuAssertPtrNotNull(tc, test_avrule->classpermset->permset->perms_list_str);
     44 
     45 	cil_destroy_avrule(test_avrule);
     46 }
     47 
     48 void test_cil_list_append_item(CuTest *tc) {
     49         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
     50 
     51 	struct cil_tree *test_tree;
     52         gen_test_tree(&test_tree, line);
     53 
     54 	struct cil_tree_node *test_ast_node;
     55 	cil_tree_node_init(&test_ast_node);
     56 
     57 	struct cil_db *test_db;
     58 	cil_db_init(&test_db);
     59 
     60 	test_ast_node->parent = test_db->ast->root;
     61 	test_ast_node->line = 1;
     62 
     63 	struct cil_list *test_class_list;
     64 	cil_list_init(&test_class_list);
     65 
     66 	struct cil_list_item *test_new_item;
     67 	cil_list_item_init(&test_new_item);
     68 
     69 	test_new_item->flavor = CIL_CLASS;
     70 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
     71 
     72 	int rc = cil_list_append_item(test_class_list, test_new_item);
     73 	CuAssertIntEquals(tc, SEPOL_OK, rc);
     74 }
     75 
     76 void test_cil_list_append_item_append(CuTest *tc) {
     77         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
     78 
     79 	struct cil_tree *test_tree;
     80         gen_test_tree(&test_tree, line);
     81 
     82 	struct cil_tree_node *test_ast_node;
     83 	cil_tree_node_init(&test_ast_node);
     84 
     85 	struct cil_db *test_db;
     86 	cil_db_init(&test_db);
     87 
     88 	test_ast_node->parent = test_db->ast->root;
     89 	test_ast_node->line = 1;
     90 
     91 	struct cil_list *test_class_list;
     92 	cil_list_init(&test_class_list);
     93 
     94 	struct cil_list_item *test_new_item;
     95 	cil_list_item_init(&test_new_item);
     96 
     97 	test_new_item->flavor = CIL_CLASS;
     98 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
     99 
    100 	int rc = cil_list_append_item(test_class_list, test_new_item);
    101 
    102 	cil_list_item_init(&test_new_item);
    103 
    104 	test_new_item->flavor = CIL_CLASS;
    105 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
    106 
    107 	int rc2 = cil_list_append_item(test_class_list, test_new_item);
    108 	CuAssertIntEquals(tc, SEPOL_OK, rc);
    109 	CuAssertIntEquals(tc, SEPOL_OK, rc2);
    110 }
    111 
    112 void test_cil_list_append_item_append_extra(CuTest *tc) {
    113         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", "process", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    114 
    115 	struct cil_tree *test_tree;
    116         gen_test_tree(&test_tree, line);
    117 
    118 	struct cil_tree_node *test_ast_node;
    119 	cil_tree_node_init(&test_ast_node);
    120 
    121 	struct cil_db *test_db;
    122 	cil_db_init(&test_db);
    123 
    124 	test_ast_node->parent = test_db->ast->root;
    125 	test_ast_node->line = 1;
    126 
    127 	struct cil_list *test_class_list;
    128 	cil_list_init(&test_class_list);
    129 
    130 	struct cil_list_item *test_new_item;
    131 	cil_list_item_init(&test_new_item);
    132 
    133 	test_new_item->flavor = CIL_CLASS;
    134 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    135 
    136 	int rc = cil_list_append_item(test_class_list, test_new_item);
    137 
    138 	cil_list_item_init(&test_new_item);
    139 	test_new_item->flavor = CIL_CLASS;
    140 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
    141 
    142 	int rc2 = cil_list_append_item(test_class_list, test_new_item);
    143 
    144 	cil_list_item_init(&test_new_item);
    145 	test_new_item->flavor = CIL_CLASS;
    146 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next->next;
    147 
    148 	int rc3 = cil_list_append_item(test_class_list, test_new_item);
    149 	CuAssertIntEquals(tc, SEPOL_OK, rc);
    150 	CuAssertIntEquals(tc, SEPOL_OK, rc2);
    151 	CuAssertIntEquals(tc, SEPOL_OK, rc3);
    152 }
    153 
    154 void test_cil_list_append_item_listnull_neg(CuTest *tc) {
    155         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    156 
    157 	struct cil_tree *test_tree;
    158         gen_test_tree(&test_tree, line);
    159 
    160 	struct cil_tree_node *test_ast_node;
    161 	cil_tree_node_init(&test_ast_node);
    162 
    163 	struct cil_db *test_db;
    164 	cil_db_init(&test_db);
    165 
    166 	test_ast_node->parent = test_db->ast->root;
    167 	test_ast_node->line = 1;
    168 
    169 	struct cil_list *test_class_list = NULL;
    170 
    171 	struct cil_list_item *test_new_item;
    172 	cil_list_item_init(&test_new_item);
    173 
    174 	test_new_item->flavor = CIL_CLASS;
    175 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    176 
    177 	int rc = cil_list_append_item(test_class_list, test_new_item);
    178 	CuAssertIntEquals(tc, SEPOL_ERR, rc);
    179 }
    180 
    181 void test_cil_list_append_item_itemnull_neg(CuTest *tc) {
    182         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    183 
    184 	struct cil_tree *test_tree;
    185         gen_test_tree(&test_tree, line);
    186 
    187 	struct cil_tree_node *test_ast_node;
    188 	cil_tree_node_init(&test_ast_node);
    189 
    190 	struct cil_db *test_db;
    191 	cil_db_init(&test_db);
    192 
    193 	test_ast_node->parent = test_db->ast->root;
    194 	test_ast_node->line = 1;
    195 
    196 	struct cil_list *test_class_list;
    197 	cil_list_init(&test_class_list);
    198 
    199 	struct cil_list_item *test_new_item = NULL;
    200 
    201 	int rc = cil_list_append_item(test_class_list, test_new_item);
    202 	CuAssertIntEquals(tc, SEPOL_ERR, rc);
    203 }
    204 
    205 void test_cil_list_prepend_item(CuTest *tc) {
    206         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    207 
    208 	struct cil_tree *test_tree;
    209         gen_test_tree(&test_tree, line);
    210 
    211 	struct cil_tree_node *test_ast_node;
    212 	cil_tree_node_init(&test_ast_node);
    213 
    214 	struct cil_db *test_db;
    215 	cil_db_init(&test_db);
    216 
    217 	test_ast_node->parent = test_db->ast->root;
    218 	test_ast_node->line = 1;
    219 
    220 	struct cil_list *test_class_list;
    221 	cil_list_init(&test_class_list);
    222 
    223 	struct cil_list_item *test_new_item;
    224 	cil_list_item_init(&test_new_item);
    225 
    226 	test_new_item->flavor = CIL_CLASS;
    227 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    228 
    229 	int rc = cil_list_prepend_item(test_class_list, test_new_item);
    230 	CuAssertIntEquals(tc, SEPOL_OK, rc);
    231 }
    232 
    233 void test_cil_list_prepend_item_prepend(CuTest *tc) {
    234         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    235 
    236 	struct cil_tree *test_tree;
    237         gen_test_tree(&test_tree, line);
    238 
    239 	struct cil_tree_node *test_ast_node;
    240 	cil_tree_node_init(&test_ast_node);
    241 
    242 	struct cil_db *test_db;
    243 	cil_db_init(&test_db);
    244 
    245 	test_ast_node->parent = test_db->ast->root;
    246 	test_ast_node->line = 1;
    247 
    248 	struct cil_list *test_class_list;
    249 	cil_list_init(&test_class_list);
    250 
    251 	struct cil_list_item *test_new_item;
    252 	cil_list_item_init(&test_new_item);
    253 
    254 	test_new_item->flavor = CIL_CLASS;
    255 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    256 
    257 	int rc = cil_list_prepend_item(test_class_list, test_new_item);
    258 
    259 	CuAssertIntEquals(tc, SEPOL_OK, rc);
    260 }
    261 
    262 void test_cil_list_prepend_item_prepend_neg(CuTest *tc) {
    263         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", "process", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    264 
    265 	struct cil_tree *test_tree;
    266         gen_test_tree(&test_tree, line);
    267 
    268 	struct cil_tree_node *test_ast_node;
    269 	cil_tree_node_init(&test_ast_node);
    270 
    271 	struct cil_db *test_db;
    272 	cil_db_init(&test_db);
    273 
    274 	test_ast_node->parent = test_db->ast->root;
    275 	test_ast_node->line = 1;
    276 
    277 	struct cil_list *test_class_list;
    278 	cil_list_init(&test_class_list);
    279 
    280 	struct cil_list_item *test_new_item;
    281 	cil_list_item_init(&test_new_item);
    282 
    283 	test_new_item->flavor = CIL_CLASS;
    284 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    285 
    286 	struct cil_list_item *test_new_item_next;
    287 	cil_list_item_init(&test_new_item_next);
    288 	test_new_item->flavor = CIL_CLASS;
    289 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head->next;
    290 	test_new_item->next = test_new_item_next;
    291 
    292 	int rc = cil_list_prepend_item(test_class_list, test_new_item);
    293 	CuAssertIntEquals(tc, SEPOL_ERR, rc);
    294 }
    295 
    296 void test_cil_list_prepend_item_listnull_neg(CuTest *tc) {
    297         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    298 
    299 	struct cil_tree *test_tree;
    300         gen_test_tree(&test_tree, line);
    301 
    302 	struct cil_tree_node *test_ast_node;
    303 	cil_tree_node_init(&test_ast_node);
    304 
    305 	struct cil_db *test_db;
    306 	cil_db_init(&test_db);
    307 
    308 	test_ast_node->parent = test_db->ast->root;
    309 	test_ast_node->line = 1;
    310 
    311 	struct cil_list *test_class_list = NULL;
    312 
    313 	struct cil_list_item *test_new_item;
    314 	cil_list_item_init(&test_new_item);
    315 
    316 	test_new_item->flavor = CIL_CLASS;
    317 	test_new_item->data = test_tree->root->cl_head->cl_head->next->cl_head;
    318 
    319 	int rc = cil_list_prepend_item(test_class_list, test_new_item);
    320 	CuAssertIntEquals(tc, SEPOL_ERR, rc);
    321 }
    322 
    323 void test_cil_list_prepend_item_itemnull_neg(CuTest *tc) {
    324         char *line[] = {"(", "mlsconstrain", "(", "file", "dir", ")", "(", "create", "relabelto", ")", "(", "eq", "12", "h2", ")", ")", NULL};
    325 
    326 	struct cil_tree *test_tree;
    327         gen_test_tree(&test_tree, line);
    328 
    329 	struct cil_tree_node *test_ast_node;
    330 	cil_tree_node_init(&test_ast_node);
    331 
    332 	struct cil_db *test_db;
    333 	cil_db_init(&test_db);
    334 
    335 	test_ast_node->parent = test_db->ast->root;
    336 	test_ast_node->line = 1;
    337 
    338 	struct cil_list *test_class_list;
    339 	cil_list_init(&test_class_list);
    340 
    341 	struct cil_list_item *test_new_item = NULL;
    342 
    343 	int rc = cil_list_prepend_item(test_class_list, test_new_item);
    344 	CuAssertIntEquals(tc, SEPOL_ERR, rc);
    345 }
    346