You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: chunk_cache_on_disk_test.go
    path of file: ./repos/seaweedfs/weed/util/chunk_cache
    
    the code of the file until where you have to start completion: package chunk_cache

import (
	"bytes"
	"fmt"
	"github.com/seaweedfs/seaweedfs/weed/util/mem"
	"math/rand"
	"testing"
)

func TestOnDisk(t *testing.T) {
	tmpDir := t.TempDir()

	totalDiskSizeInKB := int64(32)

	cache := NewTieredChunkCache(2, tmpDir, totalDiskSizeInKB, 1024)

	writeCount := 5
	type test_data struct {
		data   []byte
		fileId string
		size   int
	}
	testData := make([]*test_data, writeCount)
	for i := 0; i < writeCount; i++ {
		buff := make([]byte, 1024)
		rand.Read(buff)
		testData[i] = &test_data{
			data:   buff,
			fileId: fmt.Sprintf("1,%daabbccdd", i+1),
			size:   len(buff),
		}
		cache.SetChunk(testData[i].fileId, testData[i].data)

		// read back right after write
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) != 0 {
			t.Errorf("failed to write to and read from cache: %d", i)
		}
		mem.Free(data)
	}

	for i := 0; i < 2; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) == 0 {
			t.Errorf("old cache should have been purged: %d", i)
		}
		mem.Free(data)
	}

	for i := 2; i < writeCount; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) != 0 {
			t.Errorf("failed to write to and read from cache: %d", i)
		}
		mem.Free(data)
	}

	cache.Shutdown()

	cache = NewTieredChunkCache(2, tmpDir, totalDiskSizeInKB, 1024)

	for i := 0; i < 2; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) == 0 {
			t.Errorf("old cache should have been purged: %d", i)
		}
		mem.Free(data)
	}

	for i := 2; i < writeCount; i++ {
		if i == 4 {
			// FIXME this failed many times on build machines
			/*
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_2.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 8192 bytes disk space for /tmp/c578652251/c2_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 8192 bytes disk space for /tmp/c578652251/c2_2_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_1.dat
				--- FAIL: TestOnDisk (0.19s)
				    chunk_cache_on_disk_test.go:73: failed to write to and read from cache: 4
				FAIL
				FAIL	github.com/seaweedfs/seaweedfs/weed/util/chunk_cache	0.199s
			*/
			continue
		}
		data := mem.Alloc
    
func TestOnDisk(t *testing.T) {
	tmpDir := t.TempDir()

	totalDiskSizeInKB := int64(32)

	cache := NewTieredChunkCache(2, tmpDir, totalDiskSizeInKB, 1024)

	writeCount := 5
	type test_data struct {
		data   []byte
		fileId string
		size   int
	}
	testData := make([]*test_data, writeCount)
	for i := 0; i < writeCount; i++ {
		buff := make([]byte, 1024)
		rand.Read(buff)
		testData[i] = &test_data{
			data:   buff,
			fileId: fmt.Sprintf("1,%daabbccdd", i+1),
			size:   len(buff),
		}
		cache.SetChunk(testData[i].fileId, testData[i].data)

		// read back right after write
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) != 0 {
			t.Errorf("failed to write to and read from cache: %d", i)
		}
		mem.Free(data)
	}

	for i := 0; i < 2; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) == 0 {
			t.Errorf("old cache should have been purged: %d", i)
		}
		mem.Free(data)
	}

	for i := 2; i < writeCount; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) != 0 {
			t.Errorf("failed to write to and read from cache: %d", i)
		}
		mem.Free(data)
	}

	cache.Shutdown()

	cache = NewTieredChunkCache(2, tmpDir, totalDiskSizeInKB, 1024)

	for i := 0; i < 2; i++ {
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) == 0 {
			t.Errorf("old cache should have been purged: %d", i)
		}
		mem.Free(data)
	}

	for i := 2; i < writeCount; i++ {
		if i == 4 {
			// FIXME this failed many times on build machines
			/*
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 4096 bytes disk space for /tmp/c578652251/c1_3_2.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 8192 bytes disk space for /tmp/c578652251/c2_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 8192 bytes disk space for /tmp/c578652251/c2_2_1.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_0.dat
				I0928 06:04:12 10979 volume_create_linux.go:19] Preallocated 2048 bytes disk space for /tmp/c578652251/c0_2_1.dat
				--- FAIL: TestOnDisk (0.19s)
				    chunk_cache_on_disk_test.go:73: failed to write to and read from cache: 4
				FAIL
				FAIL	github.com/seaweedfs/seaweedfs/weed/util/chunk_cache	0.199s
			*/
			continue
		}
		data := mem.Allocate(testData[i].size)
		cache.ReadChunkAt(data, testData[i].fileId, 0)
		if bytes.Compare(data, testData[i].data) != 0 {
			t.Errorf("failed to write to and read from cache: %d", i)
		}
		mem.Free(data)
	}

	cache.Shutdown()

}