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  }