"io/ioutil"
"net/http"
"os"
- "sync"
"testing"
"time"
"github.com/stretchr/testify/require"
)
-func createHttpClientMock(t *testing.T, configuration *Config, wg *sync.WaitGroup, token JwtToken) *http.Client {
+func createHttpClientMock(t *testing.T, configuration *Config, token JwtToken) *http.Client {
assertions := require.New(t)
clientMock := NewTestClient(func(req *http.Request) *http.Response {
if req.URL.String() == configuration.AuthServiceUrl {
assertions.Contains(body, "grant_type="+configuration.GrantType)
contentType := req.Header.Get("content-type")
assertions.Equal("application/x-www-form-urlencoded", contentType)
- wg.Done()
+
return &http.Response{
StatusCode: 200,
Body: ioutil.NopCloser(bytes.NewBuffer(toBody(token))),
accessToken := "Access_token" + fmt.Sprint(time.Now().UnixNano())
token := JwtToken{Access_token: accessToken, Expires_in: 7, Token_type: "Token_type"}
- wg := sync.WaitGroup{}
- wg.Add(2) // Get token two times
- clientMock := createHttpClientMock(t, configuration, &wg, token)
+ clientMock := createHttpClientMock(t, configuration, token)
go periodicRefreshIwtToken(clientMock, context)
- if waitTimeout(&wg, 12*time.Second) {
- t.Error("Not all calls to server were made")
- t.Fail()
- }
+ await(func() bool { return fileExists(configuration.AuthTokenOutputFileName) }, t)
tokenFileContent, err := ioutil.ReadFile(configuration.AuthTokenOutputFileName)
check(err)
context.Running = false
}
+func fileExists(fileName string) bool {
+ if _, err := os.Stat(fileName); err == nil {
+ return true
+ }
+ log.Debug("Waiting for file: " + fileName)
+ return false
+}
+
+func await(predicate func() bool, t *testing.T) {
+ MAX_TIME_SECONDS := 30
+ for i := 1; i < MAX_TIME_SECONDS; i++ {
+ if predicate() {
+ return
+ }
+ time.Sleep(time.Second)
+ }
+ t.Error("Predicate not fulfilled")
+ t.Fail()
+}
+
func TestStart(t *testing.T) {
assertions := require.New(t)
log.SetLevel(log.TraceLevel)
configuration := NewConfig()
configuration.AuthTokenOutputFileName = "/tmp/authToken" + fmt.Sprint(time.Now().UnixNano())
+ configuration.CACertsPath = configuration.CertPath
context := NewContext(configuration)
+ t.Cleanup(func() {
+ os.Remove(configuration.AuthTokenOutputFileName)
+ })
start(context)
}
}
-// waitTimeout waits for the waitgroup for the specified max timeout.
-// Returns true if waiting timed out.
-func waitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
- c := make(chan struct{})
- go func() {
- defer close(c)
- wg.Wait()
- }()
- select {
- case <-c:
- return false // completed normally
- case <-time.After(timeout):
- return true // timed out
- }
-}
-
func getBodyAsString(req *http.Request, t *testing.T) string {
buf := new(bytes.Buffer)
if _, err := buf.ReadFrom(req.Body); err != nil {