|
|
@@ -0,0 +1,142 @@
|
|
|
+package watcher
|
|
|
+
|
|
|
+import (
|
|
|
+ "testing"
|
|
|
+
|
|
|
+ v1 "k8s.io/api/core/v1"
|
|
|
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
+)
|
|
|
+
|
|
|
+const (
|
|
|
+ TestConfigMapName = "test-config"
|
|
|
+ AlternateTestConfigMapName = "alternate-test-config"
|
|
|
+ TestDataProperty = "test-prop"
|
|
|
+)
|
|
|
+
|
|
|
+func newTestWatcher(t *testing.T, configMapName string, instanceName string, didRun *bool) *ConfigMapWatcher {
|
|
|
+ return &ConfigMapWatcher{
|
|
|
+ ConfigMapName: configMapName,
|
|
|
+ WatchFunc: func(cmn string, data map[string]string) error {
|
|
|
+ t.Logf("ConfigMapWatcher[%s] triggered for ConfigMap: %s, data[\"test\"] = %s\n", instanceName, cmn, data[TestDataProperty])
|
|
|
+ *didRun = true
|
|
|
+ return nil
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func newConfigMap(configMapName string, dataValue string) *v1.ConfigMap {
|
|
|
+ return &v1.ConfigMap{
|
|
|
+ Data: map[string]string{
|
|
|
+ TestDataProperty: dataValue,
|
|
|
+ },
|
|
|
+ ObjectMeta: metav1.ObjectMeta{
|
|
|
+ Name: configMapName,
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestConfigWatcherSingleHandler(t *testing.T) {
|
|
|
+ // Test that a single watcher added for the configmap test-config is executed when
|
|
|
+ // triggered
|
|
|
+ var didRun bool = false
|
|
|
+
|
|
|
+ w := NewConfigMapWatchers(newTestWatcher(t, TestConfigMapName, "single", &didRun))
|
|
|
+ f := w.ToWatchFunc()
|
|
|
+
|
|
|
+ // Execute watch func with a 'test-config' configmap
|
|
|
+ f(newConfigMap(TestConfigMapName, "testing 1 2 3"))
|
|
|
+
|
|
|
+ if !didRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'single'\n")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestConfigWatcherMultipleHandlers(t *testing.T) {
|
|
|
+ // Test that adding two different configmap watchers aren't both triggered on a configmap update
|
|
|
+ var firstDidRun bool = false
|
|
|
+ var secondDidRun bool = false
|
|
|
+
|
|
|
+ w := NewConfigMapWatchers(
|
|
|
+ newTestWatcher(t, TestConfigMapName, "single", &firstDidRun),
|
|
|
+ newTestWatcher(t, AlternateTestConfigMapName, "alternate", &secondDidRun))
|
|
|
+
|
|
|
+ f := w.ToWatchFunc()
|
|
|
+
|
|
|
+ // Execute watch func with a 'alternate-test-config' configmap
|
|
|
+ f(newConfigMap(AlternateTestConfigMapName, "oof!"))
|
|
|
+
|
|
|
+ // Assert that first did not run
|
|
|
+ if firstDidRun {
|
|
|
+ t.Errorf("Executed alternate-test-config map change, but test-config handler, 'single' executed!\n")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !secondDidRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'alternate'\n")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestConfigWatcherMultipleHandlersForSameConfig(t *testing.T) {
|
|
|
+ // Test that adding two different configmap watchers for the same configmap are both triggered
|
|
|
+ var firstDidRun bool = false
|
|
|
+ var secondDidRun bool = false
|
|
|
+ var thirdDidRun bool = false
|
|
|
+
|
|
|
+ w := NewConfigMapWatchers(
|
|
|
+ newTestWatcher(t, TestConfigMapName, "first", &firstDidRun),
|
|
|
+ newTestWatcher(t, AlternateTestConfigMapName, "alternate", &secondDidRun),
|
|
|
+ // third watcher watches for the same configmap as "first"
|
|
|
+ newTestWatcher(t, TestConfigMapName, "third", &thirdDidRun),
|
|
|
+ )
|
|
|
+
|
|
|
+ f := w.ToWatchFunc()
|
|
|
+
|
|
|
+ // Execute watch func with a 'test-config' configmap
|
|
|
+ f(newConfigMap(TestConfigMapName, "double trouble"))
|
|
|
+
|
|
|
+ // Assert that second did not run
|
|
|
+ if secondDidRun {
|
|
|
+ t.Errorf("Executed test-config map change, first handler, 'single', executed!\n")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !firstDidRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'first'\n")
|
|
|
+ }
|
|
|
+ if !thirdDidRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'third'\n")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestConfigMapWatcherWithAdd(t *testing.T) {
|
|
|
+ // Test that adding two different configmap watchers for the same configmap are both triggered
|
|
|
+ // when using Add() and AddWatcher()
|
|
|
+ var firstDidRun bool = false
|
|
|
+ var secondDidRun bool = false
|
|
|
+ var thirdDidRun bool = false
|
|
|
+
|
|
|
+ a, b, c := newTestWatcher(t, TestConfigMapName, "first", &firstDidRun),
|
|
|
+ newTestWatcher(t, AlternateTestConfigMapName, "alternate", &secondDidRun),
|
|
|
+ // third watcher watches for the same configmap as "first"
|
|
|
+ newTestWatcher(t, TestConfigMapName, "third", &thirdDidRun)
|
|
|
+
|
|
|
+ w := NewConfigMapWatchers()
|
|
|
+ w.AddWatcher(a)
|
|
|
+ w.AddWatcher(b)
|
|
|
+ w.Add(c.ConfigMapName, c.WatchFunc)
|
|
|
+
|
|
|
+ f := w.ToWatchFunc()
|
|
|
+
|
|
|
+ // Execute watch func with a 'test-config' configmap
|
|
|
+ f(newConfigMap(TestConfigMapName, "double trouble"))
|
|
|
+
|
|
|
+ // Assert that second did not run
|
|
|
+ if secondDidRun {
|
|
|
+ t.Errorf("Executed test-config map change, first handler, 'single', executed!\n")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !firstDidRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'first'\n")
|
|
|
+ }
|
|
|
+ if !thirdDidRun {
|
|
|
+ t.Errorf("Failed to run configmap handler for 'third'\n")
|
|
|
+ }
|
|
|
+}
|