mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-27 03:55:36 +00:00
50fb8b9123
Instead of modeling remote WebDAV servers as actual webdav.FS instances, we now just proxy traffic to them. This not only simplifies the code, but it also allows WebDAV locking to work correctly by making sure locks are handled by the servers that need to (i.e. the ones actually serving the files). Updates tailscale/corp#16827 Signed-off-by: Percy Wegmann <percy@tailscale.com>
76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
package compositedav
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
"time"
|
|
|
|
"tailscale.com/tstest"
|
|
)
|
|
|
|
var (
|
|
val = []byte("1")
|
|
file = "file"
|
|
)
|
|
|
|
func TestStatCacheNoTimeout(t *testing.T) {
|
|
// Make sure we don't leak goroutines
|
|
tstest.ResourceCheck(t)
|
|
|
|
c := &StatCache{TTL: 5 * time.Second}
|
|
defer c.stop()
|
|
|
|
// check get before set
|
|
fetched := c.get(file, 1)
|
|
if fetched != nil {
|
|
t.Errorf("got %q, want nil", fetched)
|
|
}
|
|
|
|
// set new stat
|
|
c.set(file, 1, val)
|
|
fetched = c.get(file, 1)
|
|
if !bytes.Equal(fetched, val) {
|
|
t.Errorf("got %q, want %q", fetched, val)
|
|
}
|
|
|
|
// fetch stat again, should still be cached
|
|
fetched = c.get(file, 1)
|
|
if !bytes.Equal(fetched, val) {
|
|
t.Errorf("got %q, want %q", fetched, val)
|
|
}
|
|
}
|
|
|
|
func TestStatCacheTimeout(t *testing.T) {
|
|
// Make sure we don't leak goroutines
|
|
tstest.ResourceCheck(t)
|
|
|
|
c := &StatCache{TTL: 250 * time.Millisecond}
|
|
defer c.stop()
|
|
|
|
// set new stat
|
|
c.set(file, 1, val)
|
|
fetched := c.get(file, 1)
|
|
if !bytes.Equal(fetched, val) {
|
|
t.Errorf("got %q, want %q", fetched, val)
|
|
}
|
|
|
|
// wait for cache to expire and refetch stat, should be empty now
|
|
time.Sleep(c.TTL * 2)
|
|
|
|
fetched = c.get(file, 1)
|
|
if fetched != nil {
|
|
t.Errorf("invalidate should have cleared cached value")
|
|
}
|
|
|
|
c.set(file, 1, val)
|
|
// invalidate the cache and make sure nothing is returned
|
|
c.invalidate()
|
|
fetched = c.get(file, 1)
|
|
if fetched != nil {
|
|
t.Errorf("invalidate should have cleared cached value")
|
|
}
|
|
}
|