package mimeparse import ( "fmt" "strings" "sync" "testing" ) // TestTenantScoping_ConcurrentParsesNeverMixContent ist die geforderte // Pflichtprüfung (ING-10, Akzeptanzkriterium 2): Tenant-Scoping für den // MIME-Ingestion-Pfad. mimeparse hält keinerlei Mandanten-Bezug oder // Datenbankzugriff (reine Parsing-Funktion auf einem übergebenen // io.Reader) — Tenant-Scoping bedeutet hier konkret: KEIN // paketweiter, mandantenübergreifend geteilter veränderlicher Zustand, // der bei gleichzeitigem Parsen mehrerer Mandanten-Nachrichten zu einer // Vermischung führen könnte. Viele "Mandanten"-Nachrichten werden // parallel geparst; jedes Ergebnis darf ausschließlich seinen eigenen // Inhalt enthalten. func TestTenantScoping_ConcurrentParsesNeverMixContent(t *testing.T) { const tenants = 50 var wg sync.WaitGroup errs := make(chan error, tenants) for i := 0; i < tenants; i++ { wg.Add(1) go func(n int) { defer wg.Done() marker := fmt.Sprintf("Mandant-%02d-Geheiminhalt", n) raw := "Content-Type: text/plain; charset=utf-8\r\n\r\n" + marker msg, err := Parse(strings.NewReader(raw), 1<<20) if err != nil { errs <- fmt.Errorf("mandant %d: parse fehlgeschlagen: %w", n, err) return } if len(msg.Parts) != 1 { errs <- fmt.Errorf("mandant %d: erwartete 1 teil, habe %d", n, len(msg.Parts)) return } content := string(msg.Parts[0].Content) if !strings.Contains(content, marker) { errs <- fmt.Errorf("mandant %d: eigener inhalt fehlt: %q", n, content) return } for j := 0; j < tenants; j++ { if j == n { continue } fremderMarker := fmt.Sprintf("Mandant-%02d-Geheiminhalt", j) if strings.Contains(content, fremderMarker) { errs <- fmt.Errorf("mandant %d: fremder inhalt gefunden (mandant %d): %q", n, j, content) return } } }(i) } wg.Wait() close(errs) for err := range errs { t.Error(err) } }