github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/debuglog_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package apiserver_test 5 6 import ( 7 "bufio" 8 "net/http" 9 "net/url" 10 11 "github.com/juju/utils" 12 "golang.org/x/net/websocket" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/testing/factory" 17 ) 18 19 // debugLogBaseSuite has tests that should be run for both the file 20 // and DB based variants of debuglog, as well as some test helpers. 21 type debugLogBaseSuite struct { 22 authHttpSuite 23 } 24 25 func (s *debugLogBaseSuite) TestBadParams(c *gc.C) { 26 reader := s.openWebsocket(c, url.Values{"maxLines": {"foo"}}) 27 assertJSONError(c, reader, `maxLines value "foo" is not a valid unsigned number`) 28 s.assertWebsocketClosed(c, reader) 29 } 30 31 func (s *debugLogBaseSuite) TestWithHTTP(c *gc.C) { 32 uri := s.logURL(c, "http", nil).String() 33 s.sendRequest(c, httpRequestParams{ 34 method: "GET", 35 url: uri, 36 expectError: `.*malformed HTTP response.*`, 37 }) 38 } 39 40 func (s *debugLogBaseSuite) TestWithHTTPS(c *gc.C) { 41 uri := s.logURL(c, "https", nil).String() 42 response := s.sendRequest(c, httpRequestParams{method: "GET", url: uri}) 43 c.Assert(response.StatusCode, gc.Equals, http.StatusBadRequest) 44 } 45 46 func (s *debugLogBaseSuite) TestNoAuth(c *gc.C) { 47 conn := s.dialWebsocketInternal(c, nil, nil) 48 defer conn.Close() 49 reader := bufio.NewReader(conn) 50 51 assertJSONError(c, reader, "no credentials provided") 52 s.assertWebsocketClosed(c, reader) 53 } 54 55 func (s *debugLogBaseSuite) TestAgentLoginsRejected(c *gc.C) { 56 m, password := s.Factory.MakeMachineReturningPassword(c, &factory.MachineParams{ 57 Nonce: "foo-nonce", 58 }) 59 header := utils.BasicAuthHeader(m.Tag().String(), password) 60 header.Add(params.MachineNonceHeader, "foo-nonce") 61 conn := s.dialWebsocketInternal(c, nil, header) 62 defer conn.Close() 63 reader := bufio.NewReader(conn) 64 65 assertJSONError(c, reader, "invalid entity name or password") 66 s.assertWebsocketClosed(c, reader) 67 } 68 69 func (s *debugLogBaseSuite) openWebsocket(c *gc.C, values url.Values) *bufio.Reader { 70 conn := s.dialWebsocket(c, values) 71 s.AddCleanup(func(_ *gc.C) { conn.Close() }) 72 return bufio.NewReader(conn) 73 } 74 75 func (s *debugLogBaseSuite) openWebsocketCustomPath(c *gc.C, path string) *bufio.Reader { 76 server := s.logURL(c, "wss", nil) 77 server.Path = path 78 header := utils.BasicAuthHeader(s.userTag.String(), s.password) 79 conn := s.dialWebsocketFromURL(c, server.String(), header) 80 s.AddCleanup(func(_ *gc.C) { conn.Close() }) 81 return bufio.NewReader(conn) 82 } 83 84 func (s *debugLogBaseSuite) logURL(c *gc.C, scheme string, queryParams url.Values) *url.URL { 85 return s.makeURL(c, scheme, "/log", queryParams) 86 } 87 88 func (s *debugLogBaseSuite) dialWebsocket(c *gc.C, queryParams url.Values) *websocket.Conn { 89 header := utils.BasicAuthHeader(s.userTag.String(), s.password) 90 return s.dialWebsocketInternal(c, queryParams, header) 91 } 92 93 func (s *debugLogBaseSuite) dialWebsocketInternal(c *gc.C, queryParams url.Values, header http.Header) *websocket.Conn { 94 server := s.logURL(c, "wss", queryParams).String() 95 return s.dialWebsocketFromURL(c, server, header) 96 }