package com.connectsdk.discovery.provider.ssdp;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;

import java.net.DatagramPacket;

@RunWith(RobolectricTestRunner.class)
@Config(manifest=Config.NONE)
public class SSDPPacketTest {

    DatagramPacket mDatagramPacket;
    SSDPPacket ssdpPacket;

    public SSDPPacketTest() {
        super();
    }

    @Before
    public void setUp(){
        String testDatagramData = "";
        mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
    }


    @Test
    public void testParseDatagram() {
        String testDatagramData =
                "NOTIFY * HTTP/1.1\r\n" +
                "HOST: 239.255.255.250:1900\r\n" +
                "NT: nt_value\r\n" +
                "NTS: ssdp:byebye\r\n" +
                "USN: uuid:advertisement_UUID\r\n\r\n";
        mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
        ssdpPacket = new SSDPPacket(mDatagramPacket);
        Assert.assertEquals("NOTIFY * HTTP/1.1", ssdpPacket.getType());
        Assert.assertEquals("239.255.255.250:1900", ssdpPacket.getData().get("HOST"));
        Assert.assertEquals("nt_value", ssdpPacket.getData().get("NT"));
        Assert.assertEquals("ssdp:byebye", ssdpPacket.getData().get("NTS"));
        Assert.assertEquals("uuid:advertisement_UUID", ssdpPacket.getData().get("USN"));
    }


    @Test
    public void testParseLowercaseDatagram() {
        String testDatagramData =
                "NOTIFY * HTTP/1.1\r\n" +
                "host: 239.255.255.250:1900\r\n" +
                "nt: nt_value\r\n" +
                "Nts: ssdp:byebye\r\n" +
                "uSN: uuid:advertisement_UUID\r\n\r\n";
        mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
        ssdpPacket = new SSDPPacket(mDatagramPacket);
        Assert.assertEquals("NOTIFY * HTTP/1.1", ssdpPacket.getType());
        Assert.assertEquals("239.255.255.250:1900", ssdpPacket.getData().get("HOST"));
        Assert.assertEquals("nt_value", ssdpPacket.getData().get("NT"));
        Assert.assertEquals("ssdp:byebye", ssdpPacket.getData().get("NTS"));
        Assert.assertEquals("uuid:advertisement_UUID", ssdpPacket.getData().get("USN"));
    }


    @Test
    public void testParseEmptyDatagram() {
        String testDatagramData = "Unknown";
        mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
        ssdpPacket = new SSDPPacket(mDatagramPacket);
        Assert.assertNull(ssdpPacket.getType());
        Assert.assertTrue(ssdpPacket.getData().isEmpty());
    }

    @Test
    public void testParseGarbage() {
        String testDatagramData = "\n\r\n\r\r\n\n\r\n\r\n::::sdkfjh::\r\n:\r\n::\r\nKEY:\r\nsdf\r\n\u000E¾<ƒÄ\f^‹Ã_Ã\u0007Ì\u0001ÜLÿ›îÿ$\u0004‰P\u0004‹T$\b‰H\u001B\f\f‰\r\n";
        try {
            mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
            ssdpPacket = new SSDPPacket(mDatagramPacket);
            Assert.assertEquals("", ssdpPacket.getData().get("KEY"));
        } catch (Exception e) {
            Assert.fail(e.getMessage());
        }
    }

    @Test
    public void testParseDatagramWithoutLineEnd() {
        String testDatagramData = "key:value";
        mDatagramPacket = new DatagramPacket(testDatagramData.getBytes(), 0);
        ssdpPacket = new SSDPPacket(mDatagramPacket);
        Assert.assertEquals(null, ssdpPacket.getData().get("key"));
    }
}