// TestHandleRoute test route watch events func TestHandleRoute(t *testing.T) { router := newTestRouter(make(map[string]ServiceUnit)) plugin := newDefaultTemplatePlugin(router) original := util.Time{time.Now()} //add route := &routeapi.Route{ ObjectMeta: kapi.ObjectMeta{ CreationTimestamp: original, Namespace: "foo", Name: "test", }, Host: "www.example.com", ServiceName: "TestService", } serviceUnitKey := fmt.Sprintf("%s/%s", route.Namespace, route.ServiceName) plugin.HandleRoute(watch.Added, route) if !router.Committed { t.Errorf("Expected router to be committed after HandleRoute call") } actualSU, ok := router.FindServiceUnit(serviceUnitKey) if !ok { t.Errorf("TestHandleRoute was unable to find the service unit %s after HandleRoute was called", route.ServiceName) } else { serviceAliasCfg, ok := actualSU.ServiceAliasConfigs[router.routeKey(route)] if !ok { t.Errorf("TestHandleRoute expected route key %s", router.routeKey(route)) } else { if serviceAliasCfg.Host != route.Host || serviceAliasCfg.Path != route.Path { t.Errorf("Expected route did not match service alias config %v : %v", route, serviceAliasCfg) } } } // attempt to add a second route with a newer time, verify it is ignored duplicateRoute := &routeapi.Route{ ObjectMeta: kapi.ObjectMeta{ CreationTimestamp: util.Time{Time: original.Add(time.Hour)}, Namespace: "foo", Name: "dupe", }, Host: "www.example.com", ServiceName: "TestService2", } if err := plugin.HandleRoute(watch.Added, duplicateRoute); err == nil { t.Fatal("unexpected non-error") } if _, ok := router.FindServiceUnit("foo/TestService2"); ok { t.Fatalf("unexpected second unit: %#v", router) } if r, ok := plugin.hostToRoute["www.example.com"]; !ok || r[0].Name != "test" { t.Fatalf("unexpected claimed routes: %#v", r) } // attempt to remove the second route that is not being used, verify it is ignored if err := plugin.HandleRoute(watch.Deleted, duplicateRoute); err == nil { t.Fatal("unexpected non-error") } if _, ok := router.FindServiceUnit("foo/TestService2"); ok { t.Fatalf("unexpected second unit: %#v", router) } if _, ok := router.FindServiceUnit("foo/TestService"); !ok { t.Fatalf("unexpected first unit: %#v", router) } if r, ok := plugin.hostToRoute["www.example.com"]; !ok || r[0].Name != "test" { t.Fatalf("unexpected claimed routes: %#v", r) } // add a second route with an older time, verify it takes effect duplicateRoute.CreationTimestamp = util.Time{Time: original.Add(-time.Hour)} if err := plugin.HandleRoute(watch.Added, duplicateRoute); err != nil { t.Fatal("unexpected error") } otherSU, ok := router.FindServiceUnit("foo/TestService2") if !ok { t.Fatalf("missing second unit: %#v", router) } if len(actualSU.ServiceAliasConfigs) != 0 || len(otherSU.ServiceAliasConfigs) != 1 { t.Errorf("incorrect router state: %#v", router) } if _, ok := actualSU.ServiceAliasConfigs[router.routeKey(route)]; ok { t.Errorf("unexpected service alias config %s", router.routeKey(route)) } //mod route.Host = "www.example2.com" if err := plugin.HandleRoute(watch.Modified, route); err != nil { t.Fatal("unexpected error") } if !router.Committed { t.Errorf("Expected router to be committed after HandleRoute call") } actualSU, ok = router.FindServiceUnit(serviceUnitKey) if !ok { t.Errorf("TestHandleRoute was unable to find the service unit %s after HandleRoute was called", route.ServiceName) } else { serviceAliasCfg, ok := actualSU.ServiceAliasConfigs[router.routeKey(route)] if !ok { t.Errorf("TestHandleRoute expected route key %s", router.routeKey(route)) } else { if serviceAliasCfg.Host != route.Host || serviceAliasCfg.Path != route.Path { t.Errorf("Expected route did not match service alias config %v : %v", route, serviceAliasCfg) } } } if len(plugin.hostToRoute) != 1 { t.Fatalf("did not clear claimed route: %#v", plugin.hostToRoute) } //delete if err := plugin.HandleRoute(watch.Deleted, route); err != nil { t.Fatal("unexpected error") } if !router.Committed { t.Errorf("Expected router to be committed after HandleRoute call") } actualSU, ok = router.FindServiceUnit(serviceUnitKey) if !ok { t.Errorf("TestHandleRoute was unable to find the service unit %s after HandleRoute was called", route.ServiceName) } else { _, ok := actualSU.ServiceAliasConfigs[router.routeKey(route)] if ok { t.Errorf("TestHandleRoute did not expect route key %s", router.routeKey(route)) } } if len(plugin.hostToRoute) != 0 { t.Errorf("did not clear claimed route: %#v", plugin.hostToRoute) } }