github.com/kubiko/snapd@v0.0.0-20201013125620-d4f3094d9ddf/cmd/snap-confine/cookie-support-test.c (about)

     1  /*
     2   * Copyright (C) 2017 Canonical Ltd
     3   *
     4   * This program is free software: you can redistribute it and/or modify
     5   * it under the terms of the GNU General Public License version 3 as
     6   * published by the Free Software Foundation.
     7   *
     8   * This program is distributed in the hope that it will be useful,
     9   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    10   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11   * GNU General Public License for more details.
    12   *
    13   * You should have received a copy of the GNU General Public License
    14   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15   *
    16   */
    17  
    18  #include "cookie-support.h"
    19  #include "cookie-support.c"
    20  
    21  #include "../libsnap-confine-private/cleanup-funcs.h"
    22  #include "../libsnap-confine-private/test-utils.h"
    23  
    24  #include <glib.h>
    25  #include <stdlib.h>
    26  #include <stdio.h>
    27  #include <string.h>
    28  
    29  // Set alternate cookie directory
    30  static void set_cookie_dir(const char *dir)
    31  {
    32  	sc_cookie_dir = dir;
    33  }
    34  
    35  static void set_fake_cookie_dir(void)
    36  {
    37  	char *ctx_dir = NULL;
    38  	ctx_dir = g_dir_make_tmp(NULL, NULL);
    39  	g_assert_nonnull(ctx_dir);
    40  	g_test_queue_free(ctx_dir);
    41  
    42  	g_test_queue_destroy((GDestroyNotify) rm_rf_tmp, ctx_dir);
    43  	g_test_queue_destroy((GDestroyNotify) set_cookie_dir, SC_COOKIE_DIR);
    44  
    45  	set_cookie_dir(ctx_dir);
    46  }
    47  
    48  static void create_dumy_cookie_file(const char *snap_name,
    49  				    const char *dummy_cookie)
    50  {
    51  	char path[PATH_MAX] = { 0 };
    52  	FILE *f;
    53  	int n;
    54  
    55  	snprintf(path, sizeof(path), "%s/snap.%s", sc_cookie_dir, snap_name);
    56  
    57  	f = fopen(path, "w");
    58  	g_assert_nonnull(f);
    59  
    60  	n = fwrite(dummy_cookie, 1, strlen(dummy_cookie), f);
    61  	g_assert_cmpint(n, ==, strlen(dummy_cookie));
    62  
    63  	fclose(f);
    64  }
    65  
    66  static void test_cookie_get_from_snapd__successful(void)
    67  {
    68  	struct sc_error *err SC_CLEANUP(sc_cleanup_error) = NULL;
    69  	char *cookie SC_CLEANUP(sc_cleanup_string) = NULL;
    70  
    71  	char *dummy = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijmnopqrst";
    72  
    73  	set_fake_cookie_dir();
    74  	create_dumy_cookie_file("test-snap", dummy);
    75  
    76  	cookie = sc_cookie_get_from_snapd("test-snap", &err);
    77  	g_assert_null(err);
    78  	g_assert_nonnull(cookie);
    79  	g_assert_cmpint(strlen(cookie), ==, 44);
    80  	g_assert_cmpstr(cookie, ==, dummy);
    81  }
    82  
    83  static void test_cookie_get_from_snapd__nofile(void)
    84  {
    85  	struct sc_error *err SC_CLEANUP(sc_cleanup_error) = NULL;
    86  	char *cookie SC_CLEANUP(sc_cleanup_string) = NULL;
    87  
    88  	set_fake_cookie_dir();
    89  
    90  	cookie = sc_cookie_get_from_snapd("test-snap2", &err);
    91  	g_assert_nonnull(err);
    92  	g_assert_cmpstr(sc_error_domain(err), ==, SC_ERRNO_DOMAIN);
    93  	g_assert_nonnull(strstr(sc_error_msg(err), "cannot open cookie file"));
    94  	g_assert_null(cookie);
    95  }
    96  
    97  static void __attribute__((constructor)) init(void)
    98  {
    99  	g_test_add_func("/snap-cookie/cookie_get_from_snapd/successful",
   100  			test_cookie_get_from_snapd__successful);
   101  	g_test_add_func("/snap-cookie/cookie_get_from_snapd/no_cookie_file",
   102  			test_cookie_get_from_snapd__nofile);
   103  }