summaryrefslogtreecommitdiff
path: root/test/differential
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-14 14:28:15 -0300
committerGabriel Schneider <[email protected]>2026-09-16 11:18:48 -0300
commitae310a207534b33b7321dd2b9f423a73b1969159 (patch)
treeb4c2e85091a4ff6657e0a04ba1b2ef030d588ac8 /test/differential
parent5f24c4a2284a0af84fb9d116f7a39f6a58e42ae9 (diff)
downloadcloud9-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.go83
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()) }()
+ }
+}