Cleanup and add test for IOT control set parsing
This commit is contained in:
parent
d6bedfb033
commit
07b0d2d14d
|
@ -40,11 +40,11 @@ func main() {
|
||||||
for packet := range client.Recv() {
|
for packet := range client.Recv() {
|
||||||
|
|
||||||
switch packet := packet.(type) {
|
switch packet := packet.(type) {
|
||||||
case *xmpp.Message:
|
case xmpp.Message:
|
||||||
processMessage(client, p, packet)
|
processMessage(client, p, &packet)
|
||||||
case *xmpp.IQ:
|
case xmpp.IQ:
|
||||||
processIq(client, p, packet)
|
processIq(client, p, &packet)
|
||||||
case *xmpp.Presence:
|
case xmpp.Presence:
|
||||||
// Do nothing with received presence
|
// Do nothing with received presence
|
||||||
default:
|
default:
|
||||||
fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", packet)
|
fmt.Fprintf(os.Stdout, "Ignoring packet: %T\n", packet)
|
||||||
|
@ -77,7 +77,7 @@ func processIq(client *xmpp.Client, p *mpg123.Player, packet *xmpp.IQ) {
|
||||||
playSCURL(p, url)
|
playSCURL(p, url)
|
||||||
setResponse := new(iot.ControlSetResponse)
|
setResponse := new(iot.ControlSetResponse)
|
||||||
reply := xmpp.IQ{PacketAttrs: xmpp.PacketAttrs{To: packet.From, Type: "result", Id: packet.Id}, Payload: []xmpp.IQPayload{setResponse}}
|
reply := xmpp.IQ{PacketAttrs: xmpp.PacketAttrs{To: packet.From, Type: "result", Id: packet.Id}, Payload: []xmpp.IQPayload{setResponse}}
|
||||||
client.SendRaw(reply.XMPPFormat())
|
client.Send(reply)
|
||||||
// TODO add Soundclound artist / title retrieval
|
// TODO add Soundclound artist / title retrieval
|
||||||
sendUserTune(client, "Radiohead", "Spectre")
|
sendUserTune(client, "Radiohead", "Spectre")
|
||||||
default:
|
default:
|
||||||
|
@ -100,7 +100,7 @@ func playSCURL(p *mpg123.Player, rawURL string) {
|
||||||
|
|
||||||
func connectXmpp(jid string, password string, address string) (client *xmpp.Client, err error) {
|
func connectXmpp(jid string, password string, address string) (client *xmpp.Client, err error) {
|
||||||
xmppOptions := xmpp.Options{Address: address,
|
xmppOptions := xmpp.Options{Address: address,
|
||||||
Jid: jid, Password: password, PacketLogger: os.Stdout,
|
Jid: jid, Password: password, PacketLogger: os.Stdout, Insecure: true,
|
||||||
Retry: 10}
|
Retry: 10}
|
||||||
|
|
||||||
if client, err = xmpp.NewClient(xmppOptions); err != nil {
|
if client, err = xmpp.NewClient(xmppOptions); err != nil {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package xmpp
|
package xmpp // import "fluux.io/xmpp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/sha1"
|
"crypto/sha1"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package xmpp
|
package xmpp // import "fluux.io/xmpp"
|
||||||
|
|
||||||
import "testing"
|
import "testing"
|
||||||
|
|
||||||
|
|
28
control_test.go
Normal file
28
control_test.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package xmpp // import "fluux.io/xmpp"
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"fluux.io/xmpp/iot"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestControlSet(t *testing.T) {
|
||||||
|
packet := `
|
||||||
|
<iq to='test@localhost/jukebox' from='admin@localhost/mbp' type='set' id='2'>
|
||||||
|
<set xmlns='urn:xmpp:iot:control' xml:lang='en'>
|
||||||
|
<string name='action' value='play'/>
|
||||||
|
<string name='url' value='https://soundcloud.com/radiohead/spectre'/>
|
||||||
|
</set>
|
||||||
|
</iq>`
|
||||||
|
|
||||||
|
parsedIQ := IQ{}
|
||||||
|
data := []byte(packet)
|
||||||
|
if err := xml.Unmarshal(data, &parsedIQ); err != nil {
|
||||||
|
t.Errorf("Unmarshal(%s) returned error", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if cs, ok := parsedIQ.Payload[0].(*iot.ControlSet); !ok {
|
||||||
|
t.Errorf("Paylod is not an iot control set: %v", cs)
|
||||||
|
}
|
||||||
|
}
|
2
doc.go
2
doc.go
|
@ -29,4 +29,4 @@ Fluux XMPP has been primarily tested with ejabberd (https://www.ejabberd.im)
|
||||||
but it should work with any XMPP compliant server.
|
but it should work with any XMPP compliant server.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
package xmpp
|
package xmpp // import "fluux.io/xmpp"
|
||||||
|
|
22
iq.go
22
iq.go
|
@ -2,7 +2,6 @@ package xmpp // import "fluux.io/xmpp"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
@ -236,27 +235,6 @@ func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// XMPPFormat returns the string representation of the XMPP packet.
|
|
||||||
// TODO: Should I simply rely on xml.Marshal ?
|
|
||||||
func (iq *IQ) XMPPFormat() string {
|
|
||||||
if iq.Payload != nil {
|
|
||||||
var payload []byte
|
|
||||||
var err error
|
|
||||||
if payload, err = xml.Marshal(iq.Payload); err != nil {
|
|
||||||
return fmt.Sprintf("<iq to='%s' type='%s' id='%s' xml:lang='en'>"+
|
|
||||||
"</iq>",
|
|
||||||
iq.To, iq.Type, iq.Id)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("<iq to='%s' type='%s' id='%s' xml:lang='en'>"+
|
|
||||||
"%s</iq>",
|
|
||||||
iq.To, iq.Type, iq.Id, payload)
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("<iq to='%s' type='%s' id='%s' xml:lang='en'>"+
|
|
||||||
"%s</iq>",
|
|
||||||
iq.To, iq.Type, iq.Id,
|
|
||||||
iq.RawXML)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// Generic IQ Payload
|
// Generic IQ Payload
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue