2019-01-03 23:23:50 +01:00
|
|
|
package dlna
|
|
|
|
|
|
|
|
import (
|
2019-06-17 10:34:30 +02:00
|
|
|
"context"
|
2019-01-03 23:23:50 +01:00
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"os"
|
|
|
|
"testing"
|
|
|
|
|
2019-07-28 19:47:38 +02:00
|
|
|
"github.com/rclone/rclone/vfs"
|
2019-01-03 23:23:50 +01:00
|
|
|
|
2019-07-28 19:47:38 +02:00
|
|
|
_ "github.com/rclone/rclone/backend/local"
|
|
|
|
"github.com/rclone/rclone/cmd/serve/dlna/dlnaflags"
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
|
|
"github.com/rclone/rclone/fs/config"
|
2019-01-03 23:23:50 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
dlnaServer *server
|
2019-05-01 12:16:22 +02:00
|
|
|
testURL string
|
2019-01-03 23:23:50 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2019-05-01 12:16:22 +02:00
|
|
|
testBindAddress = "localhost:0"
|
2019-01-03 23:23:50 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
func startServer(t *testing.T, f fs.Fs) {
|
|
|
|
opt := dlnaflags.DefaultOpt
|
|
|
|
opt.ListenAddr = testBindAddress
|
|
|
|
dlnaServer = newServer(f, &opt)
|
|
|
|
assert.NoError(t, dlnaServer.Serve())
|
2019-05-01 12:16:22 +02:00
|
|
|
testURL = "http://" + dlnaServer.HTTPConn.Addr().String() + "/"
|
2019-01-03 23:23:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestInit(t *testing.T) {
|
|
|
|
config.LoadConfig()
|
|
|
|
|
|
|
|
f, err := fs.NewFs("testdata/files")
|
2019-06-17 10:34:30 +02:00
|
|
|
l, _ := f.List(context.Background(), "")
|
2019-01-03 23:23:50 +01:00
|
|
|
fmt.Println(l)
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
startServer(t, f)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure that it serves rootDesc.xml (SCPD in uPnP parlance).
|
|
|
|
func TestRootSCPD(t *testing.T) {
|
|
|
|
req, err := http.NewRequest("GET", testURL+"rootDesc.xml", nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
|
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
|
|
require.NoError(t, err)
|
|
|
|
// Make sure that the SCPD contains a CDS service.
|
|
|
|
require.Contains(t, string(body),
|
|
|
|
"<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>")
|
2019-03-12 01:02:52 +01:00
|
|
|
// Make sure that the SCPD contains a CM service.
|
|
|
|
require.Contains(t, string(body),
|
|
|
|
"<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>")
|
2019-03-11 16:49:31 +01:00
|
|
|
// Ensure that the SCPD url is configured.
|
|
|
|
require.Regexp(t, "<SCPDURL>/.*</SCPDURL>", string(body))
|
2019-01-03 23:23:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure that it serves content from the remote.
|
|
|
|
func TestServeContent(t *testing.T) {
|
|
|
|
itemPath := "/small_jpeg.jpg"
|
|
|
|
pathQuery := url.QueryEscape(itemPath)
|
|
|
|
req, err := http.NewRequest("GET", testURL+"res?path="+pathQuery, nil)
|
|
|
|
require.NoError(t, err)
|
|
|
|
resp, err := http.DefaultClient.Do(req)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer fs.CheckClose(resp.Body, &err)
|
|
|
|
assert.Equal(t, http.StatusOK, resp.StatusCode)
|
|
|
|
actualContents, err := ioutil.ReadAll(resp.Body)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
// Now compare the contents with the golden file.
|
|
|
|
node, err := dlnaServer.vfs.Stat(itemPath)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
goldenFile := node.(*vfs.File)
|
|
|
|
goldenReader, err := goldenFile.Open(os.O_RDONLY)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
defer fs.CheckClose(goldenReader, &err)
|
|
|
|
goldenContents, err := ioutil.ReadAll(goldenReader)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
require.Equal(t, goldenContents, actualContents)
|
|
|
|
}
|