github.com/simpleiot/simpleiot@v0.18.3/client/sync_test.go (about) 1 package client_test 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/simpleiot/simpleiot/client" 9 "github.com/simpleiot/simpleiot/data" 10 "github.com/simpleiot/simpleiot/server" 11 ) 12 13 func TestSync(t *testing.T) { 14 // Start up a SIOT test servers for this test 15 ncU, _, stopU, err := server.TestServer("2") 16 17 if err != nil { 18 t.Fatal("Error starting upstream test server: ", err) 19 } 20 21 defer stopU() 22 23 ncD, rootD, stopD, err := server.TestServer() 24 25 if err != nil { 26 t.Fatal("Error starting upstream test server: ", err) 27 } 28 29 defer stopD() 30 31 fmt.Println("**** create sync node") 32 sync := client.Sync{ 33 ID: "sync-id", 34 Parent: rootD.ID, 35 Description: "sync to up", 36 URI: server.TestServerOptions2.NatsServer, 37 } 38 39 err = client.SendNodeType(ncD, sync, "test") 40 if err != nil { 41 t.Fatal("Error sending node: ", err) 42 } 43 44 // make sure device node gets sync'd upstream 45 start := time.Now() 46 for { 47 if time.Since(start) > 500*time.Millisecond { 48 t.Fatal("device node not synced") 49 } 50 51 nodes, err := client.GetNodes(ncU, "all", rootD.ID, "", false) 52 if err != nil { 53 continue 54 } 55 56 if len(nodes) > 0 { 57 break 58 } 59 60 time.Sleep(time.Millisecond * 10) 61 } 62 63 fmt.Println("**** update description down") 64 err = client.SendNodePoint(ncD, rootD.ID, data.Point{Type: data.PointTypeDescription, Text: "set down"}, true) 65 if err != nil { 66 t.Fatal("error sending node point: ", err) 67 } 68 69 start = time.Now() 70 for { 71 if time.Since(start) > 500*time.Millisecond { 72 t.Fatal("description not propagated upstream") 73 } 74 75 nodes, err := client.GetNodesType[client.Device](ncU, "all", rootD.ID) 76 if err != nil { 77 continue 78 } 79 80 if len(nodes) > 0 { 81 if nodes[0].Description == "set down" { 82 break 83 } 84 } 85 86 time.Sleep(time.Millisecond * 10) 87 } 88 89 fmt.Println("**** update description up") 90 err = client.SendNodePoint(ncU, rootD.ID, data.Point{Type: data.PointTypeDescription, Text: "set up"}, true) 91 if err != nil { 92 t.Fatal("error sending node point: ", err) 93 } 94 95 start = time.Now() 96 for { 97 if time.Since(start) > 500*time.Millisecond { 98 t.Fatal("description not propagated downstream") 99 } 100 101 nodes, err := client.GetNodesType[client.Device](ncD, "all", rootD.ID) 102 if err != nil { 103 continue 104 } 105 106 if len(nodes) > 0 { 107 if nodes[0].Description == "set up" { 108 break 109 } 110 } 111 112 time.Sleep(time.Millisecond * 10) 113 } 114 115 fmt.Println("**** create node down") 116 varD := client.Variable{ID: "varDown", Parent: rootD.ID, Description: "varDown"} 117 err = client.SendNodeType(ncD, varD, "test") 118 if err != nil { 119 t.Fatal("Error sending var1: ", err) 120 } 121 122 start = time.Now() 123 for { 124 if time.Since(start) > 500*time.Millisecond { 125 t.Fatal("var1 not propagated upstream") 126 } 127 128 nodes, err := client.GetNodesType[client.Variable](ncU, "all", "varDown") 129 if err != nil { 130 continue 131 } 132 133 if len(nodes) > 0 { 134 break 135 } 136 137 time.Sleep(time.Millisecond * 10) 138 } 139 140 fmt.Println("**** create node up") 141 varU := client.Variable{ID: "varUp", Parent: rootD.ID, Description: "varUp"} 142 err = client.SendNodeType(ncU, varU, "test") 143 if err != nil { 144 t.Fatal("Error sending varU: ", err) 145 } 146 147 start = time.Now() 148 for { 149 if time.Since(start) > 500*time.Millisecond { 150 t.Fatal("var2 not propagated downstream") 151 } 152 153 nodes, err := client.GetNodesType[client.Variable](ncU, "all", "varUp") 154 if err != nil { 155 continue 156 } 157 158 if len(nodes) > 0 { 159 break 160 } 161 162 time.Sleep(time.Millisecond * 10) 163 } 164 165 fmt.Println("**** delete node down") 166 err = client.SendEdgePoint(ncD, varD.ID, rootD.ID, data.Point{Type: data.PointTypeTombstone, Value: 1}, true) 167 if err != nil { 168 t.Fatal("error sending node point: ", err) 169 } 170 171 start = time.Now() 172 for { 173 if time.Since(start) > 500*time.Millisecond { 174 t.Fatal("varD delete not propagated upstream") 175 } 176 177 nodes, err := client.GetNodesType[client.Variable](ncU, rootD.ID, varD.ID) 178 if err != nil { 179 t.Fatal(err) 180 } 181 182 if len(nodes) <= 0 { 183 break 184 } 185 186 time.Sleep(time.Millisecond * 10) 187 } 188 189 fmt.Println("**** delete node up") 190 err = client.SendEdgePoint(ncU, varU.ID, rootD.ID, data.Point{Type: data.PointTypeTombstone, Value: 1}, true) 191 if err != nil { 192 t.Fatal("error sending node point: ", err) 193 } 194 195 start = time.Now() 196 for { 197 if time.Since(start) > 500*time.Millisecond { 198 t.Fatal("varU not propagated downstream") 199 } 200 201 nodes, err := client.GetNodesType[client.Variable](ncD, rootD.ID, varU.ID) 202 if err != nil { 203 t.Fatal(err) 204 } 205 206 if len(nodes) <= 0 { 207 break 208 } 209 210 time.Sleep(time.Millisecond * 10) 211 } 212 213 fmt.Println("sync test finished") 214 } 215 216 func TestSyncDeleteUpstream(t *testing.T) { 217 // if we delete the upstream node, the downstream sync process should re-create it 218 219 // Start up a SIOT test servers for this test 220 ncU, rootU, stopU, err := server.TestServer("2") 221 222 if err != nil { 223 t.Fatal("Error starting upstream test server: ", err) 224 } 225 226 defer stopU() 227 228 ncD, rootD, stopD, err := server.TestServer() 229 230 if err != nil { 231 t.Fatal("Error starting upstream test server: ", err) 232 } 233 234 defer stopD() 235 236 fmt.Println("**** create sync node") 237 sync := client.Sync{ 238 ID: "sync-id", 239 Parent: rootD.ID, 240 Description: "sync to up", 241 URI: server.TestServerOptions2.NatsServer, 242 Period: 1, 243 } 244 245 err = client.SendNodeType(ncD, sync, "test") 246 if err != nil { 247 t.Fatal("Error sending node: ", err) 248 } 249 250 // make sure device node gets sync'd upstream 251 start := time.Now() 252 for { 253 if time.Since(start) > 500*time.Millisecond { 254 t.Fatal("device node not synced") 255 } 256 257 nodes, err := client.GetNodes(ncU, "all", rootD.ID, "", false) 258 if err != nil { 259 continue 260 } 261 262 if len(nodes) > 0 { 263 break 264 } 265 266 time.Sleep(time.Millisecond * 10) 267 } 268 269 fmt.Println("**** Delete downstream node on upstream") 270 err = client.SendEdgePoint(ncU, rootD.ID, rootU.ID, data.Point{Type: data.PointTypeTombstone, Value: 1}, true) 271 272 if err != nil { 273 t.Fatal("Error deleting upstream node: ", err) 274 } 275 276 time.Sleep(time.Millisecond * 200) 277 278 // make sure device node gets undeleted 279 start = time.Now() 280 for { 281 if time.Since(start) > 2*time.Second { 282 t.Fatal("device node not recreated") 283 } 284 285 nodes, err := client.GetNodes(ncU, "all", rootD.ID, "", false) 286 if err != nil { 287 continue 288 } 289 290 if len(nodes) > 0 { 291 break 292 } 293 294 time.Sleep(time.Millisecond * 10) 295 } 296 }