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 }