// 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.MeasuredTables)
	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 <StreamDefTable>/<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))
	sgDataTable := db.Table(sbmodel.KStreamDef{}.Table())
	if gotPerms, err := sgDataTable.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)
	}
}
