1 
2 #include "http_response.hpp"
3 #include "update_service.hpp"
4 
5 #include <boost/url/url.hpp>
6 
7 #include <optional>
8 
9 #include <gtest/gtest.h>
10 
11 namespace redfish
12 {
13 namespace
14 {
15 
16 TEST(UpdateService, ParseTFTPPostitive)
17 {
18     crow::Response res;
19     {
20         // No protocol, schema on url
21         std::optional<boost::urls::url> ret =
22             parseSimpleUpdateUrl("tftp://1.1.1.1/path", std::nullopt, res);
23         ASSERT_TRUE(ret);
24         if (!ret)
25         {
26             return;
27         }
28         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
29         EXPECT_EQ(ret->encoded_path(), "/path");
30         EXPECT_EQ(ret->scheme(), "tftp");
31     }
32     {
33         // Protocol, no schema on url
34         std::optional<boost::urls::url> ret =
35             parseSimpleUpdateUrl("1.1.1.1/path", "TFTP", res);
36         ASSERT_TRUE(ret);
37         if (!ret)
38         {
39             return;
40         }
41         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
42         EXPECT_EQ(ret->encoded_path(), "/path");
43         EXPECT_EQ(ret->scheme(), "tftp");
44     }
45     {
46         // Both protocol and schema on url
47         std::optional<boost::urls::url> ret =
48             parseSimpleUpdateUrl("tftp://1.1.1.1/path", "TFTP", res);
49         ASSERT_TRUE(ret);
50         if (!ret)
51         {
52             return;
53         }
54         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
55         EXPECT_EQ(ret->encoded_path(), "/path");
56         EXPECT_EQ(ret->scheme(), "tftp");
57     }
58 }
59 
60 TEST(UpdateService, ParseHTTPSPostitive)
61 {
62     crow::Response res;
63     {
64         // No protocol, schema on url
65         std::optional<boost::urls::url> ret =
66             parseSimpleUpdateUrl("https://1.1.1.1/path", std::nullopt, res);
67         ASSERT_TRUE(ret);
68         if (!ret)
69         {
70             return;
71         }
72         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
73         EXPECT_EQ(ret->encoded_path(), "/path");
74         EXPECT_EQ(ret->scheme(), "https");
75     }
76     {
77         // Protocol, no schema on url
78         std::optional<boost::urls::url> ret =
79             parseSimpleUpdateUrl("1.1.1.1/path", "HTTPS", res);
80         ASSERT_TRUE(ret);
81         if (!ret)
82         {
83             return;
84         }
85         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
86         EXPECT_EQ(ret->encoded_path(), "/path");
87         EXPECT_EQ(ret->scheme(), "https");
88     }
89     {
90         // Both protocol and schema on url with path
91         std::optional<boost::urls::url> ret =
92             parseSimpleUpdateUrl("https://1.1.1.1/path", "HTTPS", res);
93         ASSERT_TRUE(ret);
94         if (!ret)
95         {
96             return;
97         }
98         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
99         EXPECT_EQ(ret->encoded_path(), "/path");
100         EXPECT_EQ(ret->scheme(), "https");
101     }
102     {
103         // Both protocol and schema on url without path
104         std::optional<boost::urls::url> ret =
105             parseSimpleUpdateUrl("https://1.1.1.1", "HTTPS", res);
106         ASSERT_TRUE(ret);
107         if (!ret)
108         {
109             return;
110         }
111         EXPECT_EQ(ret->encoded_host_and_port(), "1.1.1.1");
112         EXPECT_EQ(ret->encoded_path(), "/");
113         EXPECT_EQ(ret->scheme(), "https");
114     }
115 }
116 
117 TEST(UpdateService, ParseTFTPNegative)
118 {
119     crow::Response res;
120     // No protocol, no schema
121     ASSERT_EQ(parseSimpleUpdateUrl("1.1.1.1/path", std::nullopt, res),
122               std::nullopt);
123     // No host
124     ASSERT_EQ(parseSimpleUpdateUrl("/path", "TFTP", res), std::nullopt);
125 
126     // No host
127     ASSERT_EQ(parseSimpleUpdateUrl("path", "TFTP", res), std::nullopt);
128 
129     // No path
130     ASSERT_EQ(parseSimpleUpdateUrl("tftp://1.1.1.1", "TFTP", res),
131               std::nullopt);
132     ASSERT_EQ(parseSimpleUpdateUrl("tftp://1.1.1.1/", "TFTP", res),
133               std::nullopt);
134 }
135 } // namespace
136 } // namespace redfish
137