github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/cmd/serve/dlna/dlna_test.go (about)

     1  package dlna
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"net/url"
     9  	"os"
    10  	"testing"
    11  
    12  	"github.com/ncw/rclone/vfs"
    13  
    14  	_ "github.com/ncw/rclone/backend/local"
    15  	"github.com/ncw/rclone/cmd/serve/dlna/dlnaflags"
    16  	"github.com/ncw/rclone/fs"
    17  	"github.com/ncw/rclone/fs/config"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/stretchr/testify/require"
    20  )
    21  
    22  var (
    23  	dlnaServer *server
    24  	testURL    string
    25  )
    26  
    27  const (
    28  	testBindAddress = "localhost:0"
    29  )
    30  
    31  func startServer(t *testing.T, f fs.Fs) {
    32  	opt := dlnaflags.DefaultOpt
    33  	opt.ListenAddr = testBindAddress
    34  	dlnaServer = newServer(f, &opt)
    35  	assert.NoError(t, dlnaServer.Serve())
    36  	testURL = "http://" + dlnaServer.HTTPConn.Addr().String() + "/"
    37  }
    38  
    39  func TestInit(t *testing.T) {
    40  	config.LoadConfig()
    41  
    42  	f, err := fs.NewFs("testdata/files")
    43  	l, _ := f.List(context.Background(), "")
    44  	fmt.Println(l)
    45  	require.NoError(t, err)
    46  
    47  	startServer(t, f)
    48  }
    49  
    50  // Make sure that it serves rootDesc.xml (SCPD in uPnP parlance).
    51  func TestRootSCPD(t *testing.T) {
    52  	req, err := http.NewRequest("GET", testURL+"rootDesc.xml", nil)
    53  	require.NoError(t, err)
    54  	resp, err := http.DefaultClient.Do(req)
    55  	require.NoError(t, err)
    56  	assert.Equal(t, http.StatusOK, resp.StatusCode)
    57  	body, err := ioutil.ReadAll(resp.Body)
    58  	require.NoError(t, err)
    59  	// Make sure that the SCPD contains a CDS service.
    60  	require.Contains(t, string(body),
    61  		"<serviceType>urn:schemas-upnp-org:service:ContentDirectory:1</serviceType>")
    62  	// Make sure that the SCPD contains a CM service.
    63  	require.Contains(t, string(body),
    64  		"<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>")
    65  	// Ensure that the SCPD url is configured.
    66  	require.Regexp(t, "<SCPDURL>/.*</SCPDURL>", string(body))
    67  }
    68  
    69  // Make sure that it serves content from the remote.
    70  func TestServeContent(t *testing.T) {
    71  	itemPath := "/small_jpeg.jpg"
    72  	pathQuery := url.QueryEscape(itemPath)
    73  	req, err := http.NewRequest("GET", testURL+"res?path="+pathQuery, nil)
    74  	require.NoError(t, err)
    75  	resp, err := http.DefaultClient.Do(req)
    76  	require.NoError(t, err)
    77  	defer fs.CheckClose(resp.Body, &err)
    78  	assert.Equal(t, http.StatusOK, resp.StatusCode)
    79  	actualContents, err := ioutil.ReadAll(resp.Body)
    80  	assert.NoError(t, err)
    81  
    82  	// Now compare the contents with the golden file.
    83  	node, err := dlnaServer.vfs.Stat(itemPath)
    84  	assert.NoError(t, err)
    85  	goldenFile := node.(*vfs.File)
    86  	goldenReader, err := goldenFile.Open(os.O_RDONLY)
    87  	assert.NoError(t, err)
    88  	defer fs.CheckClose(goldenReader, &err)
    89  	goldenContents, err := ioutil.ReadAll(goldenReader)
    90  	assert.NoError(t, err)
    91  
    92  	require.Equal(t, goldenContents, actualContents)
    93  }