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 }