blob: e648ee3f7724413e647caed5da32e79e1b6b079d [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package node
import (
"testing"
"time"
)
func TestDcacheBasic(t *testing.T) {
fileBackedFAT, metadata := setupFAT32(t, "1G", false)
metadata.Init()
// Allocate a single cluster (use it as an ID in the dcache) for a fake directory we'll call
// "foo".
fooID, err := metadata.ClusterMgr.ClusterExtend(0)
if err != nil {
t.Fatal(err)
}
// This initializes the in-memory directory for "foo"
d, err := metadata.Dcache.CreateOrAcquire(metadata, fooID, time.Now()) // Refs: 1
if err != nil {
t.Fatal(err)
}
metadata.Dcache.Acquire(fooID) // Refs: 2
metadata.Dcache.Release(fooID) // Refs: 1
d2, err := metadata.Dcache.CreateOrAcquire(metadata, fooID, time.Now()) // Refs: 2
if err != nil {
t.Fatal(err)
} else if d != d2 {
t.Fatal("Created new directory node when one should have been available in the dcache")
}
metadata.Dcache.Release(fooID) // Refs: 1
// Once we release the number of references of "foo" to zero, it is no longer in the dcache...
metadata.Dcache.Release(fooID) // Refs: 0
// ... Therefore, a call to "CreateOrAcquire" should create a new DirectoryNode
d2, err = metadata.Dcache.CreateOrAcquire(metadata, fooID, time.Now()) // Refs: 1
if err != nil {
t.Fatal(err)
} else if d == d2 {
t.Fatal("Should have created new directory in dcache, but did not")
}
metadata.Dcache.Release(fooID) // Refs: 0
metadata.Dcache.Insert(fooID, d) // Refs: 1 (only allowed since old version of d has been removed from cache)
if len(metadata.Dcache.AllEntries()) != 1 {
t.Fatal("Unexpected number of entries in dcache")
}
metadata.Dcache.Release(fooID) // Refs: 0
if len(metadata.Dcache.AllEntries()) != 0 {
t.Fatal("Unexpected number of entries in dcache")
}
cleanup(fileBackedFAT, metadata)
}