Branch data Line data Source code
1 : : /*
2 : : * Copyright (c) 2020, Citrix Systems, Inc.
3 : : *
4 : : * All rights reserved.
5 : : *
6 : : * Redistribution and use in source and binary forms, with or without
7 : : * modification, are permitted provided that the following conditions are met:
8 : : *
9 : : * 1. Redistributions of source code must retain the above copyright
10 : : * notice, this list of conditions and the following disclaimer.
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 : : * 3. Neither the name of the copyright holder nor the names of its
15 : : * contributors may be used to endorse or promote products derived from
16 : : * this software without specific prior written permission.
17 : : *
18 : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 : : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 : : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 : : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
22 : : * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 : : * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 : : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25 : : * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26 : : * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 : : * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 : : * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 : : */
30 : :
31 : : #include <stddef.h>
32 : : #include <stdarg.h>
33 : : #include <setjmp.h>
34 : : #include <cmocka.h>
35 : : #include <stdlib.h>
36 : :
37 : : #include "test-suites.h"
38 : : #include "tapdisk.h"
39 : : #include "tapdisk-vbd.h"
40 : : #include "tapdisk-disktype.h"
41 : : #include "tapdisk-image.h"
42 : : #include "tapdisk-interface.h"
43 : : #include "tapdisk-nbdserver.h"
44 : :
45 : : void
46 : 1 : test_vbd_linked_list(void **state)
47 : : {
48 : 1 : tapdisk_extents_t *extents = malloc(sizeof(*extents));
49 : : bzero(extents, sizeof(tapdisk_extents_t));
50 : : td_request_t vreq;
51 : : bzero(&vreq, sizeof(td_request_t));
52 : :
53 : : vreq.sec = 0;
54 : 1 : vreq.secs = 2;
55 : 1 : vreq.status = 1;
56 : :
57 : 1 : add_extent(extents, &vreq);
58 : :
59 : 1 : assert_ptr_equal(extents->tail, extents->head);
60 : 1 : assert_int_equal(extents->tail->start, 0);
61 : 1 : assert_int_equal(extents->tail->length, 2);
62 : 1 : assert_int_equal(extents->tail->flag, 1);
63 : 1 : assert_null(extents->tail->next);
64 : 1 : assert_int_equal(extents->count, 1);
65 : :
66 : 1 : free_extents(extents);
67 : 1 : }
68 : :
69 : : void
70 : 1 : test_vbd_issue_request(void **stat)
71 : : {
72 : :
73 : : td_vbd_t vbd;
74 : : bzero(&vbd, sizeof(td_vbd_t));
75 : : INIT_LIST_HEAD(&vbd.images);
76 : : INIT_LIST_HEAD(&vbd.pending_requests);
77 : 1 : td_image_t *image = tapdisk_image_allocate("blah", DISK_TYPE_VHD, TD_OPEN_RDONLY | TD_OPEN_SHAREABLE);
78 : 1 : list_add_tail(&image->next, &vbd.images);
79 : :
80 : : td_vbd_request_t vreq;
81 : : bzero(&vreq, sizeof(td_vbd_request_t));
82 : : INIT_LIST_HEAD(&vreq.next);
83 : 1 : vreq.iovcnt = 1;
84 : : struct td_iovec iov;
85 : 1 : iov.base = 0;
86 : 1 : iov.secs = 2;
87 : 1 : vreq.iov = &iov;
88 : 1 : vreq.op = TD_OP_BLOCK_STATUS;
89 : :
90 : : td_request_t my_treq;
91 : : bzero(&my_treq, sizeof(my_treq));
92 : : my_treq.sidx = 0;
93 : : my_treq.buf = iov.base;
94 : : my_treq.sec = vreq.sec;
95 : 1 : my_treq.secs = iov.secs;
96 : 1 : my_treq.image = image;
97 : : my_treq.cb_data = NULL;
98 : 1 : my_treq.vreq = &vreq;
99 : 1 : my_treq.op = TD_OP_BLOCK_STATUS;
100 : 1 : my_treq.cb = tapdisk_vbd_complete_block_status_request;
101 : :
102 : 1 : expect_memory(__wrap_td_queue_block_status, treq, &my_treq, sizeof(my_treq));
103 : :
104 : 1 : will_return(__wrap_tapdisk_image_check_request, 0);
105 : 1 : int err = tapdisk_vbd_issue_request(&vbd, &vreq);
106 : 1 : assert_int_equal(err, 0);
107 : 1 : tapdisk_image_free(image);
108 : 1 : }
109 : :
110 : : void
111 : 1 : test_vbd_complete_block_status_request(void **stat)
112 : : {
113 : :
114 : : td_vbd_t vbd;
115 : : bzero(&vbd, sizeof(td_vbd_t));
116 : : INIT_LIST_HEAD(&vbd.images);
117 : : INIT_LIST_HEAD(&vbd.pending_requests);
118 : 1 : td_image_t *image = tapdisk_image_allocate("blah", DISK_TYPE_VHD, TD_OPEN_RDONLY | TD_OPEN_SHAREABLE);
119 : 1 : list_add_tail(&image->next, &vbd.images);
120 : :
121 : 1 : tapdisk_extents_t *extents = malloc(sizeof(*extents));
122 : : bzero(extents, sizeof(*extents));
123 : :
124 : : td_vbd_request_t vreq;
125 : : bzero(&vreq, sizeof(td_vbd_request_t));
126 : : INIT_LIST_HEAD(&vreq.next);
127 : 1 : vreq.vbd = &vbd;
128 : 1 : vreq.iovcnt = 1;
129 : : struct td_iovec iov;
130 : 1 : iov.base = 0;
131 : 1 : iov.secs = 123;
132 : 1 : vreq.iov = &iov;
133 : 1 : vreq.op = TD_OP_BLOCK_STATUS;
134 : 1 : vreq.data = extents;
135 : :
136 : : td_request_t my_treq;
137 : : bzero(&my_treq, sizeof(my_treq));
138 : : my_treq.sidx = 0;
139 : : my_treq.buf = iov.base;
140 : : my_treq.sec = vreq.sec;
141 : 1 : my_treq.secs = iov.secs;
142 : 1 : my_treq.image = image;
143 : : my_treq.cb_data = NULL;
144 : 1 : my_treq.vreq = &vreq;
145 : 1 : my_treq.status = TD_BLOCK_STATE_HOLE;
146 : 1 : my_treq.op = TD_OP_BLOCK_STATUS;
147 : 1 : my_treq.cb = tapdisk_vbd_complete_block_status_request;
148 : :
149 : 1 : tapdisk_vbd_complete_block_status_request(my_treq, 0);
150 : 1 : assert_non_null(extents->head);
151 : 1 : assert_int_equal(extents->head->flag, TD_BLOCK_STATE_HOLE);
152 : 1 : assert_int_equal(extents->head->start, my_treq.sec);
153 : 1 : assert_int_equal(extents->head->length, my_treq.secs);
154 : :
155 : 1 : tapdisk_image_close(image);
156 : 1 : free_extents(extents);
157 : 1 : }
|