github.com/Synthesix/Sia@v1.3.3-0.20180413141344-f863baeed3ca/cmd/siad/server_test.go (about)

     1  package main
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  	"sync"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/Synthesix/Sia/build"
    11  	"github.com/Synthesix/Sia/node/api/client"
    12  )
    13  
    14  // TestLatestRelease tests that the latestRelease function properly processes a
    15  // set of GitHub releases, returning the release with the highest version
    16  // number.
    17  func TestLatestRelease(t *testing.T) {
    18  	tests := []struct {
    19  		releases    []githubRelease
    20  		expectedTag string
    21  	}{
    22  		{
    23  			releases: []githubRelease{
    24  				{TagName: "lts-v1.0.4"},
    25  				{TagName: "v3.0.7"},
    26  				{TagName: "lts-v2.0.0"},
    27  			},
    28  			expectedTag: "v3.0.7",
    29  		},
    30  		{
    31  			releases: []githubRelease{
    32  				{TagName: "lts-v1.0.4"},
    33  				{TagName: "v3.0.7"},
    34  				{TagName: "v5.2.2"},
    35  			},
    36  			expectedTag: "v5.2.2",
    37  		},
    38  		{
    39  			releases: []githubRelease{
    40  				{TagName: "lts-v1.0.4"},
    41  				{TagName: "lts-v1.0.7"},
    42  				{TagName: "lts-v1.0.5"},
    43  			},
    44  			expectedTag: "", // no non-LTS versions
    45  		},
    46  		{
    47  			releases: []githubRelease{
    48  				{TagName: "v1.0.4"},
    49  				{TagName: "v1.0.7"},
    50  				{TagName: "v1.0.5"},
    51  			},
    52  			expectedTag: "v1.0.7",
    53  		},
    54  		{
    55  			releases: []githubRelease{
    56  				{TagName: "v1.0.4"},
    57  				{TagName: "v1.0.4.1"},
    58  				{TagName: "v1.0.4-patch1"},
    59  			},
    60  			expectedTag: "v1.0.4.1", // -patch is invalid
    61  		},
    62  		{
    63  			releases: []githubRelease{
    64  				{TagName: "abc"},
    65  				{TagName: "def"},
    66  				{TagName: "ghi"},
    67  			},
    68  			expectedTag: "", // invalid version strings
    69  		},
    70  	}
    71  	for i, test := range tests {
    72  		r, _ := latestRelease(test.releases)
    73  		if r.TagName != test.expectedTag {
    74  			t.Errorf("test %v failed: expected %q, got %q", i, test.expectedTag, r.TagName)
    75  		}
    76  	}
    77  }
    78  
    79  // TestNewServer verifies that NewServer creates a Sia API server correctly.
    80  func TestNewServer(t *testing.T) {
    81  	if testing.Short() {
    82  		t.SkipNow()
    83  	}
    84  	var wg sync.WaitGroup
    85  	config := Config{}
    86  	config.Siad.APIaddr = "localhost:0"
    87  	config.Siad.Modules = "cg"
    88  	config.Siad.SiaDir = build.TempDir(t.Name())
    89  	defer os.RemoveAll(config.Siad.SiaDir)
    90  	srv, err := NewServer(config)
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	wg.Add(1)
    95  	go func() {
    96  		defer wg.Done()
    97  		err := srv.Serve()
    98  		if err != nil {
    99  			t.Fatal(err)
   100  		}
   101  	}()
   102  	// verify that startup routes can be called correctly
   103  	c := client.New(srv.listener.Addr().String())
   104  	_, err = c.DaemonVersionGet()
   105  	if err != nil {
   106  		t.Fatal(err)
   107  	}
   108  	_, err = c.ConsensusGet()
   109  	if err == nil || !strings.Contains(err.Error(), "siad is not ready") {
   110  		t.Fatal("expected consensus call on unloaded server to fail with siad not ready")
   111  	}
   112  	// create a goroutine that continuously makes API requests to test that
   113  	// loading modules doesn't cause a race
   114  	wg.Add(1)
   115  	stopchan := make(chan struct{})
   116  	go func() {
   117  		defer wg.Done()
   118  		for {
   119  			select {
   120  			case <-stopchan:
   121  				return
   122  			default:
   123  			}
   124  			time.Sleep(time.Millisecond)
   125  			c.ConsensusGet()
   126  		}
   127  	}()
   128  	// load the modules, verify routes succeed
   129  	err = srv.loadModules()
   130  	if err != nil {
   131  		t.Fatal(err)
   132  	}
   133  	close(stopchan)
   134  	_, err = c.ConsensusGet()
   135  	if err != nil {
   136  		t.Fatal(err)
   137  	}
   138  	srv.Close()
   139  	wg.Wait()
   140  }