2014-12-02 3 views
0

Это функция, которую я написал, что добавляет запрос к очереди запросов:Go приложение зависает при тестировании функции, которая содержит замок

func (self *RequestQueue) addRequest(request *Request) { 

    self.requestLock.Lock() 
    self.queue[request.NormalizedUrl()] = request.ResponseChannel 
    self.requestLock.Unlock() 
} 

и это одна из его испытаний:

func TestAddRequest(t *testing.T) { 

    before := len(rq.queue) 

    r := SampleRequests(1)[0] 
    rq.addRequest(&r) 

    if (len(rq.queue) - 1) != before { 
     t.Errorf("Failed to add request to queue") 
    } 
} 

Когда я запускаю этот тест, приложение зависает. Если я прокомментирую этот тест, все будет хорошо. Я думаю, что проблема заключается в блокировке внутри функции. Есть ли что-то, что я делаю неправильно? Спасибо за помощь!

+2

Одна возможность: может произойти, если какой-либо предыдущий тест 'panic's или возвращает ошибку (или успех), удерживая' requestLock'. Стандартной задачей является 'defer self.requestLock.Unlock()' сразу после каждого 'Lock()', поэтому материал очищается для вас. – twotwotwo

+0

Прежде всего, как @twotwotwo упомянул, откройте его с 'defer'. Во-вторых, вы получаете доступ к rq.queue в своем тесте без блокировки, но если ничего не работает, это может быть хорошо. в-третьих, вы не показываете достаточно остальной части кода, чтобы помочь вам отладить это. –

+0

Я нашел проблему в другой части кода, который, извините, я не предоставил, но очень благодарен за этот совет Defer. Я не думал об этом :) –

ответ

0

Проблемы была функция бесконечного цикла в SampleRequests():

func SampleRequests(num int) []Request { 

    requests := make([]Request, num, num+10) 
    for i := 0; i < len(requests); i++ { 
     r := NewRequest("GET", "http://api.openweathermap.org/data/2.5/weather", nil) 
     r.Params.Set("lat", "35") 
     r.Params.Add("lon", "139") 
     r.Params.Add("units", "metric") 

     requests = append(requests, r) 
    } 

    return requests 
} 

Я была проверка, если i был меньше, чем длина массива в состоянии продолжения для цикла. С каждой итерацией элемент добавлялся в массив, длина увеличивалась, а цикл цикла продолжал выполнение.

Смежные вопросы