diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-14 14:28:15 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-09-16 11:18:48 -0300 |
| commit | ae310a207534b33b7321dd2b9f423a73b1969159 (patch) | |
| tree | b4c2e85091a4ff6657e0a04ba1b2ef030d588ac8 /test/differential | |
| parent | 5f24c4a2284a0af84fb9d116f7a39f6a58e42ae9 (diff) | |
| download | cloud9-ae310a207534b33b7321dd2b9f423a73b1969159.tar.gz cloud9-ae310a207534b33b7321dd2b9f423a73b1969159.zip | |
Add reusable HTTP transport, serial gateway, and WASM file browser
Diffstat (limited to 'test/differential')
| -rw-r--r-- | test/differential/webfixture/main.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/test/differential/webfixture/main.go b/test/differential/webfixture/main.go new file mode 100644 index 0000000..9d23399 --- /dev/null +++ b/test/differential/webfixture/main.go @@ -0,0 +1,83 @@ +// Local reference filesystem for HTTP/browser tests. No external target. +package main + +import ( + "fmt" + "github.com/knusbaum/go9p" + "github.com/knusbaum/go9p/fs" + "net" + "os" +) + +type fragmented struct{ net.Conn } + +func (f fragmented) Read(p []byte) (int, error) { + if len(p) > 17 { + p = p[:17] + } + return f.Conn.Read(p) +} +func (f fragmented) Write(p []byte) (int, error) { + total := 0 + for len(p) > 0 { + n := len(p) + if n > 31 { + n = 31 + } + written, err := f.Conn.Write(p[:n]) + total += written + p = p[written:] + if err != nil { + return total, err + } + } + return total, nil +} +func check(err error) { + if err != nil { + panic(err) + } +} +func main() { + tree, root := fs.NewFS("user", "user", 0755) + check(root.AddChild(fs.NewStaticFile(tree.NewStat("hello.txt", "user", "user", 0644), []byte("Hello from 9P.\n")))) + check(root.AddChild(fs.NewStaticFile(tree.NewStat("edit.txt", "user", "user", 0644), []byte("Edit me.\n")))) + large := make([]byte, 180000) + for i := range large { + large[i] = byte(i % 251) + } + check(root.AddChild(fs.NewStaticFile(tree.NewStat("large.bin", "user", "user", 0644), large))) + check(root.AddChild(fs.NewStaticFile(tree.NewStat("<literal>.txt", "user", "user", 0644), []byte("Names are text.\n")))) + for _, name := range []string{"app.mjs", "style.css", "client.mjs", "config.json", "cloud9.wasm", "9p", "space #?% ü.txt", "literal%2F.txt", "back\\slash.txt"} { + check(root.AddChild(fs.NewStaticFile(tree.NewStat(name, "user", "user", 0644), []byte("Path: "+name+"\n")))) + } + internal := fs.NewStaticDir(tree.NewStat("_cloud9", "user", "user", 0755)) + check(root.AddChild(internal)) + check(internal.AddChild(fs.NewStaticFile(tree.NewStat("app.mjs", "user", "user", 0644), []byte("Upstream private-looking path.\n")))) + dir := fs.NewStaticDir(tree.NewStat("notes", "user", "user", 0755)) + check(root.AddChild(dir)) + check(dir.AddChild(fs.NewStaticFile(tree.NewStat("café.txt", "user", "user", 0644), []byte("Olá, 世界.\n")))) + for i := 0; i < 150; i++ { + name := fmt.Sprintf("item-%03d.txt", i) + check(dir.AddChild(fs.NewStaticFile(tree.NewStat(name, "user", "user", 0644), nil))) + } + parent := root + for i := 0; i < 18; i++ { + d := fs.NewStaticDir(tree.NewStat("deep", "user", "user", 0755)) + check(parent.AddChild(d)) + parent = d + } + check(parent.AddChild(fs.NewStaticFile(tree.NewStat("end.txt", "user", "user", 0644), []byte("Deep walk.\n")))) + network, address := "tcp", "127.0.0.1:0" + if len(os.Args) == 2 { + network, address = "unix", os.Args[1] + } + listener, err := net.Listen(network, address) + check(err) + fmt.Println(listener.Addr().String()) + for { + conn, err := listener.Accept() + check(err) + go func() { defer conn.Close(); f := fragmented{conn}; _ = go9p.ServeReadWriter(f, f, tree.Server()) }() + } +} |
