// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package measure_test

import (
	"reflect"
	"testing"

	"v.io/v23/security"
	"v.io/v23/security/access"
	_ "v.io/x/ref/runtime/factories/generic"
	sbtu "v.io/x/ref/services/syncbase/testutil"
	"v.io/x/sensorlog/internal/config"
	"v.io/x/sensorlog/internal/measure"
	"v.io/x/sensorlog/internal/sbmodel"
	"v.io/x/sensorlog/internal/sbutil"
)

func TestCreateSyncgroup(t *testing.T) {
	_, ctxMeasured, sbName, _, cleanup := sbtu.SetupOrDieCustom("one", "one:sb", nil)
	defer cleanup()

	// Open app/db (create both) as measured.
	db, err := sbutil.CreateOrOpenDB(ctxMeasured, sbName, sbmodel.MeasuredCollections)
	if err != nil {
		t.Fatalf("CreateOrOpenDB should have succeeded, got error: %v", err)
	}

	devId := "measured1"
	admin := "root:two"
	syncMts := []string{}

	// Creating the syncgroup should succeed.
	if err := measure.InitSyncgroup(ctxMeasured, db, devId, admin, sbName, syncMts); err != nil {
		t.Fatalf("InitSyncgroup failed: %v", err)
	}

	sgName := config.SyncgroupName(sbName, devId)
	if sgs, err := db.GetSyncgroupNames(ctxMeasured); err != nil {
		t.Fatalf("GetSyncgroupNames failed: %v", err)
	} else if got, want := sgs, []string{sgName}; !reflect.DeepEqual(got, want) {
		t.Errorf("GetSyncgroupNames got: %v, want: %v", got, want)
	}

	// Creating the syncgroup should be idempotent.
	if err := measure.InitSyncgroup(ctxMeasured, db, devId, admin, sbName, syncMts); err != nil {
		t.Errorf("InitSyncgroup should be idempotent, retry failed: %v", err)
	}

	// measured should have dropped privileges on <StreamDefCollection>/<devId>.
	expectPerms := access.Permissions{}.
		Add(security.BlessingPattern("root:one"), string(access.Resolve), string(access.Read)).
		Add(security.BlessingPattern("root:two"), string(access.Resolve), string(access.Read), string(access.Write), string(access.Admin))
	sgDataCollection := db.Collection(sbmodel.KStreamDef{}.Collection())
	if gotPerms, err := sgDataCollection.GetPrefixPermissions(ctxMeasured, devId); err != nil {
		t.Errorf("GetPrefixPermissions failed: %v", err)
	} else if got, want := gotPerms[0].Perms.Normalize(), expectPerms.Normalize(); !reflect.DeepEqual(got, want) {
		t.Errorf("Unexpected permissions on streamdef/<devId>: got %v, want %v", got, want)
	}
}
