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

// A test for localblobstore
package localblobstore_test

import "io/ioutil"
import "os"
import "testing"

import "v.io/x/ref/services/syncbase/localblobstore"
import "v.io/x/ref/services/syncbase/localblobstore/fs_cablobstore"
import "v.io/x/ref/services/syncbase/localblobstore/localblobstore_testlib"
import "v.io/x/ref/services/syncbase/store"
import "v.io/x/ref/test"
import _ "v.io/x/ref/runtime/factories/generic"

// This test case tests adding files, retrieving them and deleting them.  One
// can't retrieve or delete something that hasn't been created, so it's all one
// test case.
func TestAddRetrieveAndDelete(t *testing.T) {
	ctx, shutdown := test.V23Init()
	defer shutdown()

	// Make a temporary directory.
	var err error
	var testDirName string
	testDirName, err = ioutil.TempDir("", "localblobstore_test")
	if err != nil {
		t.Fatalf("localblobstore_test: can't make tmp directory: %v\n", err)
	}
	defer os.RemoveAll(testDirName)

	// Create an fs_cablobstore.
	var bs localblobstore.BlobStore
	bs, err = fs_cablobstore.Create(ctx, store.EngineForTest, testDirName)
	if err != nil {
		t.Fatalf("fs_cablobstore.Create failed: %v", err)
	}

	// Test it.
	localblobstore_testlib.AddRetrieveAndDelete(t, ctx, bs, testDirName)
}

// This test case tests the incremental transfer of blobs via chunks.
func TestWritingViaChunks(t *testing.T) {
	ctx, shutdown := test.V23Init()
	defer shutdown()

	var err error

	// Make a pair of blobstores, each in its own temporary directory.
	const nBlobStores = 2
	var testDirName [nBlobStores]string
	var bs [nBlobStores]localblobstore.BlobStore
	for i := 0; i != nBlobStores; i++ {
		testDirName[i], err = ioutil.TempDir("", "localblobstore_test")
		if err != nil {
			t.Fatalf("localblobstore_test: can't make tmp directory: %v\n", err)
		}
		defer os.RemoveAll(testDirName[i])

		bs[i], err = fs_cablobstore.Create(ctx, store.EngineForTest, testDirName[i])
		if err != nil {
			t.Fatalf("fs_cablobstore.Create failed: %v", err)
		}
	}

	// Test it.
	localblobstore_testlib.WriteViaChunks(t, ctx, bs)
}

// This test case checks that empty blobs can be created, then extended via
// ResumeBlobWriter.
func TestCreateAndResume(t *testing.T) {
	ctx, shutdown := test.V23Init()
	defer shutdown()

	// Make a temporary directory.
	var err error
	var testDirName string
	testDirName, err = ioutil.TempDir("", "localblobstore_test")
	if err != nil {
		t.Fatalf("localblobstore_test: can't make tmp directory: %v\n", err)
	}
	defer os.RemoveAll(testDirName)

	// Create an fs_cablobstore.
	var bs localblobstore.BlobStore
	bs, err = fs_cablobstore.Create(ctx, store.EngineForTest, testDirName)
	if err != nil {
		t.Fatalf("fs_cablobstore.Create failed: %v", err)
	}

	// Test it.
	localblobstore_testlib.CreateAndResume(t, ctx, bs)
}
