| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 | /* * EliasDB * * Copyright 2016 Matthias Ladkau. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */package graphstorageimport (	"errors"	"flag"	"fmt"	"os"	"testing"	"devt.de/krotik/common/datautil"	"devt.de/krotik/common/fileutil"	"devt.de/krotik/eliasdb/storage")const diskGraphStorageTestDBDir = "diskgraphstoragetest1"const diskGraphStorageTestDBDir2 = "diskgraphstoragetest2"var dbdirs = []string{diskGraphStorageTestDBDir, diskGraphStorageTestDBDir2}const invalidFileName = "**" + string(0x0)// Main function for all tests in this packagefunc TestMain(m *testing.M) {	flag.Parse()	for _, dbdir := range dbdirs {		if res, _ := fileutil.PathExists(dbdir); res {			if err := os.RemoveAll(dbdir); err != nil {				fmt.Print("Could not remove test directory:", err.Error())			}		}	}	// Run the tests	res := m.Run()	// Teardown	for _, dbdir := range dbdirs {		if res, _ := fileutil.PathExists(dbdir); res {			if err := os.RemoveAll(dbdir); err != nil {				fmt.Print("Could not remove test directory:", err.Error())			}		}	}	os.Exit(res)}func TestDiskGraphStorage(t *testing.T) {	dgsnew, err := NewDiskGraphStorage(diskGraphStorageTestDBDir, false)	if err != nil {		t.Error(err)		return	}	if res := dgsnew.Name(); res != diskGraphStorageTestDBDir {		t.Error("Unexpected name:", res)		return	}	// Check that the storage directory exists	if res, _ := fileutil.PathExists(diskGraphStorageTestDBDir); !res {		t.Error("Storage directory does not exist")		return	}	if res, _ := fileutil.PathExists(diskGraphStorageTestDBDir + "/" + FilenameNameDB); !res {		t.Error("Name DB does not exist")		return	}	// Get a storage file	sm1 := dgsnew.StorageManager("store1.nodes", true)	if sm1 == nil {		t.Error("Unexpected result")		return	}	if res, _ := fileutil.PathExists(diskGraphStorageTestDBDir + "/store1.nodes.db.0"); !res {		t.Error("Storage file does not exist")		return	}	sm2 := dgsnew.StorageManager("store2.nodes", false)	if res, _ := fileutil.PathExists(diskGraphStorageTestDBDir + "/store2.nodes.db.0"); res {		t.Error("Storage file should not have been created")		return	}	if sm2 != nil {		t.Error("Unexpected result")		return	}	m := dgsnew.MainDB()	m["test1"] = "test1value"	dgsnew.FlushMain()	dgsnew.RollbackMain()	if err := dgsnew.FlushAll(); err != nil {		t.Error("Unexpected error return:", err)	}	if err := dgsnew.Close(); err != nil {		t.Error(err)		return	}	// Open the storage again to make sure we can load it	dgs, err := NewDiskGraphStorage(diskGraphStorageTestDBDir, false)	if err != nil {		t.Error(err)		return	}	if res := dgs.MainDB()["test1"]; res != "test1value" {		t.Error("Unexpected value in mainDB value:", res)		return	}	// Check readonly mode	dgs.(*DiskGraphStorage).readonly = true	if err := dgs.RollbackMain(); err.Error() != "GraphError: Failed write to readonly storage (Cannot rollback main db)" {		t.Error("Unexpected error return:", err)	}	if err := dgs.FlushMain(); err.Error() != "GraphError: Failed write to readonly storage (Cannot flush main db)" {		t.Error("Unexpected error return:", err)	}	if err := dgs.FlushAll(); err != nil {		t.Error("Unexpected error return:", err)	}	if err := dgs.Close(); err != nil {		t.Error(err)		return	}}func TestDiskGraphStorageErrors(t *testing.T) {	_, err := NewDiskGraphStorage(invalidFileName, false)	if err == nil {		t.Error("Unexpected new disk graph storage result")		return	}	// Test names map error case	old := FilenameNameDB	FilenameNameDB = invalidFileName	_, err = NewDiskGraphStorage(diskGraphStorageTestDBDir2, false)	if err == nil {		t.Error("Unexpected new disk graph storage result")		FilenameNameDB = old		return	}	_, err = NewDiskGraphStorage(diskGraphStorageTestDBDir2, false)	if err == nil {		t.Error("Unexpected new disk graph storage result")		FilenameNameDB = old		return	}	FilenameNameDB = old	dgs := &DiskGraphStorage{invalidFileName, false, nil,		make(map[string]storage.Manager)}	pm, _ := datautil.NewPersistentStringMap(invalidFileName)	dgs.mainDB = pm	msm := storage.NewMemoryStorageManager("test")	dgs.storagemanagers["test"] = msm	storage.MsmRetFlush = errors.New("TestError")	storage.MsmRetClose = errors.New("TestError")	if err := dgs.RollbackMain(); err == nil {		t.Error("Unexpected flush result")		return	}	if err := dgs.FlushMain(); err == nil {		t.Error("Unexpected flush result")		return	}	if err := dgs.FlushAll(); err == nil {		t.Error("Unexpected flush all result")		return	}	if err := dgs.Close(); err == nil {		t.Error("Unexpected close result")		return	}}
 |