mirror of
https://github.com/hanzoai/s3.git
synced 2026-10-30 14:59:09 +00:00
Kill MinIO; migrate object storage to SeaweedFS, rebranded Hanzo S3.
- module github.com/hanzoai/s3 (all 1920 imports rewritten); seaweedfs/{raft,goexif,go-fuse,cockroachdb-parser} kept as deps
- binary weed -> s3; display brand SeaweedFS -> Hanzo S3 (Server/version/admin); wire identifiers unchanged for S3 compat
- Dockerfile builds s3 (CGO_ENABLED=0, ldflags) -> ghcr.io/hanzoai/s3 via shared CI
- MinIO preserved in git history (prior main)
75 lines
3.1 KiB
Go
75 lines
3.1 KiB
Go
package volume_server_http_test
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/hanzoai/s3/test/volume_server/framework"
|
|
"github.com/hanzoai/s3/test/volume_server/matrix"
|
|
)
|
|
|
|
func TestWriteInvalidVidAndFidReturnBadRequest(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test in short mode")
|
|
}
|
|
|
|
clusterHarness := framework.StartVolumeCluster(t, matrix.P1())
|
|
client := framework.NewHTTPClient()
|
|
|
|
invalidVidReq := newUploadRequest(t, clusterHarness.VolumeAdminURL()+"/invalid,12345678", []byte("x"))
|
|
invalidVidResp := framework.DoRequest(t, client, invalidVidReq)
|
|
_ = framework.ReadAllAndClose(t, invalidVidResp)
|
|
if invalidVidResp.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("write with invalid vid expected 400, got %d", invalidVidResp.StatusCode)
|
|
}
|
|
|
|
invalidFidReq := newUploadRequest(t, clusterHarness.VolumeAdminURL()+"/1,bad", []byte("x"))
|
|
invalidFidResp := framework.DoRequest(t, client, invalidFidReq)
|
|
_ = framework.ReadAllAndClose(t, invalidFidResp)
|
|
if invalidFidResp.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("write with invalid fid expected 400, got %d", invalidFidResp.StatusCode)
|
|
}
|
|
}
|
|
|
|
func TestWriteMalformedMultipartAndMD5Mismatch(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test in short mode")
|
|
}
|
|
|
|
clusterHarness := framework.StartVolumeCluster(t, matrix.P1())
|
|
conn, grpcClient := framework.DialVolumeServer(t, clusterHarness.VolumeGRPCAddress())
|
|
defer conn.Close()
|
|
|
|
const volumeID = uint32(98)
|
|
framework.AllocateVolume(t, grpcClient, volumeID, "")
|
|
|
|
client := framework.NewHTTPClient()
|
|
fid := framework.NewFileID(volumeID, 772001, 0x1A2B3C4D)
|
|
|
|
malformedMultipartReq, err := http.NewRequest(http.MethodPost, clusterHarness.VolumeAdminURL()+"/"+fid, strings.NewReader("not-a-valid-multipart-body"))
|
|
if err != nil {
|
|
t.Fatalf("create malformed multipart request: %v", err)
|
|
}
|
|
malformedMultipartReq.Header.Set("Content-Type", "multipart/form-data")
|
|
malformedMultipartResp := framework.DoRequest(t, client, malformedMultipartReq)
|
|
malformedMultipartBody := framework.ReadAllAndClose(t, malformedMultipartResp)
|
|
if malformedMultipartResp.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("malformed multipart write expected 400, got %d", malformedMultipartResp.StatusCode)
|
|
}
|
|
if !strings.Contains(strings.ToLower(string(malformedMultipartBody)), "boundary") {
|
|
t.Fatalf("malformed multipart response should mention boundary parse failure, got %q", string(malformedMultipartBody))
|
|
}
|
|
|
|
md5MismatchReq := newUploadRequest(t, clusterHarness.VolumeAdminURL()+"/"+fid, []byte("content-md5-mismatch-body"))
|
|
md5MismatchReq.Header.Set("Content-MD5", "AAAAAAAAAAAAAAAAAAAAAA==")
|
|
md5MismatchResp := framework.DoRequest(t, client, md5MismatchReq)
|
|
md5MismatchBody := framework.ReadAllAndClose(t, md5MismatchResp)
|
|
if md5MismatchResp.StatusCode != http.StatusBadRequest {
|
|
t.Fatalf("content-md5 mismatch write expected 400, got %d", md5MismatchResp.StatusCode)
|
|
}
|
|
if !strings.Contains(string(md5MismatchBody), "Content-MD5") {
|
|
t.Fatalf("content-md5 mismatch response should mention Content-MD5, got %q", string(md5MismatchBody))
|
|
}
|
|
}
|