]> ruderich.org/simon Gitweb - nsscash/nsscash.git/commitdiff
nsscash: main_test: add special tests
authorSimon Ruderich <simon@ruderich.org>
Wed, 26 Jun 2019 12:13:31 +0000 (14:13 +0200)
committerSimon Ruderich <simon@ruderich.org>
Wed, 26 Jun 2019 14:37:17 +0000 (16:37 +0200)
main_test.go

index 8a1625887e746e4539b5279c16118f95823f8b49..7ccaca93dbff536cccc2968a8494aa3350486bcb 100644 (file)
@@ -200,6 +200,11 @@ func TestMainFetch(t *testing.T) {
                fetchGroup,
                // Special tests
                fetchNoConfig,
+               fetchStateCannotRead,
+               fetchStateInvalid,
+               fetchStateCannotWrite,
+               fetchCannotDeploy,
+               fetchSecondFetchFails,
        }
 
        cleanup := []string{
@@ -603,3 +608,127 @@ func fetchNoConfig(a args) {
 
        mustNotExist(t, configPath, statePath, passwdPath, plainPath, groupPath)
 }
+
+func fetchStateCannotRead(a args) {
+       t := a.t
+       mustWritePasswdConfig(t, a.url)
+
+       mustCreate(t, statePath)
+       err := os.Chmod(statePath, 0000)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       err = mainFetch(configPath)
+       mustBeErrorWithSubstring(t, err,
+               statePath+": permission denied")
+
+       mustNotExist(t, passwdPath, plainPath, groupPath)
+}
+
+func fetchStateInvalid(a args) {
+       t := a.t
+       mustWriteGroupConfig(t, a.url)
+       mustCreate(t, statePath)
+
+       err := mainFetch(configPath)
+       mustBeErrorWithSubstring(t, err,
+               "unexpected end of JSON input")
+
+       mustNotExist(t, groupPath, passwdPath, plainPath)
+       mustBeOld(t, statePath)
+}
+
+func fetchStateCannotWrite(a args) {
+       t := a.t
+       mustWriteGroupConfig(t, a.url)
+       mustCreate(t, groupPath)
+       mustHaveHash(t, groupPath, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
+
+       *a.handler = func(w http.ResponseWriter, r *http.Request) {
+               // To prevent mainFetch() from trying to update groupPath
+               // which will also fail
+               w.WriteHeader(http.StatusNotModified)
+       }
+
+       err := os.Chmod("testdata", 0500)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.Chmod("testdata", 0755)
+
+       err = mainFetch(configPath)
+       mustBeErrorWithSubstring(t, err,
+               "permission denied")
+
+       mustNotExist(t, statePath, passwdPath, plainPath)
+       mustBeOld(t, groupPath)
+}
+
+func fetchCannotDeploy(a args) {
+       t := a.t
+       mustWriteGroupConfig(t, a.url)
+       mustCreate(t, groupPath)
+       mustHaveHash(t, groupPath, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
+
+       *a.handler = func(w http.ResponseWriter, r *http.Request) {
+               if r.URL.Path != "/group" {
+                       return
+               }
+
+               fmt.Fprintln(w, "root:x:0:")
+               fmt.Fprintln(w, "daemon:x:1:andariel,duriel,mephisto,diablo,baal")
+       }
+
+       err := os.Chmod("testdata", 0500)
+       if err != nil {
+               t.Fatal(err)
+       }
+       defer os.Chmod("testdata", 0755)
+
+       err = mainFetch(configPath)
+       mustBeErrorWithSubstring(t, err,
+               "permission denied")
+
+       mustNotExist(t, statePath, passwdPath, plainPath)
+       mustBeOld(t, groupPath)
+}
+
+func fetchSecondFetchFails(a args) {
+       t := a.t
+       mustWriteConfig(t, fmt.Sprintf(`
+statepath = "%[1]s"
+
+[[file]]
+type = "passwd"
+url = "%[2]s/passwd"
+path = "%[3]s"
+
+[[file]]
+type = "group"
+url = "%[2]s/group"
+path = "%[4]s"
+`, statePath, a.url, passwdPath, groupPath))
+       mustCreate(t, passwdPath)
+       mustCreate(t, groupPath)
+       mustHaveHash(t, passwdPath, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
+       mustHaveHash(t, groupPath, "da39a3ee5e6b4b0d3255bfef95601890afd80709")
+
+       *a.handler = func(w http.ResponseWriter, r *http.Request) {
+               if r.URL.Path == "/passwd" {
+                       fmt.Fprintln(w, "root:x:0:0:root:/root:/bin/bash")
+               }
+               if r.URL.Path == "/group" {
+                       w.WriteHeader(http.StatusNotFound)
+               }
+       }
+
+       err := mainFetch(configPath)
+       mustBeErrorWithSubstring(t, err,
+               "status code 404")
+
+       mustNotExist(t, statePath, plainPath)
+       // Even tough passwd was successfully fetched, no files were modified
+       // because the second fetch failed
+       mustBeOld(t, passwdPath, groupPath)
+}