diff --git a/test/volume_server/framework/cluster.go b/test/volume_server/framework/cluster.go index c213580b8..b2f4a4e61 100644 --- a/test/volume_server/framework/cluster.go +++ b/test/volume_server/framework/cluster.go @@ -208,6 +208,9 @@ func (c *Cluster) startVolume(dataDir string) error { if c.profile.InflightDownloadTimeout > 0 { args = append(args, "-inflightDownloadDataTimeout="+c.profile.InflightDownloadTimeout.String()) } + if c.profile.FileSizeLimitMB > 0 { + args = append(args, "-fileSizeLimitMB="+strconv.Itoa(c.profile.FileSizeLimitMB)) + } c.volumeCmd = exec.Command(c.volumeBinary, args...) c.volumeCmd.Dir = c.baseDir diff --git a/test/volume_server/http/write_error_variants_test.go b/test/volume_server/http/write_error_variants_test.go index ead11ed6c..ce2dd01d8 100644 --- a/test/volume_server/http/write_error_variants_test.go +++ b/test/volume_server/http/write_error_variants_test.go @@ -1,6 +1,7 @@ package volume_server_http_test import ( + "bytes" "net/http" "strings" "testing" @@ -72,3 +73,32 @@ func TestWriteMalformedMultipartAndMD5Mismatch(t *testing.T) { t.Fatalf("content-md5 mismatch response should mention Content-MD5, got %q", string(md5MismatchBody)) } } + +func TestWriteRejectsPayloadOverFileSizeLimit(t *testing.T) { + if testing.Short() { + t.Skip("skipping integration test in short mode") + } + + profile := matrix.P1() + profile.FileSizeLimitMB = 1 + clusterHarness := framework.StartSingleVolumeCluster(t, profile) + conn, grpcClient := framework.DialVolumeServer(t, clusterHarness.VolumeGRPCAddress()) + defer conn.Close() + + const volumeID = uint32(99) + framework.AllocateVolume(t, grpcClient, volumeID, "") + + client := framework.NewHTTPClient() + fid := framework.NewFileID(volumeID, 772002, 0x2A3B4C5D) + oversizedPayload := bytes.Repeat([]byte("z"), 1024*1024+1) + + oversizedReq := newUploadRequest(t, clusterHarness.VolumeAdminURL()+"/"+fid, oversizedPayload) + oversizedResp := framework.DoRequest(t, client, oversizedReq) + oversizedBody := framework.ReadAllAndClose(t, oversizedResp) + if oversizedResp.StatusCode != http.StatusBadRequest { + t.Fatalf("oversized write expected 400, got %d", oversizedResp.StatusCode) + } + if !strings.Contains(strings.ToLower(string(oversizedBody)), "limited") { + t.Fatalf("oversized write response should mention limit, got %q", string(oversizedBody)) + } +} diff --git a/test/volume_server/matrix/config_profiles.go b/test/volume_server/matrix/config_profiles.go index d72750062..f0c601c38 100644 --- a/test/volume_server/matrix/config_profiles.go +++ b/test/volume_server/matrix/config_profiles.go @@ -19,6 +19,7 @@ type Profile struct { ConcurrentDownloadLimitMB int InflightUploadTimeout time.Duration InflightDownloadTimeout time.Duration + FileSizeLimitMB int ReplicatedLayout bool HasErasureCoding bool