package cmd

import (
 "os"
 "testing"
 "time"

 "github.com/minio/cli"
 xhttp "github.com/minio/minio/internal/http"
)

func TestServerReadHeaderTimeoutConfig(t *testing.T) {
 for _,tc:=range []struct{name,env string;args []string;want time.Duration}{
  {name:"default",want:xhttp.DefaultReadHeaderTimeout},
  {name:"flag",args:[]string{"--read-header-timeout=100ms"},want:100*time.Millisecond},
  {name:"environment",env:"170ms",want:170*time.Millisecond},
  {name:"flag-over-environment",env:"170ms",args:[]string{"--read-header-timeout=80ms"},want:80*time.Millisecond},
  {name:"yaml-retains-flag",args:[]string{"--config=testdata/config/1.yaml","--read-header-timeout=100ms"},want:100*time.Millisecond},
  {name:"zero-fallback",args:[]string{"--read-header-timeout=0s"}},
  {name:"negative-disabled",args:[]string{"--read-header-timeout=-1s"},want:-time.Second},
 }{
  t.Run(tc.name,func(t *testing.T){
   for _,key:=range []string{"MINIO_ARGS","MINIO_VOLUMES","MINIO_ENDPOINTS","MINIO_CONFIG","MINIO_ERASURE_SET_DRIVE_COUNT"}{t.Setenv(key,"")}
   t.Setenv("MINIO_READ_HEADER_TIMEOUT",tc.env)
   if tc.env==""{if err:=os.Unsetenv("MINIO_READ_HEADER_TIMEOUT");err!=nil{t.Fatal(err)}}
   t.Setenv("MINIO_IDLE_TIMEOUT","2s")
   var got serverCtxt
   called:=false
   app:=cli.NewApp()
   app.Commands=[]cli.Command{{Name:"server",Flags:serverCmd.Flags,Action:func(ctx *cli.Context)error{called=true;t.Logf("CLI read-header-timeout=%s, expected=%s",ctx.Duration("read-header-timeout"),tc.want);return buildServerCtxt(ctx,&got)}}}
   args:=append([]string{"silo","server"},tc.args...)
   args=append(args,t.TempDir())
   if err:=app.Run(args);err!=nil{t.Fatal(err)}
   if !called{t.Fatal("server action did not run")}
   if got.ReadHeaderTimeout!=tc.want{t.Errorf("parsed ReadHeaderTimeout = %s, want %s",got.ReadHeaderTimeout,tc.want)}
   if got.IdleTimeout!=2*time.Second{t.Errorf("parsed IdleTimeout = %s, want 2s",got.IdleTimeout)}
  })
 }
}
