github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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  
    10  	gitjujutesting "github.com/juju/testing"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/charm.v5"
    13  	"gopkg.in/juju/charm.v5/charmrepo"
    14  	"gopkg.in/juju/charmstore.v4"
    15  	"gopkg.in/juju/charmstore.v4/charmstoretesting"
    16  	"gopkg.in/macaroon-bakery.v0/bakery/checkers"
    17  	"gopkg.in/macaroon-bakery.v0/bakerytest"
    18  	"gopkg.in/mgo.v2"
    19  
    20  	"github.com/juju/juju/apiserver/service"
    21  	"github.com/juju/juju/testcharms"
    22  )
    23  
    24  type CharmStoreSuite struct {
    25  	gitjujutesting.CleanupSuite
    26  
    27  	Session *mgo.Session
    28  	// DischargeUser holds the identity of the user
    29  	// that the 3rd party caveat discharger will issue
    30  	// macaroons for. If it is empty, no caveats will be discharged.
    31  	DischargeUser string
    32  
    33  	discharger *bakerytest.Discharger
    34  	Srv        *charmstoretesting.Server
    35  }
    36  
    37  func (s *CharmStoreSuite) SetUpTest(c *gc.C) {
    38  	s.CleanupSuite.SetUpTest(c)
    39  
    40  	s.discharger = bakerytest.NewDischarger(nil, func(_ *http.Request, cond string, arg string) ([]checkers.Caveat, error) {
    41  		if s.DischargeUser == "" {
    42  			return nil, fmt.Errorf("discharge denied")
    43  		}
    44  		return []checkers.Caveat{
    45  			checkers.DeclaredCaveat("username", s.DischargeUser),
    46  		}, nil
    47  	})
    48  	s.Srv = charmstoretesting.OpenServer(c, s.Session, charmstore.ServerParams{
    49  		IdentityLocation: s.discharger.Location(),
    50  		PublicKeyLocator: s.discharger,
    51  	})
    52  	s.PatchValue(&charmrepo.CacheDir, c.MkDir())
    53  	s.PatchValue(&service.NewCharmStore, func(p charmrepo.NewCharmStoreParams) charmrepo.Interface {
    54  		p.URL = s.Srv.URL()
    55  		return charmrepo.NewCharmStore(p)
    56  	})
    57  }
    58  
    59  func (s *CharmStoreSuite) TearDownTest(c *gc.C) {
    60  	s.discharger.Close()
    61  	s.Srv.Close()
    62  	s.CleanupSuite.TearDownTest(c)
    63  }
    64  
    65  func (s *CharmStoreSuite) UploadCharm(c *gc.C, url, name string) (*charm.URL, charm.Charm) {
    66  	id := charm.MustParseReference(url)
    67  	promulgated := false
    68  	if id.User == "" {
    69  		id.User = "who"
    70  		promulgated = true
    71  	}
    72  	ch := testcharms.Repo.CharmArchive(c.MkDir(), name)
    73  	id = s.Srv.UploadCharm(c, ch, id, promulgated)
    74  	curl := (*charm.URL)(id)
    75  	return curl, ch
    76  }