func TestThatReloadCommandExecutesOnFsChanges(t *testing.T) { tmpDir := setup(t) defer os.RemoveAll(tmpDir) // start the utility in background go main() status = sync.GetStatusInstance() if time.Since(status.LastSync).Seconds() < 2 { t.Fatal("sync should not happen immediately" + time.Since(status.LastSync).String()) } if time.Since(status.LastReload).Seconds() > 2 { t.Fatal("LastReload should be current but was " + time.Since(status.LastReload).String()) } if time.Since(status.LastFSChangeDetected).Seconds() > 2 { t.Fatal("LastFSChangeDetected should be current but was " + time.Since(status.LastFSChangeDetected).String()) } // wait for some time to init time.Sleep(500 * time.Millisecond) //modifyFS: create a new directory and file dir, err := ioutil.TempDir(tmpDir, "new-dir-") if err != nil { t.Fatal(err) } f1, err := createFile(t, dir, "new-file-content") if err != nil { t.Fatal(err) } defer os.Remove(f1.Name()) // clean up // use a reload command to change the content of the new file added // so that we later test its content, expecting to find this change reload_cmd := "sed -i.old s/new/reload_cmd/ " + f1.Name() reloadCmd = &reload_cmd // wait for some time to track the changes time.Sleep(1000 * time.Millisecond) // check that reload cmd has been executed if time.Since(status.LastSync).Seconds() > 1 { t.Fatal("sync should have executed earlier than 1.5 but was executed " + time.Since(status.LastSync).String()) } if time.Since(status.LastReload).Seconds() > 1 { t.Fatal("reload should have executed earlier than 1.5s but was executed " + time.Since(status.LastReload).String()) } if time.Since(status.LastFSChangeDetected).Seconds() > 1 { t.Fatal("FS changes should have been detected earlier than 1.5s but was detected " + time.Since(status.LastFSChangeDetected).String()) } c, err := ioutil.ReadFile(f1.Name()) if !strings.HasPrefix(string(c), "reload_cmd-file-content") { t.Fatal("reload cmd did not run correctly. File content was:" + string(c)) } //reset the reload command reload_cmd = "echo reload-cmd not defined" reloadCmd = &reload_cmd }
package ws import ( "encoding/json" "github.com/adobe-apiplatform/api-gateway-config-supervisor/sync" "log" "net/http" ) var status = sync.GetStatusInstance() func healthCheckHandler(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-type", "application/json") status.Status = "OK" json.NewEncoder(w).Encode(status) } // Starts a web server to expose health-check endpoints // the assumption is that as long as the server works, the sync works too // We may add more checks to make sure the sync executed correctly func RunWS(httpAddr string) { log.Println("Starting HTTP on port", httpAddr) http.HandleFunc("/health-check", healthCheckHandler) http.ListenAndServe(httpAddr, nil) }