imposm3/cache/osm_test.go

182 lines
3.4 KiB
Go

package cache
import (
"io/ioutil"
"math/rand"
"os"
"testing"
"github.com/omniscale/imposm3/element"
)
func TestCreateCache(t *testing.T) {
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newNodesCache(cache_dir)
if err != nil {
t.Fatal()
}
defer cache.Close()
if stat, err := os.Stat(cache_dir); err != nil || !stat.IsDir() {
t.Error("cache dir not created")
}
}
func TestReadWriteNode(t *testing.T) {
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newNodesCache(cache_dir)
if err != nil {
t.Fatal()
}
node := &element.Node{
OSMElem: element.OSMElem{
Id: 1234,
Tags: element.Tags{"foo": "bar"}},
}
cache.PutNode(node)
cache.Close()
cache, err = newNodesCache(cache_dir)
if err != nil {
t.Fatal()
}
defer cache.Close()
data, err := cache.GetNode(1234)
if data.Id != 1234 || data.Tags["foo"] != "bar" {
t.Errorf("unexpected result of GetNode: %v", data)
}
data, err = cache.GetNode(99)
if data != nil {
t.Error("missing node not nil")
}
}
func TestReadWriteWay(t *testing.T) {
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newWaysCache(cache_dir)
if err != nil {
t.Fatal()
}
way := &element.Way{
OSMElem: element.OSMElem{
Id: 1234,
Tags: element.Tags{"foo": "bar"}},
Refs: []int64{942374923, 23948234},
}
cache.PutWay(way)
cache.Close()
cache, err = newWaysCache(cache_dir)
if err != nil {
t.Fatal()
}
defer cache.Close()
data, _ := cache.GetWay(1234)
if data.Id != 1234 || data.Tags["foo"] != "bar" {
t.Errorf("unexpected result of GetWay: %#v", data)
}
if len(data.Refs) != 2 ||
data.Refs[0] != 942374923 ||
data.Refs[1] != 23948234 {
t.Errorf("unexpected result of GetWay: %#v", data)
}
}
func TestReadMissingWay(t *testing.T) {
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newWaysCache(cache_dir)
if err != nil {
t.Fatal()
}
defer cache.Close()
data, _ := cache.GetWay(1234)
if data != nil {
t.Errorf("missing way did not return nil")
}
}
func BenchmarkWriteWay(b *testing.B) {
b.StopTimer()
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newWaysCache(cache_dir)
if err != nil {
b.Fatal()
}
defer cache.Close()
b.StartTimer()
way := &element.Way{
OSMElem: element.OSMElem{Tags: element.Tags{"foo": "bar"}},
Refs: []int64{942374923, 23948234},
}
for i := 0; i < b.N; i++ {
way.Id = int64(i)
cache.PutWay(way)
}
}
func BenchmarkReadWay(b *testing.B) {
b.StopTimer()
cache_dir, _ := ioutil.TempDir("", "imposm_test")
defer os.RemoveAll(cache_dir)
cache, err := newWaysCache(cache_dir)
if err != nil {
b.Fatal()
}
defer cache.Close()
way := &element.Way{}
for i := 0; i < b.N; i++ {
way.Id = int64(i)
cache.PutWay(way)
}
b.StartTimer()
for i := int64(0); i < int64(b.N); i++ {
if coord, err := cache.GetWay(i); err != nil || coord.Id != i {
b.Fail()
}
}
}
func TestIds(t *testing.T) {
for i := 0; i < 10000; i++ {
id := rand.Int63()
if idFromKeyBuf(idToKeyBuf(id)) != id {
t.Fatal()
}
}
// check that id buffers are in lexical order
var id = int64(0)
var prevKey string
for i := 0; i < 100; i++ {
id += rand.Int63n(1e12)
buf := idToKeyBuf(id)
if prevKey > string(buf) {
t.Fatal()
}
prevKey = string(buf)
}
}