19388: Add tests for activity logs.
authorTom Clegg <tom@curii.com>
Fri, 23 Sep 2022 19:10:13 +0000 (15:10 -0400)
committerTom Clegg <tom@curii.com>
Fri, 23 Sep 2022 19:10:13 +0000 (15:10 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

lib/controller/handler_test.go
lib/controller/localdb/log_activity_test.go

index 39c2b1c68e5c82921e10bc9125d54e17846a8fed..127e6c34c6238ca48487f5cbb72ca1107bfed7da 100644 (file)
@@ -19,6 +19,7 @@ import (
        "testing"
        "time"
 
+       "git.arvados.org/arvados.git/lib/controller/rpc"
        "git.arvados.org/arvados.git/sdk/go/arvados"
        "git.arvados.org/arvados.git/sdk/go/arvadostest"
        "git.arvados.org/arvados.git/sdk/go/auth"
@@ -494,3 +495,38 @@ func (s *HandlerSuite) TestTrashSweep(c *check.C) {
                time.Sleep(time.Second / 10)
        }
 }
+
+func (s *HandlerSuite) TestLogActivity(c *check.C) {
+       s.cluster.SystemRootToken = arvadostest.SystemRootToken
+       s.cluster.Users.ActivityLoggingPeriod = arvados.Duration(24 * time.Hour)
+       s.handler.CheckHealth()
+
+       testServer := newServerFromIntegrationTestEnv(c)
+       testServer.Server.Handler = httpserver.AddRequestIDs(httpserver.LogRequests(s.handler))
+       c.Assert(testServer.Start(), check.IsNil)
+       defer testServer.Close()
+
+       u, _ := url.Parse("http://" + testServer.Addr)
+       client := rpc.NewConn(s.cluster.ClusterID, u, true, rpc.PassthroughTokenProvider)
+
+       starttime := time.Now()
+       for i := 0; i < 4; i++ {
+               for _, token := range []string{
+                       arvadostest.ActiveTokenV2,
+                       arvadostest.ActiveToken,
+                       arvadostest.SpectatorToken,
+               } {
+                       ctx := auth.NewContext(s.ctx, &auth.Credentials{Tokens: []string{token}})
+                       _, err := client.CollectionList(ctx, arvados.ListOptions{})
+                       c.Assert(err, check.IsNil)
+               }
+       }
+       db, err := s.handler.db(s.ctx)
+       c.Assert(err, check.IsNil)
+       for _, userUUID := range []string{arvadostest.ActiveUserUUID, arvadostest.SpectatorUserUUID} {
+               var rows int
+               err = db.QueryRowContext(s.ctx, `select count(uuid) from logs where object_uuid = $1 and event_at > $2`, arvadostest.ActiveUserUUID, starttime.UTC()).Scan(&rows)
+               c.Assert(err, check.IsNil)
+               c.Check(rows, check.Equals, 1, check.Commentf("expect 1 row for user uuid %s", userUUID))
+       }
+}
index 6a9bc45e10c297cf1ef710174bb00eb27909b685..ea7f234cc044e4d90c34e61ee6013ab482455cd1 100644 (file)
@@ -5,8 +5,16 @@
 package localdb
 
 import (
+       "context"
+       "database/sql"
        "time"
 
+       "git.arvados.org/arvados.git/lib/controller/api"
+       "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"
+       "github.com/jmoiron/sqlx"
        check "gopkg.in/check.v1"
 )
 
@@ -44,3 +52,36 @@ func (*activityPeriodSuite) TestPeriod(c *check.C) {
                }
        }
 }
+
+func (s *CollectionSuite) TestLogActivity(c *check.C) {
+       starttime := time.Now()
+       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.WrapCallsWithAuth(s.cluster))
+       collectionCreate := wrap(func(ctx context.Context, opts interface{}) (interface{}, error) {
+               return s.localdb.CollectionCreate(ctx, opts.(arvados.CreateOptions))
+       })
+       ctx := auth.NewContext(context.Background(), &auth.Credentials{Tokens: []string{arvadostest.ActiveTokenV2}})
+       for i := 0; i < 2; i++ {
+               logthreshold := time.Now()
+               _, err := collectionCreate(ctx, arvados.CreateOptions{
+                       Attrs: map[string]interface{}{
+                               "name": "test collection",
+                       },
+                       EnsureUniqueName: true,
+               })
+               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)
+               if i == 0 {
+                       c.Check(err, check.IsNil)
+                       c.Check(uuid, check.HasLen, 27)
+               } else {
+                       c.Check(err, check.Equals, sql.ErrNoRows)
+               }
+       }
+}