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 : :
44 : : void
45 : 1 : test_vbd_linked_list(void **state)
46 : : {
47 : : tapdisk_extents_t extents;
48 : : bzero(&extents, sizeof(tapdisk_extents_t));
49 : : td_request_t vreq;
50 : : bzero(&vreq, sizeof(td_request_t));
51 : :
52 : : vreq.sec = 0;
53 : 1 : vreq.secs = 2;
54 : 1 : vreq.status = 1;
55 : :
56 : 1 : add_extent(&extents, &vreq);
57 : 1 : assert_ptr_equal(extents.tail, extents.head);
58 : 1 : assert_int_equal(extents.tail->start, 0);
59 : 1 : assert_int_equal(extents.tail->length, 2);
60 : 1 : assert_int_equal(extents.tail->flag, 1);
61 : 1 : assert_null(extents.tail->next);
62 : 1 : assert_int_equal(extents.count, 1);
63 : 1 : }
64 : :
65 : : void
66 : 1 : test_vbd_issue_request(void **stat)
67 : : {
68 : :
69 : : td_vbd_t vbd;
70 : : bzero(&vbd, sizeof(td_vbd_t));
71 : : INIT_LIST_HEAD(&vbd.images);
72 : : INIT_LIST_HEAD(&vbd.pending_requests);
73 : 1 : td_image_t *image = tapdisk_image_allocate("blah", DISK_TYPE_VHD, TD_OPEN_RDONLY | TD_OPEN_SHAREABLE);
74 : 1 : list_add_tail(&image->next, &vbd.images);
75 : :
76 : : td_vbd_request_t vreq;
77 : : bzero(&vreq, sizeof(td_vbd_request_t));
78 : : INIT_LIST_HEAD(&vreq.next);
79 : 1 : vreq.iovcnt = 1;
80 : : struct td_iovec iov;
81 : 1 : iov.base = 0;
82 : 1 : iov.secs = 2;
83 : 1 : vreq.iov = &iov;
84 : 1 : vreq.op = TD_OP_BLOCK_STATUS;
85 : :
86 : : td_request_t my_treq;
87 : : bzero(&my_treq, sizeof(my_treq));
88 : : my_treq.sidx = 0;
89 : : my_treq.buf = iov.base;
90 : : my_treq.sec = vreq.sec;
91 : 1 : my_treq.secs = iov.secs;
92 : 1 : my_treq.image = image;
93 : : my_treq.cb_data = NULL;
94 : 1 : my_treq.vreq = &vreq;
95 : 1 : my_treq.op = TD_OP_BLOCK_STATUS;
96 : 1 : my_treq.cb = tapdisk_vbd_complete_block_status_request;
97 : :
98 : 1 : expect_memory(__wrap_td_queue_block_status, treq, &my_treq, sizeof(my_treq));
99 : :
100 : 1 : will_return(__wrap_tapdisk_image_check_request, 0);
101 : 1 : int err = tapdisk_vbd_issue_request(&vbd, &vreq);
102 : 1 : assert_int_equal(err, 0);
103 : 1 : tapdisk_image_free(image);
104 : 1 : }
105 : :
106 : : void
107 : 1 : test_vbd_complete_block_status_request(void **stat)
108 : : {
109 : :
110 : : td_vbd_t vbd;
111 : : bzero(&vbd, sizeof(td_vbd_t));
112 : : INIT_LIST_HEAD(&vbd.images);
113 : : INIT_LIST_HEAD(&vbd.pending_requests);
114 : 1 : td_image_t *image = tapdisk_image_allocate("blah", DISK_TYPE_VHD, TD_OPEN_RDONLY | TD_OPEN_SHAREABLE);
115 : 1 : list_add_tail(&image->next, &vbd.images);
116 : :
117 : : tapdisk_extents_t extents;
118 : : bzero(&extents, sizeof(extents));
119 : :
120 : : td_vbd_request_t vreq;
121 : : bzero(&vreq, sizeof(td_vbd_request_t));
122 : : INIT_LIST_HEAD(&vreq.next);
123 : 1 : vreq.vbd = &vbd;
124 : 1 : vreq.iovcnt = 1;
125 : : struct td_iovec iov;
126 : 1 : iov.base = 0;
127 : 1 : iov.secs = 123;
128 : 1 : vreq.iov = &iov;
129 : 1 : vreq.op = TD_OP_BLOCK_STATUS;
130 : 1 : vreq.data = &extents;
131 : :
132 : : td_request_t my_treq;
133 : : bzero(&my_treq, sizeof(my_treq));
134 : : my_treq.sidx = 0;
135 : : my_treq.buf = iov.base;
136 : : my_treq.sec = vreq.sec;
137 : 1 : my_treq.secs = iov.secs;
138 : 1 : my_treq.image = image;
139 : : my_treq.cb_data = NULL;
140 : 1 : my_treq.vreq = &vreq;
141 : 1 : my_treq.status = TD_BLOCK_STATE_HOLE;
142 : 1 : my_treq.op = TD_OP_BLOCK_STATUS;
143 : 1 : my_treq.cb = tapdisk_vbd_complete_block_status_request;
144 : :
145 : 1 : tapdisk_vbd_complete_block_status_request(my_treq, 0);
146 : 1 : assert_non_null(extents.head);
147 : 1 : assert_int_equal(extents.head->flag, TD_BLOCK_STATE_HOLE);
148 : 1 : assert_int_equal(extents.head->start, my_treq.sec);
149 : 1 : assert_int_equal(extents.head->length, my_treq.secs);
150 : 1 : }
|