// 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/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>.
	// TODO(ivanpi): Prefix ACLs have been removed, use collection ACLs.
}
