// 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"

	wire "v.io/v23/services/syncbase"
	_ "v.io/x/ref/runtime/factories/roaming"
	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 (create) db 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(devId)
	if sgs, err := db.ListSyncgroups(ctxMeasured); err != nil {
		t.Fatalf("GetSyncgroupNames failed: %v", err)
	} else if got, want := sgs, []wire.Id{wire.Id{Name: sgName, Blessing: "blessing"}}; !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>.
	// TODO(ivanpi): Prefix ACLs have been removed, use collection ACLs.
}
