libfuse
test_init.c
1#define FUSE_USE_VERSION FUSE_MAKE_VERSION(3, 17)
2
3#include "fuse_i.h"
4#include <stdio.h>
5#include <assert.h>
6#include <inttypes.h>
7
8static int convert_to_conn_want_ext(struct fuse_conn_info *conn,
9 uint64_t want_ext_default)
10{
11 if (conn->want && conn->want_ext && conn->want != conn->want_ext) {
12 return -1; // Error: both set with different values
13 }
14
15 if (conn->want && !conn->want_ext) {
16 conn->want_ext = conn->want;
17 } else if (!conn->want && !conn->want_ext) {
18 conn->want_ext = want_ext_default;
19 }
20
21 return 0;
22}
23
24static void test_init_want_conversion(void)
25{
26 struct fuse_conn_info conn = { 0 };
27 uint64_t want_ext_default = FUSE_CAP_ASYNC_READ |
29 int rc;
30
31 // Test 1: Only want is set (should convert to want_ext)
33 conn.want_ext = 0;
34 rc = convert_to_conn_want_ext(&conn, want_ext_default);
35 assert(rc == 0);
36 assert(conn.want_ext == FUSE_CAP_ASYNC_READ);
37 printf("Test 1 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
38 conn.want, conn.want_ext);
39
40 // Test 2: Only want_ext is set (should keep want_ext)
41 conn.want = 0;
43 rc = convert_to_conn_want_ext(&conn, want_ext_default);
44 assert(rc == 0);
45 assert(conn.want_ext == FUSE_CAP_ATOMIC_O_TRUNC);
46 printf("Test 2 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
47 conn.want, conn.want_ext);
48
49 // Test 3: Both want and want_ext set with conflicting values
52 rc = convert_to_conn_want_ext(&conn, want_ext_default);
53 assert(rc != 0); // Should return error
54 printf("Test 3 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
55 conn.want, conn.want_ext);
56
57 // Test 4: 32-bit want with want_ext having high bits
59 conn.want_ext = (1ULL << 33) | FUSE_CAP_ATOMIC_O_TRUNC;
60 rc = convert_to_conn_want_ext(&conn, want_ext_default);
61 assert(rc != 0); // Should return error - different values
62 printf("Test 4 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
63 conn.want, conn.want_ext);
64
65 // Test 5: want_ext with high bits (should keep want_ext)
66 conn.want = 0;
67 conn.want_ext = (1ULL << 33) | FUSE_CAP_ATOMIC_O_TRUNC;
68 rc = convert_to_conn_want_ext(&conn, want_ext_default);
69 assert(rc == 0);
70 assert(conn.want_ext == ((1ULL << 33) | FUSE_CAP_ATOMIC_O_TRUNC));
71 printf("Test 5 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
72 conn.want, conn.want_ext);
73
74 // Test 6: want with max 32-bit value
75 conn.want = 0xFFFFFFFF;
76 conn.want_ext = 0;
77 rc = convert_to_conn_want_ext(&conn, want_ext_default);
78 assert(rc == 0);
79 assert(conn.want_ext == 0xFFFFFFFF);
80 printf("Test 6 passed: want=0x%" PRIx32 " want_ext=0x%" PRIx64 "\n",
81 conn.want, conn.want_ext);
82
83 printf("All init want conversion tests passed\n");
84}
85
86int main(void)
87{
88 test_init_want_conversion();
89 return 0;
90}
#define FUSE_CAP_ATOMIC_O_TRUNC
#define FUSE_CAP_ASYNC_READ
uint64_t want_ext