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  }