// 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/verror"
	_ "v.io/x/ref/runtime/factories/generic"
	sbtu "v.io/x/ref/services/syncbase/testutil"
	"v.io/x/sensorlog_lite/internal/config"
	"v.io/x/sensorlog_lite/internal/measure"
	"v.io/x/sensorlog_lite/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, config.AllTables)
	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>.
	sgDataRow := db.Table(config.StreamDefTable).Row(devId + "$" + "foo")
	if err := sgDataRow.Put(ctxMeasured, "bar"); verror.ErrorID(err) != verror.ErrNoAccess.ID {
		t.Errorf("Put by measured should have failed with ErrNoAccess, got: %v", err)
	}
}
