mirror of
https://github.com/stakater/Reloader.git
synced 2026-08-21 13:06:34 +00:00
237 lines
5.0 KiB
Go
237 lines
5.0 KiB
Go
package reload
|
|
|
|
import (
|
|
"testing"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
)
|
|
|
|
func TestHasher_HashConfigMap(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
tests := []struct {
|
|
name string
|
|
cm *corev1.ConfigMap
|
|
wantHash string
|
|
}{
|
|
{
|
|
name: "empty configmap",
|
|
cm: &corev1.ConfigMap{
|
|
Data: nil,
|
|
BinaryData: nil,
|
|
},
|
|
// Empty configmap gets a valid hash (hash of empty data)
|
|
wantHash: hasher.HashConfigMap(&corev1.ConfigMap{}),
|
|
},
|
|
{
|
|
name: "configmap with data",
|
|
cm: &corev1.ConfigMap{
|
|
Data: map[string]string{
|
|
"key1": "value1",
|
|
"key2": "value2",
|
|
},
|
|
},
|
|
// Hash should be deterministic
|
|
wantHash: hasher.HashConfigMap(&corev1.ConfigMap{
|
|
Data: map[string]string{
|
|
"key1": "value1",
|
|
"key2": "value2",
|
|
},
|
|
}),
|
|
},
|
|
{
|
|
name: "configmap with binary data",
|
|
cm: &corev1.ConfigMap{
|
|
BinaryData: map[string][]byte{
|
|
"binary1": []byte("binaryvalue1"),
|
|
},
|
|
},
|
|
wantHash: hasher.HashConfigMap(&corev1.ConfigMap{
|
|
BinaryData: map[string][]byte{
|
|
"binary1": []byte("binaryvalue1"),
|
|
},
|
|
}),
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := hasher.HashConfigMap(tt.cm)
|
|
if got != tt.wantHash {
|
|
t.Errorf("HashConfigMap() = %v, want %v", got, tt.wantHash)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestHasher_HashConfigMap_Deterministic(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
cm := &corev1.ConfigMap{
|
|
Data: map[string]string{
|
|
"z-key": "value-z",
|
|
"a-key": "value-a",
|
|
"m-key": "value-m",
|
|
},
|
|
}
|
|
|
|
// Hash should be the same regardless of iteration order
|
|
hash1 := hasher.HashConfigMap(cm)
|
|
hash2 := hasher.HashConfigMap(cm)
|
|
hash3 := hasher.HashConfigMap(cm)
|
|
|
|
if hash1 != hash2 || hash2 != hash3 {
|
|
t.Errorf("Hash is not deterministic: %s, %s, %s", hash1, hash2, hash3)
|
|
}
|
|
}
|
|
|
|
func TestHasher_HashConfigMap_DifferentValues(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
cm1 := &corev1.ConfigMap{
|
|
Data: map[string]string{
|
|
"key": "value1",
|
|
},
|
|
}
|
|
|
|
cm2 := &corev1.ConfigMap{
|
|
Data: map[string]string{
|
|
"key": "value2",
|
|
},
|
|
}
|
|
|
|
hash1 := hasher.HashConfigMap(cm1)
|
|
hash2 := hasher.HashConfigMap(cm2)
|
|
|
|
if hash1 == hash2 {
|
|
t.Errorf("Different values should produce different hashes")
|
|
}
|
|
}
|
|
|
|
func TestHasher_HashSecret(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
tests := []struct {
|
|
name string
|
|
secret *corev1.Secret
|
|
wantHash string
|
|
}{
|
|
{
|
|
name: "empty secret",
|
|
secret: &corev1.Secret{
|
|
Data: nil,
|
|
},
|
|
// Empty secret gets a valid hash (hash of empty data)
|
|
wantHash: hasher.HashSecret(&corev1.Secret{}),
|
|
},
|
|
{
|
|
name: "secret with data",
|
|
secret: &corev1.Secret{
|
|
Data: map[string][]byte{
|
|
"key1": []byte("value1"),
|
|
"key2": []byte("value2"),
|
|
},
|
|
},
|
|
wantHash: hasher.HashSecret(&corev1.Secret{
|
|
Data: map[string][]byte{
|
|
"key1": []byte("value1"),
|
|
"key2": []byte("value2"),
|
|
},
|
|
}),
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := hasher.HashSecret(tt.secret)
|
|
if got != tt.wantHash {
|
|
t.Errorf("HashSecret() = %v, want %v", got, tt.wantHash)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestHasher_HashSecret_Deterministic(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
secret := &corev1.Secret{
|
|
Data: map[string][]byte{
|
|
"z-key": []byte("value-z"),
|
|
"a-key": []byte("value-a"),
|
|
"m-key": []byte("value-m"),
|
|
},
|
|
}
|
|
|
|
// Hash should be the same regardless of iteration order
|
|
hash1 := hasher.HashSecret(secret)
|
|
hash2 := hasher.HashSecret(secret)
|
|
hash3 := hasher.HashSecret(secret)
|
|
|
|
if hash1 != hash2 || hash2 != hash3 {
|
|
t.Errorf("Hash is not deterministic: %s, %s, %s", hash1, hash2, hash3)
|
|
}
|
|
}
|
|
|
|
func TestHasher_HashSecret_DifferentValues(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
secret1 := &corev1.Secret{
|
|
Data: map[string][]byte{
|
|
"key": []byte("value1"),
|
|
},
|
|
}
|
|
|
|
secret2 := &corev1.Secret{
|
|
Data: map[string][]byte{
|
|
"key": []byte("value2"),
|
|
},
|
|
}
|
|
|
|
hash1 := hasher.HashSecret(secret1)
|
|
hash2 := hasher.HashSecret(secret2)
|
|
|
|
if hash1 == hash2 {
|
|
t.Errorf("Different values should produce different hashes")
|
|
}
|
|
}
|
|
|
|
func TestHasher_EmptyHash(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
// EmptyHash returns empty string to signal deletion
|
|
emptyHash := hasher.EmptyHash()
|
|
if emptyHash != "" {
|
|
t.Errorf("EmptyHash should be empty string, got %s", emptyHash)
|
|
}
|
|
|
|
// Empty ConfigMap should have a valid hash (not empty)
|
|
cm := &corev1.ConfigMap{}
|
|
cmHash := hasher.HashConfigMap(cm)
|
|
if cmHash == "" {
|
|
t.Error("Empty ConfigMap should have a non-empty hash")
|
|
}
|
|
|
|
// Empty Secret should have a valid hash (not empty)
|
|
secret := &corev1.Secret{}
|
|
secretHash := hasher.HashSecret(secret)
|
|
if secretHash == "" {
|
|
t.Error("Empty Secret should have a non-empty hash")
|
|
}
|
|
}
|
|
|
|
func TestHasher_NilInput(t *testing.T) {
|
|
hasher := NewHasher()
|
|
|
|
// Test nil ConfigMap - returns hash of empty content (not EmptyHash)
|
|
cmHash := hasher.HashConfigMap(nil)
|
|
if cmHash == "" {
|
|
t.Error("nil ConfigMap should return a valid hash")
|
|
}
|
|
|
|
// Test nil Secret - returns hash of empty content (not EmptyHash)
|
|
secretHash := hasher.HashSecret(nil)
|
|
if secretHash == "" {
|
|
t.Error("nil Secret should return a valid hash")
|
|
}
|
|
}
|