github.com/simpleiot/simpleiot@v0.18.3/store/sqlite_test.go (about) 1 package store 2 3 import ( 4 "fmt" 5 "os/exec" 6 "testing" 7 "time" 8 9 "github.com/google/uuid" 10 "github.com/simpleiot/simpleiot/data" 11 ) 12 13 var testFile = "test.sqlite" 14 15 func newTestDb(t *testing.T) *DbSqlite { 16 _ = exec.Command("sh", "-c", "rm "+testFile+"*").Run() 17 18 db, err := NewSqliteDb(testFile, "") 19 if err != nil { 20 t.Fatal("Error opening db: ", err) 21 } 22 23 return db 24 } 25 26 func TestDbSqlite(t *testing.T) { 27 db := newTestDb(t) 28 defer db.Close() 29 30 rootID := db.rootNodeID() 31 32 if rootID == "" { 33 t.Fatal("Root ID is blank: ", rootID) 34 } 35 36 rns, err := db.getNodes(nil, "all", rootID, "", false) 37 if err != nil { 38 t.Fatal("Error getting root node: ", err) 39 } 40 41 rn := rns[0] 42 43 if rn.ID == "" { 44 t.Fatal("Root node ID is blank") 45 } 46 47 // modify a point and see if it changes 48 err = db.nodePoints(rootID, data.Points{{Type: data.PointTypeDescription, Text: "root"}}) 49 if err != nil { 50 t.Fatal(err) 51 } 52 53 rns, err = db.getNodes(nil, "all", rootID, "", false) 54 if err != nil { 55 t.Fatal("Error getting root node: ", err) 56 } 57 58 rn = rns[0] 59 60 if rn.Desc() != "root" { 61 t.Fatal("Description should have been root, got: ", rn.Desc()) 62 } 63 64 // send an old point and verify it does not change 65 err = db.nodePoints(rootID, data.Points{{Time: time.Now().Add(-time.Hour), 66 Type: data.PointTypeDescription, Text: "root with old time"}}) 67 if err != nil { 68 t.Fatal(err) 69 } 70 71 rns, err = db.getNodes(nil, "all", rootID, "", false) 72 if err != nil { 73 t.Fatal("Error getting root node: ", err) 74 } 75 rn = rns[0] 76 77 if rn.Desc() != "root" { 78 t.Fatal("Description should have stayed root, got: ", rn.Desc()) 79 } 80 81 // verify default admin user got set 82 children, err := db.getNodes(nil, rootID, "all", "", false) 83 if err != nil { 84 t.Fatal("children error: ", err) 85 } 86 87 if len(children) < 1 { 88 t.Fatal("did not return any children") 89 } 90 91 if children[0].Parent != rootID { 92 t.Fatal("Parent not correct: ", children[0].Parent) 93 } 94 95 // test getNodes API 96 adminID := children[0].ID 97 98 adminNodes, err := db.getNodes(nil, rootID, adminID, "", false) 99 if err != nil { 100 t.Fatal("Error getting admin nodes", err) 101 } 102 103 if len(adminNodes) < 1 { 104 t.Fatal("did not return admin nodes") 105 } 106 107 if adminNodes[0].Type != data.NodeTypeUser { 108 t.Fatal("getNodes did not return right node type for user") 109 } 110 111 adminNodes, err = db.getNodes(nil, "all", adminID, "", false) 112 if err != nil { 113 t.Fatal("Error getting admin nodes", err) 114 } 115 116 if len(adminNodes) < 1 { 117 t.Fatal("did not return admin nodes") 118 } 119 120 rootNodes, err := db.getNodes(nil, "root", "all", "", false) 121 if err != nil { 122 t.Fatal("Error getting root nodes", err) 123 } 124 125 if len(rootNodes) < 1 { 126 t.Fatal("did not return root nodes") 127 } 128 129 if rootNodes[0].ID != rootID { 130 t.Fatal("root node ID is not correct") 131 } 132 133 // test edge points 134 err = db.edgePoints(adminID, rootID, data.Points{{Type: data.PointTypeRole, Text: data.PointValueRoleAdmin}}) 135 if err != nil { 136 t.Fatal("Error sending edge points: ", err) 137 } 138 139 adminNodes, err = db.getNodes(nil, rootID, adminID, "", false) 140 if err != nil { 141 t.Fatal("Error getting admin nodes", err) 142 } 143 144 p, ok := adminNodes[0].EdgePoints.Find(data.PointTypeRole, "") 145 if !ok { 146 t.Fatal("point not found") 147 } 148 if p.Text != data.PointValueRoleAdmin { 149 t.Fatal("point does not have right value") 150 } 151 152 // try two children 153 groupNodeID := uuid.New().String() 154 155 err = db.edgePoints(groupNodeID, rootID, data.Points{ 156 {Type: data.PointTypeTombstone, Value: 0}, 157 {Type: data.PointTypeNodeType, Text: data.NodeTypeGroup}, 158 }) 159 if err != nil { 160 t.Fatal("Error creating group edge", err) 161 } 162 163 // verify default admin user got set 164 children, err = db.getNodes(nil, rootID, "all", "", false) 165 if err != nil { 166 t.Fatal("children error: ", err) 167 } 168 169 if len(children) < 2 { 170 t.Fatal("did not return 2 children") 171 } 172 173 // verify getNodes with "all" works 174 start := time.Now() 175 adminNodes, err = db.getNodes(nil, "all", adminID, "", false) 176 fmt.Println("getNodes time: ", time.Since(start)) 177 if err != nil { 178 t.Fatal("Error getting admin nodes with all specified: ", err) 179 } 180 181 if adminNodes[0].Parent != rootID { 182 t.Fatal("Parent ID is not correct") 183 } 184 185 if len(adminNodes) < 1 { 186 t.Fatal("did not return admin nodes") 187 } 188 } 189 190 func TestDbSqliteKeyZero(t *testing.T) { 191 // what to do when we have points with key set to "0" and "" 192 // technically these should map to the same point so that 193 // we can easily upgrade from scalars to arrays with no 194 // data changes 195 db := newTestDb(t) 196 defer db.Close() 197 198 rootID := db.rootNodeID() 199 200 err := db.nodePoints(rootID, data.Points{{Type: data.PointTypeValue, Value: 1}}) 201 if err != nil { 202 t.Fatal(err) 203 } 204 205 nodes, err := db.getNodes(nil, "all", rootID, "", false) 206 if err != nil { 207 t.Fatal("Error getting root node: ", err) 208 } 209 210 n := nodes[0] 211 212 err = db.nodePoints(rootID, data.Points{{Type: data.PointTypeValue, Key: "0", Value: 2}}) 213 if err != nil { 214 t.Fatal(err) 215 } 216 217 nodes, err = db.getNodes(nil, "all", rootID, "", false) 218 if err != nil { 219 t.Fatal("Error getting root node: ", err) 220 } 221 222 n = nodes[0] 223 224 if len(n.Points) != 1 { 225 t.Fatal("Error, point did not get merged") 226 } 227 } 228 229 func TestDbSqliteReopen(t *testing.T) { 230 db := newTestDb(t) 231 rootID := db.rootNodeID() 232 db.Close() 233 234 var err error 235 db, err = NewSqliteDb(testFile, "") 236 if err != nil { 237 t.Fatal("Error opening db: ", err) 238 } 239 defer db.Close() 240 241 if rootID != db.rootNodeID() { 242 t.Fatal("Root node ID changed") 243 } 244 } 245 246 func TestDbSqliteUserCheck(t *testing.T) { 247 db := newTestDb(t) 248 defer db.Close() 249 250 nodes, err := db.userCheck("admin", "admin") 251 if err != nil { 252 t.Fatal("userCheck returned error: ", err) 253 } 254 255 if len(nodes) < 1 { 256 t.Fatal("userCheck did not return nodes") 257 } 258 } 259 260 func TestDbSqliteUp(t *testing.T) { 261 db := newTestDb(t) 262 defer db.Close() 263 264 rootID := db.rootNodeID() 265 266 children, err := db.getNodes(nil, rootID, "all", "", false) 267 268 if err != nil { 269 t.Fatal("Error getting children") 270 } 271 272 if len(children) < 1 { 273 t.Fatal("no children") 274 } 275 276 childID := children[0].ID 277 278 ups, err := db.up(childID, false) 279 280 if err != nil { 281 t.Fatal(err) 282 } 283 284 if len(ups) < 1 { 285 t.Fatal("No ups for admin user") 286 } 287 288 if ups[0] != rootID { 289 t.Fatal("ups, wrong ID: ", ups[0]) 290 } 291 292 // try to get ups of root node 293 ups, err = db.up(rootID, false) 294 295 if err != nil { 296 t.Fatal(err) 297 } 298 299 if len(ups) < 1 { 300 t.Fatal("No ups for root user") 301 } 302 303 if ups[0] != "root" { 304 t.Fatal("ups, wrong ID for root: ", ups[0]) 305 } 306 } 307 308 func TestDbSqliteBatchPoints(t *testing.T) { 309 db := newTestDb(t) 310 defer db.Close() 311 312 rootID := db.rootNodeID() 313 314 now := time.Now() 315 316 pts := data.Points{ 317 {Time: now, Type: data.PointTypeValue}, 318 {Time: now.Add(-time.Second), Type: data.PointTypeValue}, 319 {Time: now.Add(-time.Second * 2), Type: data.PointTypeValue}, 320 } 321 322 err := db.nodePoints(rootID, pts) 323 if err != nil { 324 t.Fatal(err) 325 } 326 327 nodes, err := db.getNodes(nil, "all", rootID, "", false) 328 if err != nil { 329 t.Fatal("Error getting root node: ", err) 330 } 331 332 n := nodes[0] 333 334 if len(n.Points) != 1 { 335 t.Fatal("Error, point did not get merged") 336 } 337 338 if !n.Points[0].Time.Equal(now) { 339 t.Fatal("Point collapsing did not pick latest") 340 } 341 342 }