about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorBen Morrison <ben@gbmor.dev>2019-06-11 23:07:30 -0400
committerBen Morrison <ben@gbmor.dev>2019-06-11 23:34:33 -0400
commitbc6811abf19a8e7ab0fd463f966a874b5982ca2c (patch)
treed4e9326d03cc5860582ff33372192d2a6d3d9390
parent3681615abf46112646c009cf17f29d07c2755c11 (diff)
downloadgetwtxt-bc6811abf19a8e7ab0fd463f966a874b5982ca2c.tar.gz
cache.go tests finished
-rw-r--r--svc/cache_test.go90
-rw-r--r--svc/init_test.go40
2 files changed, 113 insertions, 17 deletions
diff --git a/svc/cache_test.go b/svc/cache_test.go
index 8b9b06d..8702a83 100644
--- a/svc/cache_test.go
+++ b/svc/cache_test.go
@@ -1,11 +1,54 @@
 package svc // import "github.com/getwtxt/getwtxt/svc"
 
 import (
+	"bytes"
+	"html/template"
+	"io/ioutil"
+	"os"
+	"reflect"
 	"testing"
 
 	"github.com/getwtxt/registry"
 )
 
+func Test_initTemplates(t *testing.T) {
+	initTestConf()
+
+	tmpls = initTemplates()
+	manual := template.Must(template.ParseFiles("../assets/tmpl/index.html"))
+
+	t.Run("Checking if Deeply Equal", func(t *testing.T) {
+		if !reflect.DeepEqual(tmpls, manual) {
+			t.Errorf("Returned template doesn't match manual parse\n")
+		}
+	})
+}
+
+func Test_cacheUpdate(t *testing.T) {
+	initTestConf()
+	mockRegistry()
+	killStatuses()
+
+	cacheUpdate()
+	urls := "https://gbmor.dev/twtxt.txt"
+	newStatus := twtxtCache.Users[urls].Status
+
+	t.Run("Checking for any data", func(t *testing.T) {
+
+		if len(newStatus) <= 1 {
+			t.Errorf("Statuses weren't pulled\n")
+		}
+	})
+	t.Run("Checking if Deeply Equal", func(t *testing.T) {
+		raw, _, _ := registry.GetTwtxt(urls)
+		manual, _ := registry.ParseUserTwtxt(raw, "gbmor", urls)
+
+		if !reflect.DeepEqual(newStatus, manual) {
+			t.Errorf("Updated statuses don't match a manual fetch.\n")
+		}
+	})
+}
+
 func Benchmark_cacheUpdate(b *testing.B) {
 	initTestConf()
 	mockRegistry()
@@ -19,19 +62,50 @@ func Benchmark_cacheUpdate(b *testing.B) {
 		// of its performance in both cases.
 		if i > 2 && i%2 == 0 {
 			b.StopTimer()
-			twtxtCache.Mu.Lock()
-			user := twtxtCache.Users["https://gbmor.dev/twtxt.txt"]
-			user.Mu.Lock()
-			user.Status = registry.NewTimeMap()
-			user.RLen = "0"
-			twtxtCache.Users["https://gbmor.dev/twtxt.txt"] = user
-			user.Mu.Unlock()
-			twtxtCache.Mu.Unlock()
+			killStatuses()
 			b.StartTimer()
 		}
 	}
 }
 
+func Test_pingAssets(t *testing.T) {
+	initTestConf()
+	tmpls = initTemplates()
+
+	b := []byte{}
+	buf := bytes.NewBuffer(b)
+
+	cssStat, _ := os.Stat("../assets/style.css")
+	css, _ := ioutil.ReadFile("../assets/style.css")
+	indStat, _ := os.Stat("../assets/tmpl/index.html")
+	tmpls.ExecuteTemplate(buf, "index.html", confObj.Instance)
+	ind := buf.Bytes()
+
+	pingAssets()
+
+	t.Run("Checking if index Deeply Equal", func(t *testing.T) {
+		if !reflect.DeepEqual(staticCache.index, ind) {
+			t.Errorf("Index not equivalent to manual parse\n")
+		}
+	})
+	t.Run("Checking index Mod Times", func(t *testing.T) {
+		if indStat.ModTime() != staticCache.indexMod {
+			t.Errorf("Index mod time mismatch\n")
+		}
+	})
+	t.Run("Checking if CSS Deeply Equal", func(t *testing.T) {
+		if !reflect.DeepEqual(staticCache.css, css) {
+			t.Errorf("CSS not equivalent to manual read\n")
+		}
+	})
+	t.Run("Checking CSS Mod Times", func(t *testing.T) {
+		if cssStat.ModTime() != staticCache.cssMod {
+			t.Errorf("CSS mod time mismatch\n")
+		}
+	})
+
+}
+
 func Benchmark_pingAssets(b *testing.B) {
 	initTestConf()
 	b.ResetTimer()
diff --git a/svc/init_test.go b/svc/init_test.go
index 8b68839..7ddd563 100644
--- a/svc/init_test.go
+++ b/svc/init_test.go
@@ -16,6 +16,7 @@ var (
 	testport     string
 	initTestOnce sync.Once
 	initDBOnce   sync.Once
+	initPersOnce sync.Once
 )
 
 func initTestConf() {
@@ -38,6 +39,12 @@ func initTestDB() {
 	})
 }
 
+func initTestPers() {
+	initPersOnce.Do(func() {
+		initPersistence()
+	})
+}
+
 func logToNull() {
 	hush, err := os.Open("/dev/null")
 	if err != nil {
@@ -47,17 +54,20 @@ func logToNull() {
 }
 
 func testConfig() {
-
 	viper.SetConfigName("getwtxt")
 	viper.SetConfigType("yml")
-	viper.AddConfigPath("..")
+	viper.AddConfigPath("../")
 
+	viper.SetDefault("BehindProxy", true)
+	viper.SetDefault("UseTLS", false)
+	viper.SetDefault("TLSCert", "/etc/ssl/getwtxt.pem")
+	viper.SetDefault("TLSKey", "/etc/ssl/private/getwtxt.pem")
 	viper.SetDefault("ListenPort", 9001)
 	viper.SetDefault("DatabasePath", "getwtxt.db")
 	viper.SetDefault("AssetsDirectory", "assets")
 	viper.SetDefault("DatabaseType", "leveldb")
-	viper.SetDefault("ReCacheInterval", "1h")
-	viper.SetDefault("DatabasePushInterval", "5m")
+	viper.SetDefault("ReCacheInterval", "9m")
+	viper.SetDefault("DatabasePushInterval", "4m")
 	viper.SetDefault("Instance.SiteName", "getwtxt")
 	viper.SetDefault("Instance.OwnerName", "Anonymous Microblogger")
 	viper.SetDefault("Instance.Email", "nobody@knows")
@@ -69,15 +79,10 @@ func testConfig() {
 
 	confObj.Port = viper.GetInt("ListenPort")
 	confObj.AssetsDir = "../" + viper.GetString("AssetsDirectory")
-
 	confObj.DBType = strings.ToLower(viper.GetString("DatabaseType"))
 	confObj.DBPath = viper.GetString("DatabasePath")
-	log.Printf("Using %v database: %v\n", confObj.DBType, confObj.DBPath)
-
 	confObj.CacheInterval = viper.GetDuration("StatusFetchInterval")
-	log.Printf("User status fetch interval: %v\n", confObj.CacheInterval)
 	confObj.DBInterval = viper.GetDuration("DatabasePushInterval")
-	log.Printf("Database push interval: %v\n", confObj.DBInterval)
 
 	confObj.Instance.Vers = Vers
 	confObj.Instance.Name = viper.GetString("Instance.SiteName")
@@ -87,9 +92,26 @@ func testConfig() {
 	confObj.Instance.Desc = viper.GetString("Instance.Description")
 }
 
+// Creates a fresh mock registry, with a single
+// user and their statuses, for testing.
 func mockRegistry() {
 	twtxtCache = registry.NewIndex()
 	statuses, _, _ := registry.GetTwtxt("https://gbmor.dev/twtxt.txt")
 	parsed, _ := registry.ParseUserTwtxt(statuses, "gbmor", "https://gbmor.dev/twtxt.txt")
 	_ = twtxtCache.AddUser("gbmor", "https://gbmor.dev/twtxt.txt", "1", net.ParseIP("127.0.0.1"), parsed)
 }
+
+// Empties the mock registry's user of statuses
+// for functions that test status modifications
+func killStatuses() {
+	twtxtCache.Mu.Lock()
+	user := twtxtCache.Users["https://gbmor.dev/twtxt.txt"]
+	user.Mu.Lock()
+
+	user.Status = registry.NewTimeMap()
+	user.RLen = "0"
+	twtxtCache.Users["https://gbmor.dev/twtxt.txt"] = user
+
+	user.Mu.Unlock()
+	twtxtCache.Mu.Unlock()
+}