Check devID for owned device
[platform/upstream/iotivity.git] / resource / unittests / OCRepresentationTest.cpp
index 04a2297..5c5a69f 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <gtest/gtest.h>
 #include <OCApi.h>
+#include "oic_string.h"
 #include <string>
 #include <limits>
 #include <boost/lexical_cast.hpp>
@@ -29,11 +30,11 @@ namespace OCRepresentationTest
     using std::string;
     using std::vector;
 
-    template<typename T>
-    void parsedEqual(T expected, const std::string& actualStr)
+    void parsedEqual(double expected, const std::string& actualStr)
     {
-        T actual = boost::lexical_cast<T>(actualStr);
-        EXPECT_LT(std::abs(expected - actual), std::numeric_limits<T>::epsilon());
+        double actual = boost::lexical_cast<double>(actualStr);
+        EXPECT_GE(actual, expected - .0000001);
+        EXPECT_LE(actual, expected + .0000001);
     }
 
     // getValueToString(all types)
@@ -148,6 +149,21 @@ namespace OCRepresentationTest
         EXPECT_EQ("OC::OCRepresentation", rep[AttrName].getValueToString());
     }
 
+    TEST(OCRepresentationValueToString, ByteString)
+    {
+        static const std::string AttrName = "ByteStringTest";
+        static uint8_t binval[] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
+                                   0x9, 0x0, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF};
+
+        OCByteString bytestring {binval, sizeof(binval)};
+        OCRepresentation rep;
+
+        rep.setValue(AttrName, bytestring);
+        const char* expected = "\\x1\\x2\\x3\\x4\\x5\\x6\\x7\\x8"
+                               "\\x9\\x0\\xa\\xb\\xc\\xd\\xe\\xf";
+        EXPECT_STREQ(expected, rep.getValueToString(AttrName).c_str() );
+    }
+
     TEST(OCRepresentationValueToString, IntegerVector)
     {
         static const std::string AttrName = "VectorTest";
@@ -344,6 +360,125 @@ namespace OCRepresentationTest
         EXPECT_EQ(Expected, rep[AttrName].getValueToString());
     }
 
+    TEST(OCRepresentationValueToByteString, ByteStringVector)
+    {
+        static const std::string AttrName = "VectorTest";
+        OCRepresentation rep;
+
+        uint8_t binval1[] = {0x1, 0x2, 0x3, 0x4};
+        OCByteString s1 {binval1, sizeof(binval1)};
+        uint8_t binval2[] = {0x5, 0x6, 0x7, 0x8};
+        OCByteString s2 {binval2, sizeof(binval2)};
+        uint8_t binval3[] = {0x9, 0x0, 0xA, 0xB};
+        OCByteString s3 {binval3, sizeof(binval3)};
+        vector<OCByteString> vect {s1, s2, s3};
+
+        uint8_t binval4[] = {0xC, 0xD, 0xE, 0xF};
+        OCByteString s4 {binval4, sizeof(binval4)};
+        uint8_t binval5[] = {0x11, 0x12, 0x13, 0x14};
+        OCByteString s5 {binval5, sizeof(binval5)};
+        uint8_t binval6[] = {0x15, 0x16, 0x17, 0x18};
+        OCByteString s6 {binval6, sizeof(binval6)};
+        vector<OCByteString> vect2 {s4, s5, s6};
+
+        rep.setValue(AttrName, vect);
+        const char *expected1tob = "[\\x1\\x2\\x3\\x4 \\x5\\x6\\x7\\x8 \\x9\\x0\\xa\\xb ]";
+        EXPECT_EQ(expected1tob, rep.getValueToString(AttrName));
+        EXPECT_EQ(expected1tob, rep[AttrName].getValueToString());
+
+        rep.setValue(AttrName, vect2);
+        const char *expectedcto18 = "[\\xc\\xd\\xe\\xf \\x11\\x12\\x13\\x14 \\x15\\x16\\x17\\x18 ]";
+        EXPECT_EQ(expectedcto18, rep.getValueToString(AttrName));
+        EXPECT_EQ(expectedcto18, rep[AttrName].getValueToString());
+    }
+
+    TEST(OCRepresentationValueToByteString, ByteStringVectorVector)
+    {
+        static const std::string AttrName = "VectorTest";
+        OCRepresentation rep;
+
+        uint8_t binval1[] = {0x1, 0x2, 0x3, 0x4};
+        OCByteString s1 {binval1, sizeof(binval1)};
+        uint8_t binval2[] = {0x5, 0x6, 0x7, 0x8};
+        OCByteString s2 {binval2, sizeof(binval2)};
+        uint8_t binval3[] = {0x9, 0x0, 0xA, 0xB};
+        OCByteString s3 {binval3, sizeof(binval3)};
+        vector<OCByteString> vect1 {s1, s2, s3};
+
+        uint8_t binval4[] = {0xC, 0xD, 0xE, 0xF};
+        OCByteString s4 {binval4, sizeof(binval4)};
+        uint8_t binval5[] = {0x11, 0x12, 0x13, 0x14};
+        OCByteString s5 {binval5, sizeof(binval5)};
+        uint8_t binval6[] = {0x15, 0x16, 0x17, 0x18};
+        OCByteString s6 {binval6, sizeof(binval6)};
+        vector<OCByteString> vect2 {s4, s5, s6};
+
+        vector<vector<OCByteString>> vect {vect1, vect2};
+
+        rep.setValue(AttrName, vect);
+
+        const char *expected =
+            "[["
+            "\\x1\\x2\\x3\\x4 \\x5\\x6\\x7\\x8 \\x9\\x0\\xa\\xb "
+            "] ["
+            "\\xc\\xd\\xe\\xf \\x11\\x12\\x13\\x14 \\x15\\x16\\x17\\x18 "
+            "] ]"
+            ;
+
+        EXPECT_EQ(expected, rep.getValueToString(AttrName));
+        EXPECT_EQ(expected, rep[AttrName].getValueToString());
+    }
+
+    TEST(OCRepresentationValueToByteString, ByteStringVectorVectorVector)
+    {
+        static const std::string AttrName = "VectorTest";
+        OCRepresentation rep;
+
+        uint8_t binval1[] = {0x1, 0x2, 0x3, 0x4};
+        OCByteString s1 {binval1, sizeof(binval1)};
+        uint8_t binval2[] = {0x5, 0x6, 0x7, 0x8};
+        OCByteString s2 {binval2, sizeof(binval2)};
+        uint8_t binval3[] = {0x9, 0x0, 0xA, 0xB};
+        OCByteString s3 {binval3, sizeof(binval3)};
+        vector<OCByteString> vect11 {s1, s2, s3};
+
+        uint8_t binval4[] = {0xC, 0xD, 0xE, 0xF};
+        OCByteString s4 {binval4, sizeof(binval4)};
+        uint8_t binval5[] = {0x11, 0x12, 0x13, 0x14};
+        OCByteString s5 {binval5, sizeof(binval5)};
+        uint8_t binval6[] = {0x15, 0x16, 0x17, 0x18};
+        OCByteString s6 {binval6, sizeof(binval6)};
+        vector<OCByteString> vect12 {s4, s5, s6};
+
+        uint8_t binval7[] = {0x19, 0x10, 0x1A, 0x1B};
+        OCByteString s7 {binval7, sizeof(binval7)};
+        uint8_t binval8[] = {0x1C, 0x1D, 0x1E, 0x1F};
+        OCByteString s8 {binval8, sizeof(binval8)};
+        vector<OCByteString> vect21 {s7, s8};
+
+        uint8_t binval9[] = {0x21, 0x22, 0x23, 0x24};
+        OCByteString s9 {binval9, sizeof(binval9)};
+        vector<OCByteString> vect22 {s9};
+
+        vector<vector<OCByteString>> vect1 {vect11, vect12};
+        vector<vector<OCByteString>> vect2 {vect21, vect22};
+        vector<vector<vector<OCByteString>>> vect {vect1, vect2};
+        rep.setValue(AttrName, vect);
+        static const std::string expected =
+            "[[["
+            "\\x1\\x2\\x3\\x4 \\x5\\x6\\x7\\x8 \\x9\\x0\\xa\\xb "
+            "] ["
+            "\\xc\\xd\\xe\\xf \\x11\\x12\\x13\\x14 \\x15\\x16\\x17\\x18 "
+            "] ] [["
+            "\\x19\\x10\\x1a\\x1b \\x1c\\x1d\\x1e\\x1f "
+            "] ["
+            "\\x21\\x22\\x23\\x24 "
+            "] ] ]";
+
+        EXPECT_EQ(expected, rep.getValueToString(AttrName));
+        EXPECT_EQ(expected, rep[AttrName].getValueToString());
+    }
+
     TEST(OCRepresentationValueToString, SubRepresentationVector)
     {
         static const std::string AttrName = "VectorTest";
@@ -421,9 +556,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(nullptr, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -442,9 +577,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -463,9 +598,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         int badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<int>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -492,9 +627,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout);
 
         int badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<int>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -513,7 +648,7 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         (void)badout;
     }
 
@@ -535,9 +670,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource.getUri(), repout2.getUri());
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -556,9 +691,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -577,9 +712,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -598,9 +733,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -619,9 +754,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -640,9 +775,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -662,9 +797,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -683,9 +818,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -704,9 +839,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -726,9 +861,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -747,9 +882,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -768,9 +903,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -790,9 +925,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(repsource, repout2);
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -818,9 +953,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(inner2.getUri(), repout2[1].getUri());
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -860,9 +995,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(inner4.getUri(), repout2[1][1].getUri());
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -922,9 +1057,9 @@ namespace OCRepresentationTest
         EXPECT_EQ(inner8.getUri(), repout2[1][1][1].getUri());
 
         double badout;
-        EXPECT_THROW(badout = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<double>(AttrName, badout));
         string badoutstr;
-        EXPECT_THROW(badoutstr = rep[AttrName], boost::bad_get);
+        EXPECT_FALSE(rep.getValue<string>(AttrName, badoutstr));
         (void)badout;
         (void)badoutstr;
     }
@@ -1310,4 +1445,28 @@ namespace OCRepresentationTest
             }
         }
     }
+
+    TEST(OCRepresentationHostTest, ValidHost)
+    {
+        OCDevAddr addr = {OC_DEFAULT_ADAPTER, OC_IP_USE_V6};
+        addr.port = 5000;
+        OICStrcpy(addr.addr, sizeof(addr.addr), "fe80::1%eth0");
+
+        OCRepresentation rep;
+        rep.setDevAddr(addr);
+        std::string host = rep.getHost();
+        std::string expected = "coap://[fe80::1%25eth0]:5000";
+        EXPECT_EQ(host, expected);
+    }
+
+    TEST(OCRepresentationHostTest, InvalidHost)
+    {
+        OCDevAddr addr = {OC_DEFAULT_ADAPTER, OC_IP_USE_V6};
+        addr.port = 5000;
+        OICStrcpy(addr.addr, sizeof(addr.addr), "fe80::1%%");
+
+        OCRepresentation rep;
+        EXPECT_ANY_THROW(rep.setDevAddr(addr));
+    }
+
 }