20183: Deduplicate test suite setup.
authorTom Clegg <tom@curii.com>
Sat, 4 Mar 2023 09:15:00 +0000 (04:15 -0500)
committerTom Clegg <tom@curii.com>
Sun, 5 Mar 2023 06:05:42 +0000 (01:05 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/controller/localdb/collection_test.go
lib/controller/localdb/container_gateway_test.go
lib/controller/localdb/container_request_test.go
lib/controller/localdb/group_test.go
lib/controller/localdb/link_test.go
lib/controller/localdb/localdb_test.go [new file with mode: 0644]
lib/controller/localdb/log_activity_test.go
lib/controller/localdb/login_ldap_test.go
lib/controller/localdb/login_oidc_test.go
lib/controller/localdb/login_pam_test.go
lib/controller/localdb/login_testuser_test.go

index d4b60baa0494fe052f5fba5504af862304e14170..241dc246fea36ff4084481cfe1e74a05045fb00a 100644 (file)
@@ -14,14 +14,10 @@ import (
        "strings"
        "time"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadosclient"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        "git.arvados.org/arvados.git/sdk/go/keepclient"
        check "gopkg.in/check.v1"
 )
@@ -29,53 +25,7 @@ import (
 var _ = check.Suite(&CollectionSuite{})
 
 type CollectionSuite struct {
-       cluster  *arvados.Cluster
-       localdb  *Conn
-       railsSpy *arvadostest.Proxy
-}
-
-func (s *CollectionSuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
-func (s *CollectionSuite) SetUpTest(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
-}
-
-func (s *CollectionSuite) TearDownTest(c *check.C) {
-       s.railsSpy.Close()
-}
-
-func (s *CollectionSuite) setUpVocabulary(c *check.C, testVocabulary string) {
-       if testVocabulary == "" {
-               testVocabulary = `{
-                       "strict_tags": false,
-                       "tags": {
-                               "IDTAGIMPORTANCES": {
-                                       "strict": true,
-                                       "labels": [{"label": "Importance"}, {"label": "Priority"}],
-                                       "values": {
-                                               "IDVALIMPORTANCES1": { "labels": [{"label": "Critical"}, {"label": "Urgent"}, {"label": "High"}] },
-                                               "IDVALIMPORTANCES2": { "labels": [{"label": "Normal"}, {"label": "Moderate"}] },
-                                               "IDVALIMPORTANCES3": { "labels": [{"label": "Low"}] }
-                                       }
-                               }
-                       }
-               }`
-       }
-       voc, err := arvados.NewVocabulary([]byte(testVocabulary), []string{})
-       c.Assert(err, check.IsNil)
-       s.cluster.API.VocabularyPath = "foo"
-       s.localdb.vocabularyCache = voc
+       localdbSuite
 }
 
 func (s *CollectionSuite) TestCollectionCreateAndUpdateWithProperties(c *check.C) {
index 92065c9ed91383d11cfec9050ab1a2cd21714855..ad3136fbcb1527450d89b9e9b6ede6a3ff9d0c8e 100644 (file)
@@ -17,11 +17,9 @@ import (
        "strings"
        "time"
 
-       "git.arvados.org/arvados.git/lib/config"
        "git.arvados.org/arvados.git/lib/controller/router"
        "git.arvados.org/arvados.git/lib/controller/rpc"
        "git.arvados.org/arvados.git/lib/crunchrun"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
@@ -33,27 +31,14 @@ import (
 var _ = check.Suite(&ContainerGatewaySuite{})
 
 type ContainerGatewaySuite struct {
-       cluster *arvados.Cluster
-       localdb *Conn
-       ctx     context.Context
+       localdbSuite
        ctrUUID string
        gw      *crunchrun.Gateway
 }
 
-func (s *ContainerGatewaySuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
-func (s *ContainerGatewaySuite) SetUpSuite(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       s.ctx = auth.NewContext(context.Background(), &auth.Credentials{Tokens: []string{arvadostest.ActiveTokenV2}})
+func (s *ContainerGatewaySuite) SetUpTest(c *check.C) {
+       s.localdbSuite.SetUpTest(c)
+       s.ctx = auth.NewContext(s.ctx, &auth.Credentials{Tokens: []string{arvadostest.ActiveTokenV2}})
 
        s.ctrUUID = arvadostest.QueuedContainerUUID
 
@@ -83,21 +68,14 @@ func (s *ContainerGatewaySuite) SetUpSuite(c *check.C) {
                ArvadosClient: ac,
        }
        c.Assert(s.gw.Start(), check.IsNil)
-       rootctx := auth.NewContext(context.Background(), &auth.Credentials{Tokens: []string{s.cluster.SystemRootToken}})
-       _, err = s.localdb.ContainerUpdate(rootctx, arvados.UpdateOptions{
+       rootctx := auth.NewContext(s.ctx, &auth.Credentials{Tokens: []string{s.cluster.SystemRootToken}})
+       // OK if this line fails (because state is already Running
+       // from a previous test case) as long as the following line
+       // succeeds:
+       s.localdb.ContainerUpdate(rootctx, arvados.UpdateOptions{
                UUID: s.ctrUUID,
                Attrs: map[string]interface{}{
                        "state": arvados.ContainerStateLocked}})
-       c.Assert(err, check.IsNil)
-}
-
-func (s *ContainerGatewaySuite) SetUpTest(c *check.C) {
-       // clear any tunnel sessions started by previous test cases
-       s.localdb.gwTunnelsLock.Lock()
-       s.localdb.gwTunnels = nil
-       s.localdb.gwTunnelsLock.Unlock()
-
-       rootctx := auth.NewContext(context.Background(), &auth.Credentials{Tokens: []string{s.cluster.SystemRootToken}})
        _, err := s.localdb.ContainerUpdate(rootctx, arvados.UpdateOptions{
                UUID: s.ctrUUID,
                Attrs: map[string]interface{}{
@@ -107,7 +85,7 @@ func (s *ContainerGatewaySuite) SetUpTest(c *check.C) {
 
        s.cluster.Containers.ShellAccess.Admin = true
        s.cluster.Containers.ShellAccess.User = true
-       _, err = arvadostest.DB(c, s.cluster).Exec(`update containers set interactive_session_started=$1 where uuid=$2`, false, s.ctrUUID)
+       _, err = s.db.Exec(`update containers set interactive_session_started=$1 where uuid=$2`, false, s.ctrUUID)
        c.Check(err, check.IsNil)
 }
 
index 2d89f58ab5325b96993155b0e24f1e6e48085e98..45b6de453b160aacc441a0f978e69e549c0f478a 100644 (file)
@@ -7,66 +7,16 @@ package localdb
 import (
        "context"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&ContainerRequestSuite{})
 
 type ContainerRequestSuite struct {
-       cluster  *arvados.Cluster
-       localdb  *Conn
-       railsSpy *arvadostest.Proxy
-}
-
-func (s *ContainerRequestSuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
-func (s *ContainerRequestSuite) SetUpTest(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
-}
-
-func (s *ContainerRequestSuite) TearDownTest(c *check.C) {
-       s.railsSpy.Close()
-}
-
-func (s *ContainerRequestSuite) setUpVocabulary(c *check.C, testVocabulary string) {
-       if testVocabulary == "" {
-               testVocabulary = `{
-                       "strict_tags": false,
-                       "tags": {
-                               "IDTAGIMPORTANCES": {
-                                       "strict": true,
-                                       "labels": [{"label": "Importance"}, {"label": "Priority"}],
-                                       "values": {
-                                               "IDVALIMPORTANCES1": { "labels": [{"label": "Critical"}, {"label": "Urgent"}, {"label": "High"}] },
-                                               "IDVALIMPORTANCES2": { "labels": [{"label": "Normal"}, {"label": "Moderate"}] },
-                                               "IDVALIMPORTANCES3": { "labels": [{"label": "Low"}] }
-                                       }
-                               }
-                       }
-               }`
-       }
-       voc, err := arvados.NewVocabulary([]byte(testVocabulary), []string{})
-       c.Assert(err, check.IsNil)
-       s.localdb.vocabularyCache = voc
-       s.cluster.API.VocabularyPath = "foo"
+       localdbSuite
 }
 
 func (s *ContainerRequestSuite) TestCRCreateWithProperties(c *check.C) {
index ff80dd5007bbd8e749322e36bbb48c0d62445c78..aa44486ff0b31939db5f24c64f4724ce27a4ed8a 100644 (file)
@@ -7,63 +7,16 @@ package localdb
 import (
        "context"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&GroupSuite{})
 
 type GroupSuite struct {
-       cluster  *arvados.Cluster
-       localdb  *Conn
-       railsSpy *arvadostest.Proxy
-}
-
-func (s *GroupSuite) SetUpSuite(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
-}
-
-func (s *GroupSuite) TearDownSuite(c *check.C) {
-       s.railsSpy.Close()
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
-func (s *GroupSuite) setUpVocabulary(c *check.C, testVocabulary string) {
-       if testVocabulary == "" {
-               testVocabulary = `{
-                       "strict_tags": false,
-                       "tags": {
-                               "IDTAGIMPORTANCES": {
-                                       "strict": true,
-                                       "labels": [{"label": "Importance"}, {"label": "Priority"}],
-                                       "values": {
-                                               "IDVALIMPORTANCES1": { "labels": [{"label": "Critical"}, {"label": "Urgent"}, {"label": "High"}] },
-                                               "IDVALIMPORTANCES2": { "labels": [{"label": "Normal"}, {"label": "Moderate"}] },
-                                               "IDVALIMPORTANCES3": { "labels": [{"label": "Low"}] }
-                                       }
-                               }
-                       }
-               }`
-       }
-       voc, err := arvados.NewVocabulary([]byte(testVocabulary), []string{})
-       c.Assert(err, check.IsNil)
-       s.localdb.vocabularyCache = voc
-       s.cluster.API.VocabularyPath = "foo"
+       localdbSuite
 }
 
 func (s *GroupSuite) TestGroupCreateWithProperties(c *check.C) {
index f28b32eb0d441e2df9ec2ae32bfb2d1a8c968167..7f0a30af65d01e456d656a04fef9979b66d73113 100644 (file)
@@ -7,66 +7,16 @@ package localdb
 import (
        "context"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&LinkSuite{})
 
 type LinkSuite struct {
-       cluster  *arvados.Cluster
-       localdb  *Conn
-       railsSpy *arvadostest.Proxy
-}
-
-func (s *LinkSuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
-func (s *LinkSuite) SetUpTest(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
-}
-
-func (s *LinkSuite) TearDownTest(c *check.C) {
-       s.railsSpy.Close()
-}
-
-func (s *LinkSuite) setUpVocabulary(c *check.C, testVocabulary string) {
-       if testVocabulary == "" {
-               testVocabulary = `{
-                       "strict_tags": false,
-                       "tags": {
-                               "IDTAGIMPORTANCES": {
-                                       "strict": true,
-                                       "labels": [{"label": "Importance"}, {"label": "Priority"}],
-                                       "values": {
-                                               "IDVALIMPORTANCES1": { "labels": [{"label": "Critical"}, {"label": "Urgent"}, {"label": "High"}] },
-                                               "IDVALIMPORTANCES2": { "labels": [{"label": "Normal"}, {"label": "Moderate"}] },
-                                               "IDVALIMPORTANCES3": { "labels": [{"label": "Low"}] }
-                                       }
-                               }
-                       }
-               }`
-       }
-       voc, err := arvados.NewVocabulary([]byte(testVocabulary), []string{})
-       c.Assert(err, check.IsNil)
-       s.localdb.vocabularyCache = voc
-       s.cluster.API.VocabularyPath = "foo"
+       localdbSuite
 }
 
 func (s *LinkSuite) TestLinkCreateWithProperties(c *check.C) {
diff --git a/lib/controller/localdb/localdb_test.go b/lib/controller/localdb/localdb_test.go
new file mode 100644 (file)
index 0000000..3e7c742
--- /dev/null
@@ -0,0 +1,91 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package localdb
+
+import (
+       "context"
+
+       "git.arvados.org/arvados.git/lib/config"
+       "git.arvados.org/arvados.git/lib/controller/rpc"
+       "git.arvados.org/arvados.git/lib/ctrlctx"
+       "git.arvados.org/arvados.git/sdk/go/arvados"
+       "git.arvados.org/arvados.git/sdk/go/arvadostest"
+       "git.arvados.org/arvados.git/sdk/go/ctxlog"
+       "github.com/jmoiron/sqlx"
+       check "gopkg.in/check.v1"
+)
+
+type localdbSuite struct {
+       ctx         context.Context
+       cancel      context.CancelFunc
+       cluster     *arvados.Cluster
+       db          *sqlx.DB
+       dbConnector *ctrlctx.DBConnector
+       tx          *sqlx.Tx
+       localdb     *Conn
+       railsSpy    *arvadostest.Proxy
+}
+
+func (s *localdbSuite) TearDownSuite(c *check.C) {
+       // Undo any changes/additions to the user database so they
+       // don't affect subsequent tests.
+       arvadostest.ResetEnv()
+       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
+}
+
+func (s *localdbSuite) SetUpTest(c *check.C) {
+       *s = localdbSuite{}
+       s.ctx, s.cancel = context.WithCancel(context.Background())
+       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
+       c.Assert(err, check.IsNil)
+       s.cluster, err = cfg.GetCluster("")
+       c.Assert(err, check.IsNil)
+       s.dbConnector = &ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}
+       s.db, err = s.dbConnector.GetDB(s.ctx)
+       c.Assert(err, check.IsNil)
+       s.localdb = NewConn(s.ctx, s.cluster, s.dbConnector.GetDB)
+       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
+       *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
+
+       s.tx, err = s.db.Beginx()
+       c.Assert(err, check.IsNil)
+       s.ctx = ctrlctx.NewWithTransaction(s.ctx, s.tx)
+}
+
+func (s *localdbSuite) TearDownTest(c *check.C) {
+       if s.tx != nil {
+               s.tx.Rollback()
+       }
+       if s.railsSpy != nil {
+               s.railsSpy.Close()
+       }
+       if s.dbConnector != nil {
+               s.dbConnector.Close()
+       }
+       s.cancel()
+}
+
+func (s *localdbSuite) setUpVocabulary(c *check.C, testVocabulary string) {
+       if testVocabulary == "" {
+               testVocabulary = `{
+                       "strict_tags": false,
+                       "tags": {
+                               "IDTAGIMPORTANCES": {
+                                       "strict": true,
+                                       "labels": [{"label": "Importance"}, {"label": "Priority"}],
+                                       "values": {
+                                               "IDVALIMPORTANCES1": { "labels": [{"label": "Critical"}, {"label": "Urgent"}, {"label": "High"}] },
+                                               "IDVALIMPORTANCES2": { "labels": [{"label": "Normal"}, {"label": "Moderate"}] },
+                                               "IDVALIMPORTANCES3": { "labels": [{"label": "Low"}] }
+                                       }
+                               }
+                       }
+               }`
+       }
+       voc, err := arvados.NewVocabulary([]byte(testVocabulary), []string{})
+       c.Assert(err, check.IsNil)
+       s.localdb.vocabularyCache = voc
+       s.cluster.API.VocabularyPath = "foo"
+}
index ea7f234cc044e4d90c34e61ee6013ab482455cd1..b52bb162e70b8148ecfcced4a5fb7e0e4503761b 100644 (file)
@@ -58,9 +58,8 @@ func (s *CollectionSuite) TestLogActivity(c *check.C) {
        s.localdb.activeUsersLock.Lock()
        s.localdb.activeUsersReset = starttime
        s.localdb.activeUsersLock.Unlock()
-       db := arvadostest.DB(c, s.cluster)
        wrap := api.ComposeWrappers(
-               ctrlctx.WrapCallsInTransactions(func(ctx context.Context) (*sqlx.DB, error) { return db, nil }),
+               ctrlctx.WrapCallsInTransactions(func(ctx context.Context) (*sqlx.DB, error) { return s.db, nil }),
                ctrlctx.WrapCallsWithAuth(s.cluster))
        collectionCreate := wrap(func(ctx context.Context, opts interface{}) (interface{}, error) {
                return s.localdb.CollectionCreate(ctx, opts.(arvados.CreateOptions))
@@ -76,7 +75,7 @@ func (s *CollectionSuite) TestLogActivity(c *check.C) {
                })
                c.Assert(err, check.IsNil)
                var uuid string
-               err = db.QueryRowContext(ctx, `select uuid from logs where object_uuid = $1 and event_at > $2`, arvadostest.ActiveUserUUID, logthreshold.UTC()).Scan(&uuid)
+               err = s.db.QueryRowContext(ctx, `select uuid from logs where object_uuid = $1 and event_at > $2`, arvadostest.ActiveUserUUID, logthreshold.UTC()).Scan(&uuid)
                if i == 0 {
                        c.Check(err, check.IsNil)
                        c.Check(uuid, check.HasLen, 27)
index 1487d46f2fc765947f7d1405293b30685e2950d6..69b7f57801af9bc74886d4408f2f14ea24a969cd 100644 (file)
@@ -5,48 +5,27 @@
 package localdb
 
 import (
-       "context"
        "encoding/json"
        "net"
        "net/http"
 
-       "git.arvados.org/arvados.git/lib/config"
        "git.arvados.org/arvados.git/lib/controller/railsproxy"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
-       "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
        "git.arvados.org/arvados.git/sdk/go/ctxlog"
        "github.com/bradleypeabody/godap"
-       "github.com/jmoiron/sqlx"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&LDAPSuite{})
 
 type LDAPSuite struct {
-       cluster *arvados.Cluster
-       ctrl    *ldapLoginController
-       ldap    *godap.LDAPServer // fake ldap server that accepts auth goodusername/goodpassword
-       db      *sqlx.DB
-
-       // transaction context
-       ctx      context.Context
-       rollback func() error
-}
-
-func (s *LDAPSuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
+       localdbSuite
+       ldap *godap.LDAPServer // fake ldap server that accepts auth goodusername/goodpassword
 }
 
-func (s *LDAPSuite) SetUpSuite(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
+func (s *LDAPSuite) SetUpTest(c *check.C) {
+       s.localdbSuite.SetUpTest(c)
 
        ln, err := net.Listen("tcp", "127.0.0.1:0")
        c.Assert(err, check.IsNil)
@@ -84,35 +63,19 @@ func (s *LDAPSuite) SetUpSuite(c *check.C) {
 
        s.cluster.Login.LDAP.Enable = true
        err = json.Unmarshal([]byte(`"ldap://`+ln.Addr().String()+`"`), &s.cluster.Login.LDAP.URL)
+       c.Assert(err, check.IsNil)
        s.cluster.Login.LDAP.StartTLS = false
        s.cluster.Login.LDAP.SearchBindUser = "cn=goodusername,dc=example,dc=com"
        s.cluster.Login.LDAP.SearchBindPassword = "goodpassword"
        s.cluster.Login.LDAP.SearchBase = "dc=example,dc=com"
-       c.Assert(err, check.IsNil)
-       s.ctrl = &ldapLoginController{
+       s.localdb.loginController = &ldapLoginController{
                Cluster: s.cluster,
-               Parent:  &Conn{railsProxy: railsproxy.NewConn(s.cluster)},
-       }
-       s.db = arvadostest.DB(c, s.cluster)
-}
-
-func (s *LDAPSuite) SetUpTest(c *check.C) {
-       tx, err := s.db.Beginx()
-       c.Assert(err, check.IsNil)
-       s.ctx = ctrlctx.NewWithTransaction(context.Background(), tx)
-       s.rollback = tx.Rollback
-}
-
-func (s *LDAPSuite) TearDownTest(c *check.C) {
-       if s.rollback != nil {
-               s.rollback()
+               Parent:  s.localdb,
        }
 }
 
 func (s *LDAPSuite) TestLoginSuccess(c *check.C) {
-       conn := NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
-       conn.loginController = s.ctrl
-       resp, err := conn.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+       resp, err := s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                Username: "goodusername",
                Password: "goodpassword",
        })
@@ -131,7 +94,7 @@ func (s *LDAPSuite) TestLoginSuccess(c *check.C) {
 func (s *LDAPSuite) TestLoginFailure(c *check.C) {
        // search returns no results
        s.cluster.Login.LDAP.SearchBase = "dc=example,dc=invalid"
-       resp, err := s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+       resp, err := s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                Username: "goodusername",
                Password: "goodpassword",
        })
@@ -144,7 +107,7 @@ func (s *LDAPSuite) TestLoginFailure(c *check.C) {
 
        // search returns result, but auth fails
        s.cluster.Login.LDAP.SearchBase = "dc=example,dc=com"
-       resp, err = s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+       resp, err = s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                Username: "badusername",
                Password: "badpassword",
        })
index 582c0ac2ab0705d04c78c0ac4776a7f8495303f3..5088de6bad3295263321bf0dd7e42aa592a0fe45 100644 (file)
@@ -21,13 +21,11 @@ import (
        "testing"
        "time"
 
-       "git.arvados.org/arvados.git/lib/config"
        "git.arvados.org/arvados.git/lib/controller/rpc"
        "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
        "github.com/jmoiron/sqlx"
        check "gopkg.in/check.v1"
 )
@@ -40,20 +38,11 @@ func Test(t *testing.T) {
 var _ = check.Suite(&OIDCLoginSuite{})
 
 type OIDCLoginSuite struct {
-       cluster      *arvados.Cluster
-       localdb      *Conn
-       railsSpy     *arvadostest.Proxy
+       localdbSuite
        trustedURL   *arvados.URL
        fakeProvider *arvadostest.OIDCProvider
 }
 
-func (s *OIDCLoginSuite) TearDownSuite(c *check.C) {
-       // Undo any changes/additions to the user database so they
-       // don't affect subsequent tests.
-       arvadostest.ResetEnv()
-       c.Check(arvados.NewClientFromEnv().RequestAndDecode(nil, "POST", "database/reset", nil, nil), check.IsNil)
-}
-
 func (s *OIDCLoginSuite) SetUpTest(c *check.C) {
        s.trustedURL = &arvados.URL{Scheme: "https", Host: "app.example.com", Path: "/"}
 
@@ -66,10 +55,8 @@ func (s *OIDCLoginSuite) SetUpTest(c *check.C) {
        s.fakeProvider.ValidCode = fmt.Sprintf("abcdefgh-%d", time.Now().Unix())
        s.fakeProvider.PeopleAPIResponse = map[string]interface{}{}
 
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
+       s.localdbSuite.SetUpTest(c)
+
        s.cluster.Login.Test.Enable = false
        s.cluster.Login.Google.Enable = true
        s.cluster.Login.Google.ClientID = "test%client$id"
@@ -79,19 +66,14 @@ func (s *OIDCLoginSuite) SetUpTest(c *check.C) {
        s.fakeProvider.ValidClientID = "test%client$id"
        s.fakeProvider.ValidClientSecret = "test#client/secret"
 
-       s.localdb = NewConn(context.Background(), s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
+       s.localdb = NewConn(s.ctx, s.cluster, (&ctrlctx.DBConnector{PostgreSQL: s.cluster.PostgreSQL}).GetDB)
        c.Assert(s.localdb.loginController, check.FitsTypeOf, (*oidcLoginController)(nil))
        s.localdb.loginController.(*oidcLoginController).Issuer = s.fakeProvider.Issuer.URL
        s.localdb.loginController.(*oidcLoginController).peopleAPIBasePath = s.fakeProvider.PeopleAPI.URL
 
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
        *s.localdb.railsProxy = *rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)
 }
 
-func (s *OIDCLoginSuite) TearDownTest(c *check.C) {
-       s.railsSpy.Close()
-}
-
 func (s *OIDCLoginSuite) TestGoogleLogout(c *check.C) {
        s.cluster.Login.TrustedClients[arvados.URL{Scheme: "https", Host: "foo.example", Path: "/"}] = struct{}{}
        s.cluster.Login.TrustPrivateNetworks = false
index 0282b566f1a2c93dfddda8d39f44154ac0e5460c..2c3fa4d0f72f34da5495657d8b75a18ce53d8e44 100644 (file)
@@ -5,63 +5,33 @@
 package localdb
 
 import (
-       "context"
        "io/ioutil"
        "net/http"
        "os"
        "strings"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
-       "git.arvados.org/arvados.git/sdk/go/arvadostest"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
-       "github.com/jmoiron/sqlx"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&PamSuite{})
 
 type PamSuite struct {
-       cluster  *arvados.Cluster
-       ctrl     *pamLoginController
-       railsSpy *arvadostest.Proxy
-       db       *sqlx.DB
-       ctx      context.Context
-       rollback func() error
+       localdbSuite
 }
 
-func (s *PamSuite) SetUpSuite(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
+func (s *PamSuite) SetUpTest(c *check.C) {
+       s.localdbSuite.SetUpTest(c)
        s.cluster.Login.PAM.Enable = true
        s.cluster.Login.PAM.DefaultEmailDomain = "example.com"
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       s.ctrl = &pamLoginController{
+       s.localdb.loginController = &pamLoginController{
                Cluster: s.cluster,
-               Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)},
-       }
-       s.db = arvadostest.DB(c, s.cluster)
-}
-
-func (s *PamSuite) SetUpTest(c *check.C) {
-       tx, err := s.db.Beginx()
-       c.Assert(err, check.IsNil)
-       s.ctx = ctrlctx.NewWithTransaction(context.Background(), tx)
-       s.rollback = tx.Rollback
-}
-
-func (s *PamSuite) TearDownTest(c *check.C) {
-       if s.rollback != nil {
-               s.rollback()
+               Parent:  s.localdb,
        }
 }
 
 func (s *PamSuite) TestLoginFailure(c *check.C) {
-       resp, err := s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+       resp, err := s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                Username: "bogususername",
                Password: "boguspassword",
        })
@@ -91,7 +61,7 @@ func (s *PamSuite) TestLoginSuccess(c *check.C) {
        c.Assert(len(lines), check.Equals, 2, check.Commentf("credentials file %s should contain \"username\\npassword\"", testCredsFile))
        u, p := lines[0], lines[1]
 
-       resp, err := s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+       resp, err := s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                Username: u,
                Password: p,
        })
index 8717617889bcd8d8fbf5a3e8e43c4d6852834a70..d5d3c2ff1ed8bb869ac90faded2b535873825d94 100644 (file)
@@ -5,59 +5,30 @@
 package localdb
 
 import (
-       "context"
        "database/sql"
 
-       "git.arvados.org/arvados.git/lib/config"
-       "git.arvados.org/arvados.git/lib/controller/rpc"
-       "git.arvados.org/arvados.git/lib/ctrlctx"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
-       "git.arvados.org/arvados.git/sdk/go/ctxlog"
-       "github.com/jmoiron/sqlx"
        check "gopkg.in/check.v1"
 )
 
 var _ = check.Suite(&TestUserSuite{})
 
 type TestUserSuite struct {
-       cluster  *arvados.Cluster
-       ctrl     *testLoginController
-       railsSpy *arvadostest.Proxy
-       db       *sqlx.DB
-
-       // transaction context
-       ctx context.Context
-       tx  *sqlx.Tx
+       localdbSuite
 }
 
-func (s *TestUserSuite) SetUpSuite(c *check.C) {
-       cfg, err := config.NewLoader(nil, ctxlog.TestLogger(c)).Load()
-       c.Assert(err, check.IsNil)
-       s.cluster, err = cfg.GetCluster("")
-       c.Assert(err, check.IsNil)
+func (s *TestUserSuite) SetUpTest(c *check.C) {
+       s.localdbSuite.SetUpTest(c)
        s.cluster.Login.Test.Enable = true
        s.cluster.Login.Test.Users = map[string]arvados.TestUser{
                "valid": {Email: "valid@example.com", Password: "v@l1d"},
        }
-       s.railsSpy = arvadostest.NewProxy(c, s.cluster.Services.RailsAPI)
-       s.ctrl = &testLoginController{
+       s.localdb.loginController = &testLoginController{
                Cluster: s.cluster,
-               Parent:  &Conn{railsProxy: rpc.NewConn(s.cluster.ClusterID, s.railsSpy.URL, true, rpc.PassthroughTokenProvider)},
+               Parent:  s.localdb,
        }
-       s.db = arvadostest.DB(c, s.cluster)
-}
-
-func (s *TestUserSuite) SetUpTest(c *check.C) {
-       tx, err := s.db.Beginx()
-       c.Assert(err, check.IsNil)
-       s.ctx = ctrlctx.NewWithTransaction(context.Background(), tx)
-       s.tx = tx
-}
-
-func (s *TestUserSuite) TearDownTest(c *check.C) {
-       s.tx.Rollback()
 }
 
 func (s *TestUserSuite) TestLogin(c *check.C) {
@@ -74,7 +45,7 @@ func (s *TestUserSuite) TestLogin(c *check.C) {
                {true, "valid@example.com", "v@l1d"},
        } {
                c.Logf("=== %#v", trial)
-               resp, err := s.ctrl.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
+               resp, err := s.localdb.UserAuthenticate(s.ctx, arvados.UserAuthenticateOptions{
                        Username: trial.username,
                        Password: trial.password,
                })
@@ -94,7 +65,7 @@ func (s *TestUserSuite) TestLogin(c *check.C) {
 }
 
 func (s *TestUserSuite) TestLoginForm(c *check.C) {
-       resp, err := s.ctrl.Login(s.ctx, arvados.LoginOptions{
+       resp, err := s.localdb.Login(s.ctx, arvados.LoginOptions{
                ReturnTo: "https://localhost:12345/example",
        })
        c.Check(err, check.IsNil)
@@ -133,7 +104,7 @@ func (s *TestUserSuite) TestExpireTokenOnLogout(c *check.C) {
                        c.Check(err, check.IsNil)
                }
 
-               resp, err := s.ctrl.Logout(ctx, arvados.LogoutOptions{
+               resp, err := s.localdb.Logout(ctx, arvados.LogoutOptions{
                        ReturnTo: returnTo,
                })
                c.Check(err, check.IsNil)