test-ifwait.fnl (3286B)
1 (local { : view &as fennel } (require :fennel)) 2 (local anoia (require :anoia)) 3 (import-macros { : expect= } :anoia.assert) 4 5 ;; nix-shell --run "cd pkgs/ifwait && fennelrepl test-ifwait.fnl" 6 7 (var fake-system (fn [s] (print "executing " s))) 8 (tset anoia :system #(fake-system $1)) 9 10 11 (fn event-generator [events] 12 (coroutine.wrap 13 (fn [] 14 (each [_ e (ipairs events)] (coroutine.yield e))))) 15 16 (fn file-events [path] 17 (let [data (with-open [e (io.open path "r")] (e:read "*a")) 18 parse (fennel.parser data)] 19 (icollect [_ ast parse] 20 ast))) 21 22 (set _G.arg (doto [] (tset 0 "test"))) 23 (local ifwait (require :ifwait)) 24 25 (let [gen (event-generator (file-events "events-fixture"))] 26 (ifwait.run ["dummy0" "up"] #gen) 27 (match (pcall gen) 28 (true _) true 29 (false msg) (error "didn't detect dummy0 up event"))) 30 31 (var upsies []) 32 (set fake-system 33 (fn [s] 34 (if (s:match "-u change addmember") 35 (table.insert upsies :u) 36 (s:match "-d change addmember") 37 (table.insert upsies :d)))) 38 39 (fn newlink [name up running] 40 {:event "newlink" 41 :hwaddr "b6:7d:5c:38:89:1d" 42 :index (string.unpack ">i2" name) 43 :mtu 1500 44 : name 45 : running 46 :stamp 857161382 47 : up }) 48 49 "when it gets events that don't match the interface, nothing happens" 50 51 (let [gen (-> [(newlink "eth1" "no" "no")] event-generator)] 52 (set upsies []) 53 (ifwait.run [ "-s" "addmember" "dummy0" "up"] #gen) 54 (expect= upsies [])) 55 56 "when it gets an event that should start the service, the service starts" 57 58 (let [gen (-> 59 [(newlink "dummy0" "no" "no") 60 (newlink "dummy0" "yes" "no") 61 (newlink "eth1" "no" "no")] 62 event-generator)] 63 (set upsies []) 64 (ifwait.run ["-s" "addmember" "dummy0" "up"] #gen) 65 (expect= upsies [:d :u])) 66 67 "when it gets an event that should stop the service, the service stops" 68 69 (let [gen (-> 70 [(newlink "dummy0" "no" "no") 71 (newlink "dummy0" "yes" "no") 72 (newlink "dummy0" "no" "no") 73 ] 74 event-generator)] 75 (set upsies []) 76 (ifwait.run ["-s" "addmember" "dummy0" "up"] #gen) 77 (expect= upsies [:d :u :d])) 78 79 "it does not call s6-rc again if the service is already in required state" 80 81 (let [gen (-> 82 [(newlink "dummy0" "no" "no") 83 (newlink "dummy0" "yes" "no") 84 (newlink "dummy0" "yes" "yes") 85 (newlink "dummy0" "yes" "yes") 86 (newlink "dummy0" "yes" "no") 87 (newlink "dummy0" "no" "no") 88 ] 89 event-generator)] 90 (set upsies []) 91 (ifwait.run ["-s" "addmember" "dummy0" "up"] #gen) 92 (expect= upsies [:d :u :d])) 93 94 "it handles an error return from s6-rc" 95 96 (set fake-system 97 (fn [s] 98 (if (s:match "-u change addmember") 99 (table.insert upsies :u) 100 (s:match "-d change addmember") 101 (table.insert upsies :d)) 102 (error "false") 103 )) 104 105 (let [gen (-> 106 [(newlink "dummy0" "yes" "no") 107 (newlink "dummy0" "yes" "yes") 108 (newlink "dummy0" "yes" "yes") 109 (newlink "dummy0" "yes" "no") 110 (newlink "dummy0" "no" "no") 111 ] 112 event-generator)] 113 (set upsies []) 114 (ifwait.run ["-s" "addmember" "dummy0" "up"] #gen) 115 (expect= upsies [:u :u :u :u])) 116 117 (print "OK")