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  }