Codebase list golang-go-xdg / bullseye-backports/main base_directory_test.go
bullseye-backports/main

Tree @bullseye-backports/main (Download .tar.gz)

base_directory_test.go @bullseye-backports/mainraw · history · blame

// (c) 2014 John R. Lenton. See LICENSE.

package xdg

import (
	. "launchpad.net/gocheck"
	"os"
	"path/filepath"
	"strings"
	"testing"
)

func TestXDGd(t *testing.T) { TestingT(t) }

type xdgdSuite struct {
	home string
	env1 string
	val1 string
	env2 string
	val2 string
	dir  *XDGDir
}

var _ = Suite(&xdgdSuite{})

func (s *xdgdSuite) SetUpTest(c *C) {
	s.home = os.Getenv("HOME")
	s.env1 = "go_xdg_one"
	s.env2 = "go_xdg_two"
	s.val1 = "something"
	s.val2 = "one:two:three"
	s.dir = &XDGDir{s.env1, s.val1, s.env2, s.val2}
}

func (s *xdgdSuite) TestHomePrefersEnviron(c *C) {
	err := os.Setenv(s.env1, "algo")
	c.Assert(err, IsNil)
	defer os.Setenv(s.env1, "")
	h := s.dir.Home()
	c.Check(h, Equals, "algo")
}

func (s *xdgdSuite) TestHomeUsesDefault(c *C) {
	h := s.dir.Home()
	c.Check(h, Matches, s.home+".*"+s.val1)
}

func (s *xdgdSuite) TestDirsPrefersEnviron(c *C) {
	err := os.Setenv(s.env1, "cero")
	c.Assert(err, IsNil)
	defer os.Setenv(s.env1, "")
	err = os.Setenv(s.env2, "uno:dos")
	c.Assert(err, IsNil)
	defer os.Setenv(s.env2, "")
	hs := s.dir.Dirs()
	c.Check(hs, DeepEquals, []string{"cero", "uno", "dos"})
}

func (s *xdgdSuite) TestDirsSkipsEmpty(c *C) {
	err := os.Setenv(s.env2, "::")
	c.Assert(err, IsNil)
	defer os.Setenv(s.env2, "")
	hs := s.dir.Dirs()
	c.Check(hs, HasLen, 1)
}

func (s *xdgdSuite) TestDirsUsesDefault(c *C) {
	hs := s.dir.Dirs()
	c.Assert(hs, HasLen, 4)
	c.Check(hs[1:], DeepEquals, strings.Split(s.val2, ":"))
	c.Check(hs[0], Matches, s.home+".*"+s.val1)
}

// now repeat all the tests, but without the HOME environ.
type xdgdNoHomeSuite struct {
	xdgdSuite
}

var _ = Suite(&xdgdNoHomeSuite{})

func (s *xdgdNoHomeSuite) SetUpTest(c *C) {
	s.xdgdSuite.SetUpTest(c)
	os.Setenv("HOME", "")
}

func (s *xdgdNoHomeSuite) TearDownTest(c *C) {
	os.Setenv("HOME", s.home)
}

// and for these tests, an entirely fake HOME
type xdgdFHSuite struct {
	xdgdSuite
	real_home string
}

var _ = Suite(&xdgdFHSuite{})

func (s *xdgdFHSuite) SetUpTest(c *C) {
	s.real_home = os.Getenv("HOME")
	home := c.MkDir()
	os.Setenv("HOME", home)
	s.xdgdSuite.SetUpTest(c)
	s.val2 = c.MkDir() + ":" + c.MkDir() + ":" + c.MkDir()
	s.dir = &XDGDir{s.env1, s.val1, s.env2, s.val2}
}

func (s *xdgdFHSuite) TearDownTest(c *C) {
	os.Setenv("HOME", s.real_home)
}

func (s *xdgdFHSuite) TestFind(c *C) {
	vs := strings.Split(s.val2, ":")
	res1 := "stuff"
	exp1 := filepath.Join(s.home, s.val1, res1)
	res2 := "things/that"
	exp2 := filepath.Join(vs[1], res2)
	res3 := "more"
	exp3 := filepath.Join(vs[2], res3)
	for _, d := range []string{exp1, exp2, exp3} {
		err := os.MkdirAll(d, 0700)
		c.Assert(err, IsNil, Commentf(d))
	}
	for _, it := range []struct {
		res string
		exp string
	}{{res1, exp1}, {res2, exp2}, {res3, exp3}} {
		rv, err := s.dir.Find(it.res)
		c.Assert(err, IsNil)
		c.Check(rv, Equals, it.exp)
	}
	_, err := s.dir.Find("missing")
	c.Check(err, NotNil)
}

func (s *xdgdFHSuite) TestEnsureFirst(c *C) {
	// creates it if missing
	rv1, err := s.dir.Ensure("missing/file")
	c.Assert(err, IsNil)
	_, err = os.Stat(rv1)
	c.Check(err, IsNil)
	c.Check(rv1, Matches, s.home+".*"+"missing/file")
	// just gets it if existing
	rv2, err := s.dir.Ensure("missing/file")
	c.Assert(err, IsNil)
	c.Check(rv2, Equals, rv1)
}

func (s *xdgdFHSuite) TestEnsureFirstFailures(c *C) {
	_, err := s.dir.Ensure(strings.Repeat("*", 1<<9) + "/" + strings.Repeat("*", 1<<9))
	c.Assert(err, NotNil)
}