/ tests / lib / pkg_validation.c
pkg_validation.c
  1  /*-
  2   * Copyright (c) 2013 Baptiste Daroussin <bapt@FreeBSD.org>
  3   * All rights reserved.
  4   *~
  5   * Redistribution and use in source and binary forms, with or without
  6   * modification, are permitted provided that the following conditions
  7   * are met:
  8   * 1. Redistributions of source code must retain the above copyright
  9   *    notice, this list of conditions and the following disclaimer
 10   *    in this position and unchanged.
 11   * 2. Redistributions in binary form must reproduce the above copyright
 12   *    notice, this list of conditions and the following disclaimer in the
 13   *    documentation and/or other materials provided with the distribution.
 14   *~
 15   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
 16   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 17   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 18   * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
 19   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 20   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 21   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 22   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 23   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 24   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 25   */
 26  
 27  #include <sys/types.h>
 28  
 29  #include <string.h>
 30  
 31  #include <atf-c.h>
 32  #include <xstring.h>
 33  #include <pkg.h>
 34  
 35  #ifndef __unused
 36  # ifdef __GNUC__
 37  # define __unused __attribute__ ((__unused__))
 38  # else
 39  # define __unused
 40  # endif
 41  #endif
 42  
 43  xstring *msg;
 44  
 45  ATF_TC_WITHOUT_HEAD(valid_installed);
 46  
 47  int
 48  event_callback(void *data __unused, struct pkg_event *ev)
 49  {
 50  	switch (ev->type) {
 51  	case PKG_EVENT_ERROR:
 52  		xstring_reset(msg);
 53  		fprintf(msg->fp, "%s", ev->e_pkg_error.msg);
 54  		break;
 55  	default:
 56  		/* IGNORE */
 57  		break;
 58  	}
 59  
 60  	return (0);
 61  }
 62  
 63  void
 64  check_valid(struct pkg *p)
 65  {
 66  	msg = xstring_new();
 67  
 68  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 69  	fflush(msg->fp);
 70  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property origin");
 71  
 72  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_ORIGIN, "test/bla"));
 73  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 74  	fflush(msg->fp);
 75  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property name");
 76  
 77  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_NAME, "test"));
 78  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 79  	fflush(msg->fp);
 80  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property comment");
 81  
 82  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_COMMENT, "test comment"));
 83  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 84  	fflush(msg->fp);
 85  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property version");
 86  
 87  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_VERSION, "1.1.0"));
 88  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 89  	fflush(msg->fp);
 90  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property desc");
 91  
 92  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_DESC, "test description"));
 93  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 94  	fflush(msg->fp);
 95  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property maintainer");
 96  
 97  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_MAINTAINER, "tester"));
 98  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
 99  	fflush(msg->fp);
100  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property www");
101  
102  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_WWW, "test website"));
103  	ATF_REQUIRE_EQ(EPKG_FATAL, pkg_is_valid(p));
104  	fflush(msg->fp);
105  	ATF_REQUIRE_STREQ(msg->buf, "Invalid package: object has missing property prefix");
106  
107  	ATF_REQUIRE_EQ(EPKG_OK, pkg_set(p, PKG_ATTR_PREFIX, "/usr/local"));
108  	ATF_REQUIRE_EQ(EPKG_OK, pkg_is_valid(p));
109  
110  	xstring_free(msg);
111  }
112  
113  ATF_TC_BODY(valid_installed, tc)
114  {
115  	struct pkg *p = NULL;
116  
117  	pkg_event_register(event_callback, NULL);
118  
119  	ATF_REQUIRE_EQ(EPKG_OK, pkg_new(&p, PKG_INSTALLED));
120  	ATF_REQUIRE(p != NULL);
121  
122  	check_valid(p);
123  }
124  
125  ATF_TC(valid_file);
126  
127  ATF_TC_HEAD(valid_file, tc)
128  {
129  	atf_tc_set_md_var(tc, "descr",
130  	    "pkg_valid() tests file packages");
131  }
132  
133  ATF_TC_BODY(valid_file, tc)
134  {
135  	struct pkg *p = NULL;
136  
137  	pkg_event_register(event_callback, NULL);
138  
139  	ATF_REQUIRE_EQ(EPKG_OK, pkg_new(&p, PKG_FILE));
140  	ATF_REQUIRE(p != NULL);
141  
142  	check_valid(p);
143  }
144  
145  ATF_TC(valid_remote);
146  
147  ATF_TC_HEAD(valid_remote, tc)
148  {
149  	atf_tc_set_md_var(tc, "descr",
150  	    "pkg_valid() tests remote packages");
151  }
152  
153  ATF_TC_BODY(valid_remote, tc)
154  {
155  	struct pkg *p = NULL;
156  
157  	pkg_event_register(event_callback, NULL);
158  
159  	ATF_REQUIRE_EQ(EPKG_OK, pkg_new(&p, PKG_REMOTE));
160  	ATF_REQUIRE(p != NULL);
161  
162  	check_valid(p);
163  }
164  
165  ATF_TP_ADD_TCS(tp)
166  {
167  	ATF_TP_ADD_TC(tp, valid_installed);
168  	ATF_TP_ADD_TC(tp, valid_file);
169  	ATF_TP_ADD_TC(tp, valid_remote);
170  
171  	return (atf_no_error());
172  }