...

Source file src/github.com/cybertec-postgresql/pgwatch/v3/internal/reaper/cache_test.go

Documentation: github.com/cybertec-postgresql/pgwatch/v3/internal/reaper

     1  package reaper
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/cybertec-postgresql/pgwatch/v3/internal/metrics"
     8  	"github.com/stretchr/testify/assert"
     9  )
    10  
    11  func TestInstanceMetricCache_PutAndGet(t *testing.T) {
    12  	cache := NewInstanceMetricCache()
    13  
    14  	// Define test data
    15  	key := "test_key"
    16  	data := metrics.Measurements{metrics.Measurement{"test_key": 42}}
    17  
    18  	// Test Put
    19  	cache.Put(key, data)
    20  	data.Touch() // Update the epoch time
    21  
    22  	// Test Get with valid key and age
    23  	retrievedData := cache.Get(key, time.Second)
    24  	assert.NotNil(t, retrievedData, "Expected data to be retrieved")
    25  	assert.LessOrEqual(t, data.GetEpoch()-retrievedData.GetEpoch(), int64(time.Second), "Epoch times should be close")
    26  
    27  	// Test Get with invalid key
    28  	invalidKey := "invalid_key"
    29  	retrievedData = cache.Get(invalidKey, time.Second)
    30  	assert.Nil(t, retrievedData, "Expected nil for invalid key")
    31  
    32  	// Test Get with expired age
    33  	retrievedData = cache.Get(key, -time.Second) // Negative age to simulate expiration
    34  	assert.Nil(t, retrievedData, "Expected nil for expired data")
    35  
    36  	// Test Get with empty key
    37  	retrievedData = cache.Get("", time.Second)
    38  	assert.Nil(t, retrievedData, "Expected nil for empty key")
    39  }
    40  
    41  func TestInstanceMetricCache_PutEmptyData(t *testing.T) {
    42  	cache := NewInstanceMetricCache()
    43  
    44  	// Test Put with empty data
    45  	cache.Put("test_key", metrics.Measurements{})
    46  	retrievedData := cache.Get("test_key", time.Second)
    47  	assert.Nil(t, retrievedData, "Expected nil for empty data")
    48  
    49  	data := metrics.Measurements{metrics.Measurement{}}
    50  	// Test Put with empty key
    51  	cache.Put("", data)
    52  	retrievedData = cache.Get("", time.Second)
    53  	assert.Nil(t, retrievedData, "Expected nil for empty key")
    54  }
    55  
    56  func TestInstanceMetricCache_Concurrency(t *testing.T) {
    57  	cache := NewInstanceMetricCache()
    58  
    59  	// Define test data
    60  	key := "test_key"
    61  	data := metrics.Measurements{metrics.Measurement{}}
    62  	data.Touch()
    63  
    64  	// Use goroutines to test concurrent access
    65  	done := make(chan bool)
    66  	go func() {
    67  		cache.Put(key, data)
    68  		done <- true
    69  	}()
    70  	go func() {
    71  		_ = cache.Get(key, time.Second)
    72  		done <- true
    73  	}()
    74  
    75  	// Wait for goroutines to finish
    76  	<-done
    77  	<-done
    78  
    79  	// Verify data is still accessible
    80  	retrievedData := cache.Get(key, time.Second)
    81  	assert.NotNil(t, retrievedData, "Expected data to be retrieved after concurrent access")
    82  }
    83