github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/basesuite_test.go (about)

     1  // Copyright 2019 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package apiserver_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/loggo"
    11  	"github.com/juju/pubsub/v2"
    12  	"github.com/juju/testing"
    13  	jc "github.com/juju/testing/checkers"
    14  	"github.com/juju/worker/v3/workertest"
    15  	"github.com/prometheus/client_golang/prometheus"
    16  	gc "gopkg.in/check.v1"
    17  
    18  	"github.com/juju/juju/api"
    19  	"github.com/juju/juju/apiserver"
    20  	"github.com/juju/juju/apiserver/testserver"
    21  	"github.com/juju/juju/core/cache"
    22  	"github.com/juju/juju/state"
    23  	statetesting "github.com/juju/juju/state/testing"
    24  	"github.com/juju/juju/worker/gate"
    25  	"github.com/juju/juju/worker/modelcache"
    26  	"github.com/juju/juju/worker/multiwatcher"
    27  )
    28  
    29  type baseSuite struct {
    30  	statetesting.StateSuite
    31  
    32  	controller *cache.Controller
    33  
    34  	cfg apiserver.ServerConfig
    35  }
    36  
    37  func (s *baseSuite) SetUpTest(c *gc.C) {
    38  	s.StateSuite.SetUpTest(c)
    39  	loggo.GetLogger("juju.apiserver").SetLogLevel(loggo.TRACE)
    40  
    41  	allWatcherBacking, err := state.NewAllWatcherBacking(s.StatePool)
    42  	c.Assert(err, jc.ErrorIsNil)
    43  	multiWatcherWorker, err := multiwatcher.NewWorker(multiwatcher.Config{
    44  		Clock:                clock.WallClock,
    45  		Logger:               loggo.GetLogger("test"),
    46  		Backing:              allWatcherBacking,
    47  		PrometheusRegisterer: noopRegisterer{},
    48  	})
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	// The worker itself is a coremultiwatcher.Factory.
    51  	s.AddCleanup(func(c *gc.C) { workertest.CleanKill(c, multiWatcherWorker) })
    52  
    53  	initialized := gate.NewLock()
    54  	modelCache, err := modelcache.NewWorker(modelcache.Config{
    55  		StatePool:            s.StatePool,
    56  		Hub:                  pubsub.NewStructuredHub(nil),
    57  		InitializedGate:      initialized,
    58  		Logger:               loggo.GetLogger("modelcache"),
    59  		WatcherFactory:       multiWatcherWorker.WatchController,
    60  		PrometheusRegisterer: noopRegisterer{},
    61  		Cleanup:              func() {},
    62  	}.WithDefaultRestartStrategy())
    63  	c.Assert(err, jc.ErrorIsNil)
    64  	s.AddCleanup(func(c *gc.C) { workertest.CleanKill(c, modelCache) })
    65  
    66  	select {
    67  	case <-initialized.Unlocked():
    68  	case <-time.After(testing.LongWait):
    69  		c.Fatalf("model cache not initialized after %s", testing.LongWait)
    70  	}
    71  	err = modelcache.ExtractCacheController(modelCache, &s.controller)
    72  	c.Assert(err, jc.ErrorIsNil)
    73  
    74  	s.cfg = testserver.DefaultServerConfig(c, s.Clock)
    75  	s.cfg.Controller = s.controller
    76  }
    77  
    78  func (s *baseSuite) newServer(c *gc.C) *testserver.Server {
    79  	server := testserver.NewServerWithConfig(c, s.StatePool, s.cfg)
    80  	s.AddCleanup(func(c *gc.C) {
    81  		workertest.CleanKill(c, server.APIServer)
    82  		server.HTTPServer.Close()
    83  	})
    84  	server.Info.ModelTag = s.Model.ModelTag()
    85  	return server
    86  }
    87  
    88  func (s *baseSuite) openAPIWithoutLogin(c *gc.C, info0 *api.Info) api.Connection {
    89  	info := *info0
    90  	info.Tag = nil
    91  	info.Password = ""
    92  	info.SkipLogin = true
    93  	info.Macaroons = nil
    94  	st, err := api.Open(&info, fastDialOpts)
    95  	c.Assert(err, jc.ErrorIsNil)
    96  	s.AddCleanup(func(*gc.C) { _ = st.Close() })
    97  	return st
    98  }
    99  
   100  // derivedSuite is just here to test newServer is clean.
   101  type derivedSuite struct {
   102  	baseSuite
   103  }
   104  
   105  var _ = gc.Suite(&derivedSuite{})
   106  
   107  func (s *derivedSuite) TestNewServer(c *gc.C) {
   108  	_ = s.newServer(c)
   109  }
   110  
   111  type noopRegisterer struct {
   112  	prometheus.Registerer
   113  }
   114  
   115  func (noopRegisterer) Register(prometheus.Collector) error {
   116  	return nil
   117  }
   118  
   119  func (noopRegisterer) Unregister(prometheus.Collector) bool {
   120  	return true
   121  }