// 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("u:one", "u: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:u: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("ListSyncgroups failed: %v", err)
	} else if got, want := sgs, []wire.Id{wire.Id{Blessing: "root:u:one", Name: sgName}}; !reflect.DeepEqual(got, want) {
		t.Errorf("ListSyncgroups 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.
}
