1b0b1dbddSEnji Cooper /*-
2*148a8da8SEnji Cooper * Copyright (c) 2017 Enji Cooper <ngie@freebsd.org>
3b0b1dbddSEnji Cooper *
4b0b1dbddSEnji Cooper * Redistribution and use in source and binary forms, with or without
5b0b1dbddSEnji Cooper * modification, are permitted provided that the following conditions
6b0b1dbddSEnji Cooper * are met:
7b0b1dbddSEnji Cooper * 1. Redistributions of source code must retain the above copyright
8b0b1dbddSEnji Cooper * notice, this list of conditions and the following disclaimer.
9b0b1dbddSEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright
10b0b1dbddSEnji Cooper * notice, this list of conditions and the following disclaimer in the
11b0b1dbddSEnji Cooper * documentation and/or other materials provided with the distribution.
12b0b1dbddSEnji Cooper *
13b0b1dbddSEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14b0b1dbddSEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15b0b1dbddSEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16b0b1dbddSEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17b0b1dbddSEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18b0b1dbddSEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19b0b1dbddSEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20b0b1dbddSEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21b0b1dbddSEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22b0b1dbddSEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23b0b1dbddSEnji Cooper * SUCH DAMAGE.
24b0b1dbddSEnji Cooper */
25b0b1dbddSEnji Cooper
268a0a413eSAlan Somers /* Tests functions in lib/libcam/camlib.c */
278a0a413eSAlan Somers
280e6acb26SEnji Cooper #include <sys/cdefs.h>
29b0b1dbddSEnji Cooper #include <errno.h>
30b0b1dbddSEnji Cooper #include <fcntl.h>
31b0b1dbddSEnji Cooper #include <stdio.h>
32b0b1dbddSEnji Cooper #include <camlib.h>
33b0b1dbddSEnji Cooper
34b0b1dbddSEnji Cooper #include <atf-c.h>
35b0b1dbddSEnji Cooper
36b0b1dbddSEnji Cooper static const char *
get_cam_test_device(const atf_tc_t * tc)37b0b1dbddSEnji Cooper get_cam_test_device(const atf_tc_t *tc)
38b0b1dbddSEnji Cooper {
39b0b1dbddSEnji Cooper const char *cam_test_device;
40b0b1dbddSEnji Cooper
41b0b1dbddSEnji Cooper cam_test_device = atf_tc_get_config_var(tc, "cam_test_device");
42b0b1dbddSEnji Cooper
43b0b1dbddSEnji Cooper return (cam_test_device);
44b0b1dbddSEnji Cooper }
45b0b1dbddSEnji Cooper
46b0b1dbddSEnji Cooper static void
cam_clear_error(void)47b0b1dbddSEnji Cooper cam_clear_error(void)
48b0b1dbddSEnji Cooper {
49b0b1dbddSEnji Cooper
50b0b1dbddSEnji Cooper strcpy(cam_errbuf, "");
51b0b1dbddSEnji Cooper }
52b0b1dbddSEnji Cooper
53b0b1dbddSEnji Cooper static bool
cam_has_error(void)54b0b1dbddSEnji Cooper cam_has_error(void)
55b0b1dbddSEnji Cooper {
56b0b1dbddSEnji Cooper
57b0b1dbddSEnji Cooper return (strlen(cam_errbuf) != 0);
58b0b1dbddSEnji Cooper }
59b0b1dbddSEnji Cooper
60f56f82e0SEnji Cooper ATF_TC_WITHOUT_HEAD(cam_get_device_negative_test_NULL_path);
ATF_TC_BODY(cam_get_device_negative_test_NULL_path,tc)61f56f82e0SEnji Cooper ATF_TC_BODY(cam_get_device_negative_test_NULL_path, tc)
62f56f82e0SEnji Cooper {
63f56f82e0SEnji Cooper char parsed_dev_name[DEV_IDLEN + 1];
64f56f82e0SEnji Cooper int parsed_unit;
65f56f82e0SEnji Cooper
66f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device(NULL, parsed_dev_name,
67f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == -1,
68f56f82e0SEnji Cooper "cam_get_device succeeded unexpectedly");
69f56f82e0SEnji Cooper }
70f56f82e0SEnji Cooper
71f56f82e0SEnji Cooper ATF_TC_WITHOUT_HEAD(cam_get_device_negative_test_bad_path);
ATF_TC_BODY(cam_get_device_negative_test_bad_path,tc)72f56f82e0SEnji Cooper ATF_TC_BODY(cam_get_device_negative_test_bad_path, tc)
73f56f82e0SEnji Cooper {
74f56f82e0SEnji Cooper char parsed_dev_name[DEV_IDLEN + 1];
75f56f82e0SEnji Cooper int parsed_unit;
76f56f82e0SEnji Cooper
77f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device("1ada", parsed_dev_name,
78f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == -1,
79f56f82e0SEnji Cooper "cam_get_device succeeded unexpectedly");
80f56f82e0SEnji Cooper }
81f56f82e0SEnji Cooper
82f56f82e0SEnji Cooper ATF_TC_WITHOUT_HEAD(cam_get_device_negative_test_nul_path);
ATF_TC_BODY(cam_get_device_negative_test_nul_path,tc)83f56f82e0SEnji Cooper ATF_TC_BODY(cam_get_device_negative_test_nul_path, tc)
84f56f82e0SEnji Cooper {
85f56f82e0SEnji Cooper char parsed_dev_name[DEV_IDLEN + 1];
86f56f82e0SEnji Cooper int parsed_unit;
87f56f82e0SEnji Cooper
88f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device("", parsed_dev_name,
89f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == -1,
90f56f82e0SEnji Cooper "cam_get_device succeeded unexpectedly");
91f56f82e0SEnji Cooper }
92f56f82e0SEnji Cooper
93f56f82e0SEnji Cooper ATF_TC_WITHOUT_HEAD(cam_get_device_negative_test_root);
ATF_TC_BODY(cam_get_device_negative_test_root,tc)94f56f82e0SEnji Cooper ATF_TC_BODY(cam_get_device_negative_test_root, tc)
95f56f82e0SEnji Cooper {
96f56f82e0SEnji Cooper char parsed_dev_name[DEV_IDLEN + 1];
97f56f82e0SEnji Cooper int parsed_unit;
98f56f82e0SEnji Cooper
99f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device("/", parsed_dev_name,
100f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == -1,
101f56f82e0SEnji Cooper "cam_get_device succeeded unexpectedly");
102f56f82e0SEnji Cooper }
103f56f82e0SEnji Cooper
104f56f82e0SEnji Cooper ATF_TC_WITHOUT_HEAD(cam_get_device_positive_test);
ATF_TC_BODY(cam_get_device_positive_test,tc)105f56f82e0SEnji Cooper ATF_TC_BODY(cam_get_device_positive_test, tc)
106f56f82e0SEnji Cooper {
107f56f82e0SEnji Cooper char expected_dev_name[] = "foo";
108f56f82e0SEnji Cooper char parsed_dev_name[DEV_IDLEN + 1];
109f56f82e0SEnji Cooper int expected_unit, parsed_unit;
110f56f82e0SEnji Cooper
111f56f82e0SEnji Cooper expected_unit = 1;
112f56f82e0SEnji Cooper
113f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device("/dev/foo1", parsed_dev_name,
114f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == 0,
115f56f82e0SEnji Cooper "cam_get_device failed");
116f56f82e0SEnji Cooper ATF_REQUIRE_STREQ(parsed_dev_name, expected_dev_name);
117f56f82e0SEnji Cooper ATF_REQUIRE(parsed_unit == expected_unit);
118f56f82e0SEnji Cooper
119f56f82e0SEnji Cooper strcpy(parsed_dev_name, "");
120f56f82e0SEnji Cooper parsed_unit = -1;
121f56f82e0SEnji Cooper
122f56f82e0SEnji Cooper ATF_REQUIRE_MSG(cam_get_device("foo1", parsed_dev_name,
123f56f82e0SEnji Cooper nitems(parsed_dev_name), &parsed_unit) == 0,
124f56f82e0SEnji Cooper "cam_get_device failed");
125f56f82e0SEnji Cooper ATF_REQUIRE_STREQ(parsed_dev_name, expected_dev_name);
126f56f82e0SEnji Cooper ATF_REQUIRE(parsed_unit == expected_unit);
127f56f82e0SEnji Cooper }
128f56f82e0SEnji Cooper
129512bd18dSAlan Somers /*
130512bd18dSAlan Somers * sa(4) uniquely creates nsa and esa device nodes for non-rewind operations
131512bd18dSAlan Somers * and eject-on-close operations. cam_get_device must special case these nodes
132512bd18dSAlan Somers * to always return the base device.
133512bd18dSAlan Somers */
134512bd18dSAlan Somers ATF_TC_WITHOUT_HEAD(cam_get_device_sa_test);
ATF_TC_BODY(cam_get_device_sa_test,tc)135512bd18dSAlan Somers ATF_TC_BODY(cam_get_device_sa_test, tc)
136512bd18dSAlan Somers {
137512bd18dSAlan Somers char parsed_dev_name[DEV_IDLEN + 1];
138512bd18dSAlan Somers int parsed_unit;
139512bd18dSAlan Somers
140512bd18dSAlan Somers ATF_REQUIRE_MSG(cam_get_device("nsa99", parsed_dev_name,
141512bd18dSAlan Somers nitems(parsed_dev_name), &parsed_unit) == 0,
142512bd18dSAlan Somers "cam_get_device failed");
143512bd18dSAlan Somers ATF_REQUIRE_STREQ(parsed_dev_name, "sa");
144512bd18dSAlan Somers ATF_REQUIRE(parsed_unit == 99);
145512bd18dSAlan Somers
146512bd18dSAlan Somers strcpy(parsed_dev_name, "");
147512bd18dSAlan Somers parsed_unit = -1;
148512bd18dSAlan Somers
149512bd18dSAlan Somers ATF_REQUIRE_MSG(cam_get_device("esa99", parsed_dev_name,
150512bd18dSAlan Somers nitems(parsed_dev_name), &parsed_unit) == 0,
151512bd18dSAlan Somers "cam_get_device failed");
152512bd18dSAlan Somers ATF_REQUIRE_STREQ(parsed_dev_name, "sa");
153512bd18dSAlan Somers ATF_REQUIRE(parsed_unit == 99);
154512bd18dSAlan Somers }
155512bd18dSAlan Somers
156b0b1dbddSEnji Cooper ATF_TC(cam_open_device_negative_test_O_RDONLY);
ATF_TC_HEAD(cam_open_device_negative_test_O_RDONLY,tc)157b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_open_device_negative_test_O_RDONLY, tc)
158b0b1dbddSEnji Cooper {
159b0b1dbddSEnji Cooper
160b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "descr",
161b0b1dbddSEnji Cooper "test that cam_open_device(`cam_device`, O_RDONLY) fails to open "
162b0b1dbddSEnji Cooper "the underlying pass(4) device (bug 217649)");
163b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.config", "cam_test_device");
164b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
165b0b1dbddSEnji Cooper }
166b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_open_device_negative_test_O_RDONLY,tc)167b0b1dbddSEnji Cooper ATF_TC_BODY(cam_open_device_negative_test_O_RDONLY, tc)
168b0b1dbddSEnji Cooper {
169b0b1dbddSEnji Cooper const char *cam_test_device;
170b0b1dbddSEnji Cooper
171b0b1dbddSEnji Cooper cam_test_device = get_cam_test_device(tc);
172b0b1dbddSEnji Cooper
173b0b1dbddSEnji Cooper cam_clear_error();
174b0b1dbddSEnji Cooper ATF_CHECK(cam_open_device(cam_test_device, O_RDONLY) == NULL);
175b0b1dbddSEnji Cooper ATF_REQUIRE(cam_has_error());
176b0b1dbddSEnji Cooper }
177b0b1dbddSEnji Cooper
178b0b1dbddSEnji Cooper ATF_TC(cam_open_device_negative_test_nonexistent);
ATF_TC_HEAD(cam_open_device_negative_test_nonexistent,tc)179b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_open_device_negative_test_nonexistent, tc)
180b0b1dbddSEnji Cooper {
181b0b1dbddSEnji Cooper
182b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
183b0b1dbddSEnji Cooper }
184b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_open_device_negative_test_nonexistent,tc)185b0b1dbddSEnji Cooper ATF_TC_BODY(cam_open_device_negative_test_nonexistent, tc)
186b0b1dbddSEnji Cooper {
187b0b1dbddSEnji Cooper
188b0b1dbddSEnji Cooper cam_clear_error();
189b0b1dbddSEnji Cooper ATF_REQUIRE(cam_open_device("/nonexistent", O_RDWR) == NULL);
190b0b1dbddSEnji Cooper ATF_REQUIRE(cam_has_error());
191b0b1dbddSEnji Cooper }
192b0b1dbddSEnji Cooper
193b0b1dbddSEnji Cooper ATF_TC(cam_open_device_negative_test_unprivileged);
ATF_TC_HEAD(cam_open_device_negative_test_unprivileged,tc)194b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_open_device_negative_test_unprivileged, tc)
195b0b1dbddSEnji Cooper {
196b0b1dbddSEnji Cooper
197b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.config", "cam_test_device");
198b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "unprivileged");
199b0b1dbddSEnji Cooper }
200b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_open_device_negative_test_unprivileged,tc)201b0b1dbddSEnji Cooper ATF_TC_BODY(cam_open_device_negative_test_unprivileged, tc)
202b0b1dbddSEnji Cooper {
203b0b1dbddSEnji Cooper const char *cam_test_device;
204b0b1dbddSEnji Cooper
205b0b1dbddSEnji Cooper cam_test_device = get_cam_test_device(tc);
206b0b1dbddSEnji Cooper
207b0b1dbddSEnji Cooper cam_clear_error();
208b0b1dbddSEnji Cooper ATF_CHECK(cam_open_device(cam_test_device, O_RDONLY) == NULL);
209b0b1dbddSEnji Cooper ATF_REQUIRE(cam_has_error());
210b0b1dbddSEnji Cooper
211b0b1dbddSEnji Cooper cam_clear_error();
212b0b1dbddSEnji Cooper ATF_CHECK(cam_open_device(cam_test_device, O_RDWR) == NULL);
213b0b1dbddSEnji Cooper ATF_REQUIRE(cam_has_error());
214b0b1dbddSEnji Cooper }
215b0b1dbddSEnji Cooper
216b0b1dbddSEnji Cooper ATF_TC(cam_open_device_positive_test);
ATF_TC_HEAD(cam_open_device_positive_test,tc)217b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_open_device_positive_test, tc)
218b0b1dbddSEnji Cooper {
219b0b1dbddSEnji Cooper
220b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.config", "cam_test_device");
221b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
222b0b1dbddSEnji Cooper }
223b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_open_device_positive_test,tc)224b0b1dbddSEnji Cooper ATF_TC_BODY(cam_open_device_positive_test, tc)
225b0b1dbddSEnji Cooper {
226b0b1dbddSEnji Cooper struct cam_device *cam_dev;
227b0b1dbddSEnji Cooper const char *cam_test_device;
228b0b1dbddSEnji Cooper
229b0b1dbddSEnji Cooper cam_test_device = get_cam_test_device(tc);
230b0b1dbddSEnji Cooper
231b0b1dbddSEnji Cooper cam_clear_error();
232b0b1dbddSEnji Cooper cam_dev = cam_open_device(cam_test_device, O_RDWR);
233b0b1dbddSEnji Cooper ATF_CHECK_MSG(cam_dev != NULL, "cam_open_device failed: %s",
234b0b1dbddSEnji Cooper cam_errbuf);
235b0b1dbddSEnji Cooper ATF_REQUIRE(!cam_has_error());
236b0b1dbddSEnji Cooper cam_close_device(cam_dev);
237b0b1dbddSEnji Cooper }
238b0b1dbddSEnji Cooper
239b0b1dbddSEnji Cooper ATF_TC(cam_close_device_negative_test_NULL);
ATF_TC_HEAD(cam_close_device_negative_test_NULL,tc)240b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_close_device_negative_test_NULL, tc)
241b0b1dbddSEnji Cooper {
242b0b1dbddSEnji Cooper
243b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "descr",
244b0b1dbddSEnji Cooper "test that cam_close_device(NULL) succeeds without error");
245b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
246b0b1dbddSEnji Cooper }
247b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_close_device_negative_test_NULL,tc)248b0b1dbddSEnji Cooper ATF_TC_BODY(cam_close_device_negative_test_NULL, tc)
249b0b1dbddSEnji Cooper {
250b0b1dbddSEnji Cooper
251b0b1dbddSEnji Cooper cam_clear_error();
252b0b1dbddSEnji Cooper cam_close_device(NULL);
253b0b1dbddSEnji Cooper ATF_REQUIRE(!cam_has_error());
254b0b1dbddSEnji Cooper }
255b0b1dbddSEnji Cooper
256b0b1dbddSEnji Cooper ATF_TC(cam_getccb_positive_test);
ATF_TC_HEAD(cam_getccb_positive_test,tc)257b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_getccb_positive_test, tc)
258b0b1dbddSEnji Cooper {
259b0b1dbddSEnji Cooper
260b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.config", "cam_test_device");
261b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
262b0b1dbddSEnji Cooper }
263b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_getccb_positive_test,tc)264b0b1dbddSEnji Cooper ATF_TC_BODY(cam_getccb_positive_test, tc)
265b0b1dbddSEnji Cooper {
266b0b1dbddSEnji Cooper union ccb *cam_ccb;
267b0b1dbddSEnji Cooper struct cam_device *cam_dev;
268b0b1dbddSEnji Cooper const char *cam_test_device;
269b0b1dbddSEnji Cooper
270b0b1dbddSEnji Cooper cam_test_device = get_cam_test_device(tc);
271b0b1dbddSEnji Cooper
272b0b1dbddSEnji Cooper cam_clear_error();
273b0b1dbddSEnji Cooper cam_dev = cam_open_device(cam_test_device, O_RDWR);
274b0b1dbddSEnji Cooper ATF_CHECK_MSG(cam_dev != NULL, "cam_open_device failed: %s",
275b0b1dbddSEnji Cooper cam_errbuf);
276b0b1dbddSEnji Cooper ATF_REQUIRE(!cam_has_error());
277b0b1dbddSEnji Cooper cam_ccb = cam_getccb(cam_dev);
278b0b1dbddSEnji Cooper ATF_CHECK_MSG(cam_ccb != NULL, "get_camccb failed: %s", cam_errbuf);
279b0b1dbddSEnji Cooper ATF_REQUIRE(!cam_has_error());
280b0b1dbddSEnji Cooper cam_freeccb(cam_ccb);
281b0b1dbddSEnji Cooper cam_close_device(cam_dev);
282b0b1dbddSEnji Cooper }
283b0b1dbddSEnji Cooper
284b0b1dbddSEnji Cooper ATF_TC(cam_freeccb_negative_test_NULL);
ATF_TC_HEAD(cam_freeccb_negative_test_NULL,tc)285b0b1dbddSEnji Cooper ATF_TC_HEAD(cam_freeccb_negative_test_NULL, tc)
286b0b1dbddSEnji Cooper {
287b0b1dbddSEnji Cooper
288b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "descr",
289b0b1dbddSEnji Cooper "test that cam_freeccb(NULL) succeeds without error");
290b0b1dbddSEnji Cooper atf_tc_set_md_var(tc, "require.user", "root");
291b0b1dbddSEnji Cooper }
292b0b1dbddSEnji Cooper
ATF_TC_BODY(cam_freeccb_negative_test_NULL,tc)293b0b1dbddSEnji Cooper ATF_TC_BODY(cam_freeccb_negative_test_NULL, tc)
294b0b1dbddSEnji Cooper {
295b0b1dbddSEnji Cooper
296b0b1dbddSEnji Cooper cam_clear_error();
297b0b1dbddSEnji Cooper cam_freeccb(NULL);
298b0b1dbddSEnji Cooper ATF_REQUIRE(!cam_has_error());
299b0b1dbddSEnji Cooper }
300b0b1dbddSEnji Cooper
ATF_TP_ADD_TCS(tp)301b0b1dbddSEnji Cooper ATF_TP_ADD_TCS(tp)
302b0b1dbddSEnji Cooper {
303b0b1dbddSEnji Cooper
304f56f82e0SEnji Cooper ATF_TP_ADD_TC(tp, cam_get_device_negative_test_NULL_path);
305f56f82e0SEnji Cooper ATF_TP_ADD_TC(tp, cam_get_device_negative_test_bad_path);
306f56f82e0SEnji Cooper ATF_TP_ADD_TC(tp, cam_get_device_negative_test_nul_path);
307f56f82e0SEnji Cooper ATF_TP_ADD_TC(tp, cam_get_device_negative_test_root);
308f56f82e0SEnji Cooper ATF_TP_ADD_TC(tp, cam_get_device_positive_test);
309512bd18dSAlan Somers ATF_TP_ADD_TC(tp, cam_get_device_sa_test);
310b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_open_device_negative_test_O_RDONLY);
311b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_open_device_negative_test_nonexistent);
312b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_open_device_negative_test_unprivileged);
313b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_open_device_positive_test);
314b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_close_device_negative_test_NULL);
315b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_getccb_positive_test);
316b0b1dbddSEnji Cooper ATF_TP_ADD_TC(tp, cam_freeccb_negative_test_NULL);
317b0b1dbddSEnji Cooper
318b0b1dbddSEnji Cooper return (atf_no_error());
319b0b1dbddSEnji Cooper }
320