@@ -86,6 +86,7 @@ func TestRobotsTxt(t *testing.T) {
8686type TestProvider struct {
8787 *providers.ProviderData
8888 EmailAddress string
89+ ValidToken bool
8990}
9091
9192func (tp *TestProvider) GetEmailAddress(unused_auth_response *simplejson.Json,
@@ -93,6 +94,10 @@ func (tp *TestProvider) GetEmailAddress(unused_auth_response *simplejson.Json,
9394 return tp.EmailAddress, nil
9495}
9596
97+func (tp *TestProvider) ValidateToken(access_token string) bool {
98+ return tp.ValidToken
99+}
100+
96101type PassAccessTokenTest struct {
97102 provider_server *httptest.Server
98103 proxy *OauthProxy
@@ -322,101 +327,21 @@ func TestSignInPageDirectAccessRedirectsToRoot(t *testing.T) {
322327 }
323328}
324329
325−type ValidateTokenTest struct {
326− opts *Options
327− proxy *OauthProxy
328− backend *httptest.Server
329− response_code int
330−}
331−
332−func NewValidateTokenTest() *ValidateTokenTest {
333− var vt_test ValidateTokenTest
334−
335− vt_test.opts = NewOptions()
336− vt_test.opts.Upstreams = append(vt_test.opts.Upstreams, "unused")
337− vt_test.opts.CookieSecret = "foobar"
338− vt_test.opts.ClientID = "bazquux"
339− vt_test.opts.ClientSecret = "xyzzyplugh"
340− vt_test.opts.Validate()
341−
342− vt_test.backend = httptest.NewServer(
343− http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
344− switch r.URL.Path {
345− case "/oauth/tokeninfo":
346− w.WriteHeader(vt_test.response_code)
347− w.Write([]byte("only code matters; contents disregarded"))
348− default:
349− w.WriteHeader(500)
350− w.Write([]byte("unknown URL"))
351− }
352− }))
353− backend_url, _ := url.Parse(vt_test.backend.URL)
354− vt_test.opts.provider.Data().ValidateUrl = &url.URL{
355− Scheme: "http",
356− Host: backend_url.Host,
357− Path: "/oauth/tokeninfo",
358− }
359− vt_test.response_code = 200
360−
361− vt_test.proxy = NewOauthProxy(vt_test.opts, func(email string) bool {
362− return true
363− })
364− return &vt_test
365−}
366−
367−func (vt_test *ValidateTokenTest) Close() {
368− vt_test.backend.Close()
369−}
370−
371−func TestValidateTokenEmptyToken(t *testing.T) {
372− vt_test := NewValidateTokenTest()
373− defer vt_test.Close()
374−
375− assert.Equal(t, false, vt_test.proxy.ValidateToken(""))
376−}
377−
378−func TestValidateTokenEmptyValidateUrl(t *testing.T) {
379− vt_test := NewValidateTokenTest()
380− defer vt_test.Close()
381−
382− vt_test.proxy.oauthValidateUrl = nil
383− assert.Equal(t, false, vt_test.proxy.ValidateToken("foobar"))
384−}
385−
386−func TestValidateTokenRequestNetworkFailure(t *testing.T) {
387− vt_test := NewValidateTokenTest()
388− // Close immediately to simulate a network failure
389− vt_test.Close()
390−
391− assert.Equal(t, false, vt_test.proxy.ValidateToken("foobar"))
392−}
393−
394−func TestValidateTokenExpiredToken(t *testing.T) {
395− vt_test := NewValidateTokenTest()
396− defer vt_test.Close()
397−
398− vt_test.response_code = 401
399− assert.Equal(t, false, vt_test.proxy.ValidateToken("foobar"))
400−}
401−
402−func TestValidateTokenValidToken(t *testing.T) {
403− vt_test := NewValidateTokenTest()
404− defer vt_test.Close()
405−
406− assert.Equal(t, true, vt_test.proxy.ValidateToken("foobar"))
407−}
408−
409330type ProcessCookieTest struct {
410331 opts *Options
411332 proxy *OauthProxy
412333 rw *httptest.ResponseRecorder
413334 req *http.Request
414− backend *httptest.Server
335+ provider TestProvider
415336 response_code int
416337 validate_user bool
417338}
418339
419−func NewProcessCookieTest() *ProcessCookieTest {
340+type ProcessCookieTestOpts struct {
341+ provider_validate_cookie_response bool
342+}
343+
344+func NewProcessCookieTest(opts ProcessCookieTestOpts) *ProcessCookieTest {
420345 var pc_test ProcessCookieTest
421346
422347 pc_test.opts = NewOptions()
@@ -433,6 +358,9 @@ func NewProcessCookieTest() *ProcessCookieTest {
433358 pc_test.proxy = NewOauthProxy(pc_test.opts, func(email string) bool {
434359 return pc_test.validate_user
435360 })
361+ pc_test.proxy.provider = &TestProvider{
362+ ValidToken: opts.provider_validate_cookie_response,
363+ }
436364
437365 // Now, zero-out proxy.CookieRefresh for the cases that don't involve
438366 // access_token validation.
@@ -443,22 +371,10 @@ func NewProcessCookieTest() *ProcessCookieTest {
443371 return &pc_test
444372}
445373
446−func (p *ProcessCookieTest) InstantiateBackend() {
447− p.backend = httptest.NewServer(
448− http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
449− w.WriteHeader(p.response_code)
450− }))
451− backend_url, _ := url.Parse(p.backend.URL)
452− p.proxy.oauthValidateUrl = &url.URL{
453− Scheme: "http",
454− Host: backend_url.Host,
455− Path: "/oauth/tokeninfo",
456− }
457− p.response_code = 200
458−}
459−
460−func (p *ProcessCookieTest) Close() {
461− p.backend.Close()
374+func NewProcessCookieTestWithDefaults() *ProcessCookieTest {
375+ return NewProcessCookieTest(ProcessCookieTestOpts{
376+ provider_validate_cookie_response: true,
377+ })
462378}
463379
464380func (p *ProcessCookieTest) MakeCookie(value, access_token string) *http.Cookie {
@@ -476,7 +392,7 @@ func (p *ProcessCookieTest) ProcessCookie() (email, user, access_token string, o
476392}
477393
478394func TestProcessCookie(t *testing.T) {
479− pc_test := NewProcessCookieTest()
395+ pc_test := NewProcessCookieTestWithDefaults()
480396
481397 pc_test.AddCookie("michael.bland@gsa.gov", "my_access_token")
482398 email, user, access_token, ok := pc_test.ProcessCookie()
@@ -487,13 +403,13 @@ func TestProcessCookie(t *testing.T) {
487403}
488404
489405func TestProcessCookieNoCookieError(t *testing.T) {
490− pc_test := NewProcessCookieTest()
406+ pc_test := NewProcessCookieTestWithDefaults()
491407 _, _, _, ok := pc_test.ProcessCookie()
492408 assert.Equal(t, false, ok)
493409}
494410
495411func TestProcessCookieFailIfParsingCookieValueFails(t *testing.T) {
496− pc_test := NewProcessCookieTest()
412+ pc_test := NewProcessCookieTestWithDefaults()
497413 value, _ := buildCookieValue("michael.bland@gsa.gov",
498414 pc_test.proxy.AesCipher, "my_access_token")
499415 pc_test.req.AddCookie(pc_test.proxy.MakeCookie(
@@ -504,10 +420,7 @@ func TestProcessCookieFailIfParsingCookieValueFails(t *testing.T) {
504420}
505421
506422func TestProcessCookieRefreshNotSet(t *testing.T) {
507− pc_test := NewProcessCookieTest()
508− pc_test.InstantiateBackend()
509− defer pc_test.Close()
510−
423+ pc_test := NewProcessCookieTestWithDefaults()
511424 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
512425 cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "")
513426 pc_test.req.AddCookie(cookie)
@@ -518,10 +431,7 @@ func TestProcessCookieRefreshNotSet(t *testing.T) {
518431}
519432
520433func TestProcessCookieRefresh(t *testing.T) {
521− pc_test := NewProcessCookieTest()
522− pc_test.InstantiateBackend()
523− defer pc_test.Close()
524−
434+ pc_test := NewProcessCookieTestWithDefaults()
525435 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
526436 cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
527437 pc_test.req.AddCookie(cookie)
@@ -533,10 +443,7 @@ func TestProcessCookieRefresh(t *testing.T) {
533443}
534444
535445func TestProcessCookieRefreshThresholdNotCrossed(t *testing.T) {
536− pc_test := NewProcessCookieTest()
537− pc_test.InstantiateBackend()
538− defer pc_test.Close()
539−
446+ pc_test := NewProcessCookieTestWithDefaults()
540447 pc_test.proxy.CookieExpire = time.Duration(25) * time.Hour
541448 cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
542449 pc_test.req.AddCookie(cookie)
@@ -548,11 +455,9 @@ func TestProcessCookieRefreshThresholdNotCrossed(t *testing.T) {
548455}
549456
550457func TestProcessCookieFailIfRefreshSetAndTokenNoLongerValid(t *testing.T) {
551− pc_test := NewProcessCookieTest()
552− pc_test.InstantiateBackend()
553− defer pc_test.Close()
554− pc_test.response_code = 401
555−
458+ pc_test := NewProcessCookieTest(ProcessCookieTestOpts{
459+ provider_validate_cookie_response: false,
460+ })
556461 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour
557462 cookie := pc_test.MakeCookie("michael.bland@gsa.gov", "my_access_token")
558463 pc_test.req.AddCookie(cookie)
@@ -564,9 +469,7 @@ func TestProcessCookieFailIfRefreshSetAndTokenNoLongerValid(t *testing.T) {
564469}
565470
566471func TestProcessCookieFailIfRefreshSetAndUserNoLongerValid(t *testing.T) {
567− pc_test := NewProcessCookieTest()
568− pc_test.InstantiateBackend()
569− defer pc_test.Close()
472+ pc_test := NewProcessCookieTestWithDefaults()
570473 pc_test.validate_user = false
571474
572475 pc_test.proxy.CookieExpire = time.Duration(23) * time.Hour