Unix CM: We're disconnected if RW disconnected too
[openafs.git] / tests / volser / vos-t.c
1 #include <afsconfig.h>
2 #include <afs/param.h>
3
4 #include <roken.h>
5
6 #include <rx/rx.h>
7 #include <ubik.h>
8
9 #include <afs/com_err.h>
10 #include <afs/vldbint.h>
11 #include <afs/cellconfig.h>
12
13 #include <tap/basic.h>
14
15 #include "common.h"
16
17 /* This checks for a bug in vos where it would fail to allocate additional
18  * space for the results of multi homed VL_GetAddrsU, and so would segfault
19  * if a host with a small number of addresses was immediately followed by
20  * a host with a large number of addresses.
21  */
22 void
23 TestListAddrs(struct ubik_client *client, char *dirname)
24 {
25     int code;
26     bulkaddrs addrs;
27     pid_t pid;
28     int outpipe[2];
29     int status;
30     char *buffer;
31     size_t len;
32
33     afs_uint32 addrsA[] = {0x0a000000};
34     afs_uint32 addrsB[] = {0x0a000001, 0x0a000002, 0x0a000003, 0x0a000004,
35                            0x0a000005, 0x0a000006, 0x0a000007, 0x0a000008,
36                            0x0a000009, 0x0a00000a, 0x0a00000b, 0x0a00000c,
37                            0x0a00000d, 0x0a00000e, 0x0a00000f};
38     char uuidA[] = {0x4F, 0x44, 0x94, 0x47, 0x76, 0xBA, 0x47, 0x2C, 0x97, 0x1A,
39                     0x86, 0x6B, 0xC0, 0x10, 0x1A, 0x4B};
40     char uuidB[] = {0x5D, 0x2A, 0x39, 0x36, 0x94, 0xB2, 0x48, 0x90, 0xA8, 0xD2,
41                     0x7F, 0xBC, 0x1B, 0x29, 0xDA, 0x9B};
42     char expecting[] = "10.0.0.0\n10.0.0.1\n10.0.0.2\n10.0.0.3\n10.0.0.4\n"
43                        "10.0.0.5\n10.0.0.6\n10.0.0.7\n10.0.0.8\n10.0.0.9\n"
44                        "10.0.0.10\n10.0.0.11\n10.0.0.12\n10.0.0.13\n"
45                        "10.0.0.14\n10.0.0.15\n";
46
47     addrs.bulkaddrs_len = 1;
48     addrs.bulkaddrs_val = addrsA;
49     code = ubik_VL_RegisterAddrs(client, 0, (afsUUID *)uuidA, 0, &addrs);
50     is_int(0, code, "First address registration succeeds");
51
52     addrs.bulkaddrs_len = 15;
53     addrs.bulkaddrs_val = addrsB;
54     code = ubik_VL_RegisterAddrs(client, 0, (afsUUID *)uuidB, 0, &addrs);
55     is_int(0, code, "Second address registration succeeds");
56
57     /* Now we need to run vos ListAddrs and see what happens ... */
58     pipe(outpipe);
59     pid = fork();
60     if (pid == 0) {
61         dup2(outpipe[1], STDOUT_FILENO); /* Redirect stdout into pipe */
62         close(outpipe[0]);
63         close(outpipe[1]);
64
65         execl("../../src/volser/vos", "vos",
66               "listaddrs", "-config", dirname, "-noauth", NULL);
67     }
68     close(outpipe[1]);
69     buffer = malloc(4096);
70     len = read(outpipe[0], buffer, 4096);
71     waitpid(pid, &status, 0);
72     buffer[len]='\0';
73     is_string(expecting, buffer, "vos output matches");
74     free(buffer);
75 }
76
77 int
78 main(int argc, char **argv)
79 {
80     char *dirname;
81     struct afsconf_dir *dir;
82     struct afsconf_cell info;
83     int code;
84     int i;
85     pid_t serverPid;
86     struct rx_securityClass *secClass;
87     struct rx_connection *serverconns[MAXSERVERS];
88     struct ubik_client *ubikClient = NULL;
89     int secIndex;
90
91     plan(5);
92
93     code = rx_Init(0);
94
95     dirname = afstest_BuildTestConfig();
96
97     dir = afsconf_Open(dirname);
98
99     code = afstest_AddDESKeyFile(dir);
100     if (code) {
101         afs_com_err("vos-t", code, "while adding test DES keyfile");
102         exit(1);
103     }
104
105     code = afstest_StartVLServer(dirname, &serverPid);
106     if (code) {
107         afs_com_err("vos-t", code, "while starting the vlserver");
108         exit(1);
109     }
110
111     /* Let it figure itself out ... */
112     sleep(5);
113
114     code = afsconf_ClientAuthSecure(dir, &secClass, &secIndex);
115     if (code) {
116         afs_com_err("vos-t", code, "while getting a fake token");
117         exit(1);
118     }
119
120     code = afsconf_GetCellInfo(dir, NULL, AFSCONF_VLDBSERVICE, &info);
121     if (code) {
122         afs_com_err("vos-t", code, " while getting addresses from cellservdb");
123         exit(1);
124     }
125     ok(info.numServers < MAXSERVERS, "Number of servers is within range");
126
127     for (i = 0; i < info.numServers; i++)
128         serverconns[i] = rx_NewConnection(info.hostAddr[i].sin_addr.s_addr,
129                                           info.hostAddr[i].sin_port,
130                                           USER_SERVICE_ID,
131                                           secClass, secIndex);
132
133     code = ubik_ClientInit(serverconns, &ubikClient);
134
135     TestListAddrs(ubikClient, dirname);
136
137     code = afstest_StopVLServer(serverPid);
138     is_int(0, code, "Server exited cleanly");
139
140     return 0;
141 }