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