| // Copyright 2011 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package multipart | |
| import ( | |
| "bytes" | |
| "io" | |
| "os" | |
| "regexp" | |
| "testing" | |
| ) | |
| func TestReadForm(t *testing.T) { | |
| testBody := regexp.MustCompile("\n").ReplaceAllString(message, "\r\n") | |
| b := bytes.NewBufferString(testBody) | |
| r := NewReader(b, boundary) | |
| f, err := r.ReadForm(25) | |
| if err != nil { | |
| t.Fatal("ReadForm:", err) | |
| } | |
| defer f.RemoveAll() | |
| if g, e := f.Value["texta"][0], textaValue; g != e { | |
| t.Errorf("texta value = %q, want %q", g, e) | |
| } | |
| if g, e := f.Value["textb"][0], textbValue; g != e { | |
| t.Errorf("texta value = %q, want %q", g, e) | |
| } | |
| fd := testFile(t, f.File["filea"][0], "filea.txt", fileaContents) | |
| if _, ok := fd.(*os.File); ok { | |
| t.Error("file is *os.File, should not be") | |
| } | |
| fd = testFile(t, f.File["fileb"][0], "fileb.txt", filebContents) | |
| if _, ok := fd.(*os.File); !ok { | |
| t.Errorf("file has unexpected underlying type %T", fd) | |
| } | |
| } | |
| func testFile(t *testing.T, fh *FileHeader, efn, econtent string) File { | |
| if fh.Filename != efn { | |
| t.Errorf("filename = %q, want %q", fh.Filename, efn) | |
| } | |
| f, err := fh.Open() | |
| if err != nil { | |
| t.Fatal("opening file:", err) | |
| } | |
| b := new(bytes.Buffer) | |
| _, err = io.Copy(b, f) | |
| if err != nil { | |
| t.Fatal("copying contents:", err) | |
| } | |
| if g := b.String(); g != econtent { | |
| t.Errorf("contents = %q, want %q", g, econtent) | |
| } | |
| return f | |
| } | |
| const ( | |
| fileaContents = "This is a test file." | |
| filebContents = "Another test file." | |
| textaValue = "foo" | |
| textbValue = "bar" | |
| boundary = `MyBoundary` | |
| ) | |
| const message = ` | |
| --MyBoundary | |
| Content-Disposition: form-data; name="filea"; filename="filea.txt" | |
| Content-Type: text/plain | |
| ` + fileaContents + ` | |
| --MyBoundary | |
| Content-Disposition: form-data; name="fileb"; filename="fileb.txt" | |
| Content-Type: text/plain | |
| ` + filebContents + ` | |
| --MyBoundary | |
| Content-Disposition: form-data; name="texta" | |
| ` + textaValue + ` | |
| --MyBoundary | |
| Content-Disposition: form-data; name="textb" | |
| ` + textbValue + ` | |
| --MyBoundary-- | |
| ` |