github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/testing/fakecharmstore.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package testing
     5  
     6  import (
     7  	"fmt"
     8  	"net/http"
     9  	"net/http/httptest"
    10  
    11  	gitjujutesting "github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/charm.v6-unstable"
    15  	"gopkg.in/juju/charmrepo.v1"
    16  	"gopkg.in/juju/charmrepo.v1/csclient"
    17  	"gopkg.in/juju/charmstore.v5-unstable"
    18  	"gopkg.in/macaroon-bakery.v1/bakery/checkers"
    19  	"gopkg.in/macaroon-bakery.v1/bakerytest"
    20  	"gopkg.in/mgo.v2"
    21  
    22  	"github.com/juju/juju/apiserver/service"
    23  	"github.com/juju/juju/testcharms"
    24  )
    25  
    26  type CharmStoreSuite struct {
    27  	gitjujutesting.CleanupSuite
    28  
    29  	Session *mgo.Session
    30  	// DischargeUser holds the identity of the user
    31  	// that the 3rd party caveat discharger will issue
    32  	// macaroons for. If it is empty, no caveats will be discharged.
    33  	DischargeUser string
    34  
    35  	discharger *bakerytest.Discharger
    36  	handler    charmstore.HTTPCloseHandler
    37  	Srv        *httptest.Server
    38  	Client     *csclient.Client
    39  }
    40  
    41  func (s *CharmStoreSuite) SetUpTest(c *gc.C) {
    42  	s.CleanupSuite.SetUpTest(c)
    43  
    44  	s.discharger = bakerytest.NewDischarger(nil, func(_ *http.Request, cond string, arg string) ([]checkers.Caveat, error) {
    45  		if s.DischargeUser == "" {
    46  			return nil, fmt.Errorf("discharge denied")
    47  		}
    48  		return []checkers.Caveat{
    49  			checkers.DeclaredCaveat("username", s.DischargeUser),
    50  		}, nil
    51  	})
    52  	db := s.Session.DB("juju-testing")
    53  	params := charmstore.ServerParams{
    54  		AuthUsername:     "test-user",
    55  		AuthPassword:     "test-password",
    56  		IdentityLocation: s.discharger.Location(),
    57  		PublicKeyLocator: s.discharger,
    58  	}
    59  	handler, err := charmstore.NewServer(db, nil, "", params, charmstore.V4)
    60  	c.Assert(err, jc.ErrorIsNil)
    61  	s.handler = handler
    62  	s.Srv = httptest.NewServer(handler)
    63  	s.Client = csclient.New(csclient.Params{
    64  		URL:      s.Srv.URL,
    65  		User:     params.AuthUsername,
    66  		Password: params.AuthPassword,
    67  	})
    68  
    69  	s.PatchValue(&charmrepo.CacheDir, c.MkDir())
    70  	s.PatchValue(&service.NewCharmStore, func(p charmrepo.NewCharmStoreParams) charmrepo.Interface {
    71  		p.URL = s.Srv.URL
    72  		return charmrepo.NewCharmStore(p)
    73  	})
    74  }
    75  
    76  func (s *CharmStoreSuite) TearDownTest(c *gc.C) {
    77  	s.discharger.Close()
    78  	s.handler.Close()
    79  	s.Srv.Close()
    80  	s.CleanupSuite.TearDownTest(c)
    81  }
    82  
    83  func (s *CharmStoreSuite) UploadCharm(c *gc.C, url, name string) (*charm.URL, charm.Charm) {
    84  	return testcharms.UploadCharm(c, s.Client, url, name)
    85  }