2016-06-08 6 views
0

Ich bin neu bei Travis und Go. Ich habe einen Test für einen https-Server und es läuft gut mit ich go test -v ./... auf meinem lokalen Computer laufen, aber es wird die meiste Zeit auf Travis aufgrund einer getsocketopt: connection refused Fehler beim Versuch, eine Verbindung mit dem Server. Es sollte auf https://localhost:8081 hören. Gibt es etwas in meinem .travis.yml Ich kann tun, um dies zu verhindern? HierTravis CI schlägt fehl beim Versuch, Golang HTTP Server zu testen

ist mein .travis.yml

language: go 
go: 
- 1.6 
- tip 
matrix: 
    allow_failures: 
- go: tip 
before_install: 
- go get -v github.com/golang/lint/golint 
install: 
- go get -v -d -t ./... 

Hier ist mein Server Erstellungscode:

func (webserver *WebServer) Start(keyLocation string, certLocation string) <-chan error { 
    errors := make(chan error, 1) 
    go func() { 
     defer close(errors) 
     errors <- http.ListenAndServeTLS(fmt.Sprintf(":%v", webserver.config.WebServerPort), certLocation, keyLocation, nil) 
    }() 
    return errors 
} 

Und der Client-Code:

func createHTTPClient(t *testing.T) *http.Client { 
    t.Log("Creating a test client...") 
    tr := &http.Transport { 
     TLSClientConfig: &tls.Config {InsecureSkipVerify: true}, 
    } 

    t.Log("Created a test client") 
    return &http.Client {Transport: tr} 
} 

Musterbestellung mit Client

request, _ := http.NewRequest(httpmethod, fmt.Sprintf("https://localhost:%d/token", port), nil) 
client.Do(request) 

Beispiel den Server in einem Test

errors := server.Start(testKeyLocation, testCertLocation) 
//Handle errors from server 
go func() { 
    select { 
     case err := <-errors: 
      if err != nil { 
       t.Fatalf("Error with server: %s", err.Error()) 
      } 
    } 
}() 
+0

Überprüfen Sie den Fehler, wenn Sie versuchen, Ihren Server zu starten? – JimB

+0

Ja, es ist festgelegt, dass der Test bei einem Fehler fehlschlägt, der durch den Befehl go 'http.ListenAndServeTLS' erzeugt wurde. Obwohl der Fehler auftritt, wenn ich einen Testclient erstelle, um zu versuchen, eine Verbindung mit dem Server herzustellen. – cphelps

+0

Sie müssen zuerst zeigen, wie Sie den Server und den Client erstellen. Das hat nicht unbedingt etwas mit Travis zu tun. – JimB

Antwort

3

Sie haben keine Synchronisation zwischen den Server starten und zu versuchen, eine Verbindung zu starten. Das Hinzufügen eines time.Sleep nach dem Starten des Servers sollte das Problem hervorheben.

Eine Möglichkeit zum Reduzieren des Fensters, in dem der Server nicht bereit ist, besteht darin, die net.Listener synchron zu erstellen und dann den offenen Listener der Konfiguration http.Server hinzuzufügen, bevor der Server gestartet wird. Die httptest.Server kann dies für Sie tun, sowie an zufällige Ports binden, um Konflikte während der Tests zu vermeiden und lokale Test-TLS-Zertifikate zu verwenden.