| 1 | package commands |
| 2 | |
| 3 | import ( |
| 4 | "strings" |
| 5 | "testing" |
| 6 | |
| 7 | cmds "github.com/ipfs/go-ipfs-cmds" |
| 8 | ) |
| 9 | |
| 10 | func collectPaths(prefix string, cmd *cmds.Command, out map[string]struct{}) { |
| 11 | for name, sub := range cmd.Subcommands { |
| 12 | path := prefix + "/" + name |
| 13 | out[path] = struct{}{} |
| 14 | collectPaths(path, sub, out) |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | func TestCommands(t *testing.T) { |
| 19 | list := []string{ |
| 20 | "/add", |
| 21 | "/bitswap", |
| 22 | "/bitswap/ledger", |
| 23 | "/bitswap/reprovide", |
| 24 | "/bitswap/stat", |
| 25 | "/bitswap/wantlist", |
| 26 | "/block", |
| 27 | "/block/get", |
| 28 | "/block/put", |
| 29 | "/block/rm", |
| 30 | "/block/stat", |
| 31 | "/bootstrap", |
| 32 | "/bootstrap/add", |
| 33 | "/bootstrap/list", |
| 34 | "/bootstrap/rm", |
| 35 | "/bootstrap/rm/all", |
| 36 | "/cat", |
| 37 | "/cid", |
| 38 | "/cid/base32", |
| 39 | "/cid/bases", |
| 40 | "/cid/codecs", |
| 41 | "/cid/format", |
| 42 | "/cid/hashes", |
| 43 | "/cid/inspect", |
| 44 | "/commands", |
| 45 | "/commands/completion", |
| 46 | "/commands/completion/bash", |
| 47 | "/commands/completion/fish", |
| 48 | "/commands/completion/zsh", |
| 49 | "/config", |
| 50 | "/config/edit", |
| 51 | "/config/profile", |
| 52 | "/config/profile/apply", |
| 53 | "/config/replace", |
| 54 | "/config/show", |
| 55 | "/dag", |
| 56 | "/dag/export", |
| 57 | "/dag/get", |
| 58 | "/dag/import", |
| 59 | "/dag/put", |
| 60 | "/dag/resolve", |
| 61 | "/dag/stat", |
| 62 | "/dht", |
| 63 | "/dht/query", |
| 64 | "/dht/findprovs", |
| 65 | "/dht/findpeer", |
| 66 | "/dht/get", |
| 67 | "/dht/provide", |
| 68 | "/dht/put", |
| 69 | "/routing", |
| 70 | "/routing/put", |
| 71 | "/routing/get", |
| 72 | "/routing/findpeer", |
| 73 | "/routing/findprovs", |
| 74 | "/routing/provide", |
| 75 | "/routing/reprovide", |
| 76 | "/diag", |
| 77 | "/diag/cmds", |
| 78 | "/diag/cmds/clear", |
| 79 | "/diag/cmds/set-time", |
| 80 | "/diag/datastore", |
| 81 | "/diag/datastore/count", |
| 82 | "/diag/datastore/get", |
| 83 | "/diag/datastore/put", |
| 84 | "/diag/healthy", |
| 85 | "/diag/profile", |
| 86 | "/diag/sys", |
| 87 | "/files", |
| 88 | "/files/chcid", |
| 89 | "/files/cp", |
| 90 | "/files/flush", |
| 91 | "/files/ls", |
| 92 | "/files/mkdir", |
| 93 | "/files/mv", |
| 94 | "/files/read", |
| 95 | "/files/rm", |
| 96 | "/files/stat", |
| 97 | "/files/write", |
| 98 | "/files/chmod", |
| 99 | "/files/chroot", |
| 100 | "/files/touch", |
| 101 | "/filestore", |
| 102 | "/filestore/dups", |
| 103 | "/filestore/ls", |
| 104 | "/filestore/verify", |
| 105 | "/get", |
| 106 | "/id", |
| 107 | "/key", |
| 108 | "/key/export", |
| 109 | "/key/gen", |
| 110 | "/key/import", |
| 111 | "/key/list", |
| 112 | "/key/ls", |
| 113 | "/key/rename", |
| 114 | "/key/rm", |
| 115 | "/key/rotate", |
| 116 | "/key/sign", |
| 117 | "/key/verify", |
| 118 | "/log", |
| 119 | "/log/level", |
| 120 | "/log/ls", |
| 121 | "/log/tail", |
| 122 | "/ls", |
| 123 | "/mount", |
| 124 | "/multibase", |
| 125 | "/multibase/decode", |
| 126 | "/multibase/encode", |
| 127 | "/multibase/transcode", |
| 128 | "/multibase/list", |
| 129 | "/name", |
| 130 | "/name/get", |
| 131 | "/name/inspect", |
| 132 | "/name/publish", |
| 133 | "/name/pubsub", |
| 134 | "/name/pubsub/cancel", |
| 135 | "/name/pubsub/state", |
| 136 | "/name/pubsub/subs", |
| 137 | "/name/put", |
| 138 | "/name/resolve", |
| 139 | "/object", |
| 140 | "/object/data", |
| 141 | "/object/diff", |
| 142 | "/object/get", |
| 143 | "/object/links", |
| 144 | "/object/new", |
| 145 | "/object/patch", |
| 146 | "/object/patch/add-link", |
| 147 | "/object/patch/append-data", |
| 148 | "/object/patch/rm-link", |
| 149 | "/object/patch/set-data", |
| 150 | "/object/put", |
| 151 | "/object/stat", |
| 152 | "/p2p", |
| 153 | "/p2p/close", |
| 154 | "/p2p/forward", |
| 155 | "/p2p/listen", |
| 156 | "/p2p/ls", |
| 157 | "/p2p/stream", |
| 158 | "/p2p/stream/close", |
| 159 | "/p2p/stream/ls", |
| 160 | "/pin", |
| 161 | "/pin/add", |
| 162 | "/pin/ls", |
| 163 | "/pin/remote", |
| 164 | "/pin/remote/add", |
| 165 | "/pin/remote/ls", |
| 166 | "/pin/remote/rm", |
| 167 | "/pin/remote/service", |
| 168 | "/pin/remote/service/add", |
| 169 | "/pin/remote/service/ls", |
| 170 | "/pin/remote/service/rm", |
| 171 | "/pin/rm", |
| 172 | "/pin/update", |
| 173 | "/pin/verify", |
| 174 | "/ping", |
| 175 | "/provide", |
| 176 | "/provide/clear", |
| 177 | "/provide/once", |
| 178 | "/provide/stat", |
| 179 | "/pubsub", |
| 180 | "/pubsub/ls", |
| 181 | "/pubsub/peers", |
| 182 | "/pubsub/pub", |
| 183 | "/pubsub/reset", |
| 184 | "/pubsub/sub", |
| 185 | "/refs", |
| 186 | "/refs/local", |
| 187 | "/repo", |
| 188 | "/repo/gc", |
| 189 | "/repo/migrate", |
| 190 | "/repo/stat", |
| 191 | "/repo/verify", |
| 192 | "/repo/version", |
| 193 | "/repo/ls", |
| 194 | "/resolve", |
| 195 | "/shutdown", |
| 196 | "/stats", |
| 197 | "/stats/bitswap", |
| 198 | "/stats/bw", |
| 199 | "/stats/dht", |
| 200 | "/stats/provide", |
| 201 | "/stats/reprovide", |
| 202 | "/stats/repo", |
| 203 | "/swarm", |
| 204 | "/swarm/addrs", |
| 205 | "/swarm/addrs/autonat", |
| 206 | "/swarm/addrs/listen", |
| 207 | "/swarm/addrs/local", |
| 208 | "/swarm/connect", |
| 209 | "/swarm/disconnect", |
| 210 | "/swarm/filters", |
| 211 | "/swarm/filters/add", |
| 212 | "/swarm/filters/rm", |
| 213 | "/swarm/peers", |
| 214 | "/swarm/peering", |
| 215 | "/swarm/peering/add", |
| 216 | "/swarm/peering/ls", |
| 217 | "/swarm/peering/rm", |
| 218 | "/swarm/resources", |
| 219 | "/update", |
| 220 | "/update/check", |
| 221 | "/update/clean", |
| 222 | "/update/install", |
| 223 | "/update/revert", |
| 224 | "/update/versions", |
| 225 | "/version", |
| 226 | "/version/check", |
| 227 | "/version/deps", |
| 228 | } |
| 229 | |
| 230 | cmdSet := make(map[string]struct{}) |
| 231 | collectPaths("", Root, cmdSet) |
| 232 | |
| 233 | for _, path := range list { |
| 234 | if _, ok := cmdSet[path]; !ok { |
| 235 | t.Errorf("%q not in result", path) |
| 236 | } else { |
| 237 | delete(cmdSet, path) |
| 238 | } |
| 239 | } |
| 240 | |
| 241 | for path := range cmdSet { |
| 242 | t.Errorf("%q in result but shouldn't be", path) |
| 243 | } |
| 244 | |
| 245 | for _, path := range list { |
| 246 | path = path[1:] // remove leading slash |
| 247 | split := strings.Split(path, "/") |
| 248 | sub, err := Root.Get(split) |
| 249 | if err != nil { |
| 250 | t.Errorf("error getting subcommand %q: %v", path, err) |
| 251 | } else if sub == nil { |
| 252 | t.Errorf("subcommand %q is nil even though there was no error", path) |
| 253 | } |
| 254 | } |
| 255 | } |