// Copyright (C) The Arvados Authors. All rights reserved.
//
// SPDX-License-Identifier: Apache-2.0

package mount

import (
	"bytes"
	"encoding/json"
	"io/ioutil"
	"os"
	"time"

	"git.arvados.org/arvados.git/sdk/go/arvadostest"
	check "gopkg.in/check.v1"
)

var _ = check.Suite(&CmdSuite{})

type CmdSuite struct {
	mnt string
}

func (s *CmdSuite) SetUpTest(c *check.C) {
	tmpdir, err := ioutil.TempDir("", "")
	c.Assert(err, check.IsNil)
	s.mnt = tmpdir
}

func (s *CmdSuite) TearDownTest(c *check.C) {
	c.Check(os.RemoveAll(s.mnt), check.IsNil)
}

func (s *CmdSuite) TestMount(c *check.C) {
	exited := make(chan int)
	stdin := bytes.NewBufferString("stdin")
	stdout := bytes.NewBuffer(nil)
	stderr := bytes.NewBuffer(nil)
	mountCmd := mountCommand{ready: make(chan struct{})}
	ready := false
	go func() {
		exited <- mountCmd.RunCommand("test mount", []string{"--experimental", s.mnt}, stdin, stdout, stderr)
	}()
	go func() {
		<-mountCmd.ready
		ready = true

		f, err := os.Open(s.mnt + "/by_id/" + arvadostest.FooCollection)
		if c.Check(err, check.IsNil) {
			dirnames, err := f.Readdirnames(-1)
			c.Check(err, check.IsNil)
			c.Check(dirnames, check.DeepEquals, []string{"foo"})
			f.Close()
		}

		buf, err := ioutil.ReadFile(s.mnt + "/by_id/" + arvadostest.FooCollection + "/.arvados#collection")
		if c.Check(err, check.IsNil) {
			var m map[string]interface{}
			err = json.Unmarshal(buf, &m)
			c.Check(err, check.IsNil)
			c.Check(m["manifest_text"], check.Matches, `\. acbd.* 0:3:foo\n`)
		}

		_, err = os.Open(s.mnt + "/by_id/zzzzz-4zz18-does-not-exist")
		c.Check(os.IsNotExist(err), check.Equals, true)

		ok := mountCmd.Unmount()
		c.Check(ok, check.Equals, true)
	}()
	select {
	case <-time.After(5 * time.Second):
		c.Fatal("timed out")
	case errCode, ok := <-exited:
		c.Check(ok, check.Equals, true)
		c.Check(errCode, check.Equals, 0)
	}
	c.Check(ready, check.Equals, true)
	c.Check(stdout.String(), check.Equals, "")
	// stdin should not have been read
	c.Check(stdin.String(), check.Equals, "stdin")
}