(t *testing.T)
| 2962 | } |
| 2963 | |
| 2964 | func TestRequestLimit(t *testing.T) { |
| 2965 | wrapper, fcfg := newDefaultCfgWrapper(t) |
| 2966 | ffs := fcfg.Filesystem() |
| 2967 | |
| 2968 | file := "tmpfile" |
| 2969 | fd, err := ffs.Create(file) |
| 2970 | must(t, err) |
| 2971 | fd.Close() |
| 2972 | waiter, err := wrapper.Modify(func(cfg *config.Configuration) { |
| 2973 | _, i, _ := cfg.Device(device1) |
| 2974 | cfg.Devices[i].MaxRequestKiB = 1 |
| 2975 | }) |
| 2976 | must(t, err) |
| 2977 | waiter.Wait() |
| 2978 | m, conn := setupModelWithConnectionFromWrapper(t, wrapper) |
| 2979 | defer cleanupModel(m) |
| 2980 | m.ScanFolder("default") |
| 2981 | |
| 2982 | befReq := time.Now() |
| 2983 | first, err := m.Request(conn, &protocol.Request{Folder: "default", Name: file, Size: 2000}) |
| 2984 | if err != nil { |
| 2985 | t.Fatalf("First request failed: %v", err) |
| 2986 | } |
| 2987 | reqDur := time.Since(befReq) |
| 2988 | returned := make(chan struct{}) |
| 2989 | go func() { |
| 2990 | second, err := m.Request(conn, &protocol.Request{Folder: "default", Name: file, Size: 2000}) |
| 2991 | if err != nil { |
| 2992 | t.Errorf("Second request failed: %v", err) |
| 2993 | } |
| 2994 | close(returned) |
| 2995 | second.Close() |
| 2996 | }() |
| 2997 | time.Sleep(10 * reqDur) |
| 2998 | select { |
| 2999 | case <-returned: |
| 3000 | t.Fatalf("Second request returned before first was done") |
| 3001 | default: |
| 3002 | } |
| 3003 | first.Close() |
| 3004 | select { |
| 3005 | case <-returned: |
| 3006 | case <-time.After(time.Second): |
| 3007 | t.Fatalf("Second request did not return after first was done") |
| 3008 | } |
| 3009 | } |
| 3010 | |
| 3011 | // TestConnCloseOnRestart checks that there is no deadlock when calling Close |
| 3012 | // on a protocol connection that has a blocking reader (blocking writer can't |
nothing calls this directly
no test coverage detected