358b9f2e5fa15de642fc2e95d1911b88c0ff5720
[gssweb.git] / json_gssapi / test / GSSAcquireCredTest.cpp
1 /*
2  * Copyright (c) 2014 <copyright holder> <email>
3  *
4  * For license details, see the LICENSE file in the root of this project.
5  *
6  */
7
8 #include "GSSAcquireCredTest.h"
9 #include "GSSAcquireCred.h"
10 #include "command_mocks/MockAcquireCred.h"
11 #include <datamodel/GSSName.h>
12 #include <gssapi.h>
13 #include <stdexcept>
14
15 CPPUNIT_TEST_SUITE_REGISTRATION( GSSAcquireCredTest );
16
17 OM_uint32 KRB5_CALLCONV
18 mock_acquire_cred(
19     OM_uint32 *minor_status,
20     gss_name_t desired_name,
21     OM_uint32 time_req,
22     gss_OID_set desired_mechs,
23     gss_cred_usage_t cred_usage,
24     gss_cred_id_t * output_cred_handle,
25     gss_OID_set * actual_mechs,
26     OM_uint32 *time_rec)
27 {
28   
29   // Set MockAcquireCred attributes from our in-parameters
30   MockAcquireCred::desired_name = desired_name;
31   MockAcquireCred::time_req = time_req;
32   MockAcquireCred::desired_mechs = desired_mechs;
33   MockAcquireCred::cred_usage = cred_usage;
34   
35   // Set our out-parameters from MockAcquireCred
36   *output_cred_handle = MockAcquireCred::output_cred_handle;
37   *actual_mechs = MockAcquireCred::actual_mechs;
38   *time_rec = MockAcquireCred::time_rec;
39   
40   *minor_status = MockAcquireCred::minor_status;
41   return(MockAcquireCred::retVal);
42 }
43
44 void GSSAcquireCredTest::setUp()
45 {
46
47 }
48
49 void GSSAcquireCredTest::tearDown()
50 {
51
52 }
53
54 void GSSAcquireCredTest::testConstructor()
55 {
56   /* Variables */
57   GSSAcquireCred cmd = GSSAcquireCred();
58   
59   /* Error checking */
60   /* Setup */
61   /* Main */
62   CPPUNIT_ASSERT_EQUAL_MESSAGE(
63     "The GSSImportName object has the wrong GSS function",
64     &gss_acquire_cred,
65     cmd.getGSSFunction()
66   );
67   
68   /* Cleanup */
69   /* Return */
70 }
71
72 void GSSAcquireCredTest::testConstructorWithJSONObject()
73 {
74   /* Variables */
75   // To feed into the JSON
76   OM_uint32 time_req = rand();
77   gss_cred_usage_t cred_usage = 2;
78   GSSOID mech( (char *)"{ 1 2 840 113554 1 2 1 4 }" );
79   std::stringstream input;
80
81   // The JSON string
82   input << 
83   "{\"method\"   : \"gss_acquire_cred\", \
84     \"arguments\": \
85        {\"desired_name\" : \"#################\", \
86         \"time_req\"     : " << time_req << ", \
87         \"cred_usage\"   : " << cred_usage << ", \
88         \"desired_mechs\": [\"" << mech.toString() << "\"] \
89        } \
90    }";
91   
92   // The JSON itself
93   json_error_t jsonErr;
94   JSONObject json = JSONObject::load(input.str().c_str(), 0, &jsonErr);
95   
96   GSSOIDSet desiredMechs;
97   
98   
99   GSSAcquireCred cmd = GSSAcquireCred(&json, &mock_acquire_cred);
100   
101   /* Error checking */
102   /* Setup */
103   /* Main */
104   CPPUNIT_ASSERT_EQUAL_MESSAGE(
105     "GSSAcquireCred's time_req was not loaded correctly",
106     time_req,
107     cmd.getTimeReq()
108   );
109   
110   CPPUNIT_ASSERT_EQUAL_MESSAGE(
111     "GSSAcquireCred's cred_usage was not loaded correctly",
112     cred_usage,
113     cmd.getCredUsage()
114   );
115   
116   json["arguments"].set( "cred_usage", "GSS_C_INITIATE" );
117   cmd.loadParameters(&json);
118   CPPUNIT_ASSERT_EQUAL_MESSAGE(
119     "GSSAcquireCred's cred_usage was not loaded correctly",
120     GSS_C_INITIATE,
121     (int)cmd.getCredUsage()
122   );
123   
124   // CPPUNIT_ASSERT_THROW(expression, exception);
125   json["arguments"].set( "cred_usage", "GSS_C_INITIATOR" );
126   CPPUNIT_ASSERT_THROW_MESSAGE(
127     "GSSAcquireCred's JSON parsing is admitting invalid strings.", 
128     cmd.loadParameters(&json), 
129     std::invalid_argument 
130   );
131   
132   desiredMechs = cmd.getDesiredMechs();
133   CPPUNIT_ASSERT_MESSAGE(
134     "The desired mechanisms were not set properly.",
135     desiredMechs.includes(mech)
136   );
137   
138   /* Cleanup */
139   /* Return */
140 }
141
142 void GSSAcquireCredTest::testEmptyCall()
143 {
144   /* Variables */
145   GSSAcquireCred cmd = GSSAcquireCred(&mock_acquire_cred);
146   OM_uint32 minor;
147   GSSName steve; // ((char *)"steve@local", (gss_OID)GSS_C_NT_USER_NAME);
148   GSSOID moonshotOID((char *)"{1 3 6 1 5 5 15 1 1 18}");
149   
150   /* Error checking */
151   /* Setup */
152   cmd.setDesiredName(steve);
153   cmd.setTimeReq(0);
154   cmd.addDesiredMech( moonshotOID );
155   cmd.setCredUsage(GSS_C_INITIATE);
156   
157   
158   MockAcquireCred::retVal = 0;
159   MockAcquireCred::minor_status = 0;
160   MockAcquireCred::output_cred_handle = GSS_C_NO_CREDENTIAL;
161   gss_create_empty_oid_set(&minor, &(MockAcquireCred::actual_mechs));
162   MockAcquireCred::time_rec = rand();
163   
164   cmd.execute();
165   
166   /* Main */
167   CPPUNIT_ASSERT_EQUAL_MESSAGE(
168     "The desired name was not passed in correctly",
169     steve.toGss(),
170     MockAcquireCred::desired_name
171   );
172   
173   CPPUNIT_ASSERT_EQUAL_MESSAGE(
174     "The time_req was not passed in correctly",
175     cmd.getTimeReq(),
176     MockAcquireCred::time_req
177   );
178   
179   CPPUNIT_ASSERT_EQUAL_MESSAGE(
180     "The desired mechs were not passed in correctly",
181     cmd.getDesiredMechs(),
182     MockAcquireCred::desired_mechs
183   );
184   
185   CPPUNIT_ASSERT_EQUAL_MESSAGE(
186     "The cred_usage was not passed in correctly",
187     cmd.getCredUsage(),
188     MockAcquireCred::cred_usage
189   );
190   
191   CPPUNIT_ASSERT_EQUAL_MESSAGE(
192     "The output credential handle was not passed in correctly",
193     MockAcquireCred::output_cred_handle,
194     cmd.getOutputCredHandle()
195   );
196   
197   CPPUNIT_ASSERT_EQUAL_MESSAGE(
198     "The actual mechanisms value was not passed in correctly",
199     MockAcquireCred::actual_mechs->count,
200     cmd.getActualMechs()->count
201   );
202   
203   CPPUNIT_ASSERT_EQUAL_MESSAGE(
204     "The time_rec value was not passed in correctly",
205     MockAcquireCred::time_rec,
206     cmd.getTimeRec()
207   );
208   
209   /* Cleanup */
210   /* Return */
211 }
212
213
214 /* Desired JSON output:
215  * 
216  * {
217  *   "command": "gss_acquire_cred",
218  *   "return_values": {
219  *     "major_status": 0,
220  *     "minor_status": 0,
221  *     "cred_handle": "###########",
222  *     "actual_mechs": [
223  *       "{ 1 2 3 4 }",
224  *       "{ 1 5 6 7 8 }"
225  *     ],
226  *     "time_rec": 0
227  *   }
228  * }
229  */
230 void GSSAcquireCredTest::testJSONMarshal()
231 {
232   /* Variables */
233   GSSOIDSet actualMechs;
234   JSONObject *result;
235   GSSAcquireCred cmd = GSSAcquireCred(&mock_acquire_cred);
236   
237   /* Error checking */
238   /* Setup */
239   actualMechs.addOID( GSSOID( (char *)"{ 1 2 3 4 }" ) );
240   actualMechs.addOID( GSSOID( (char *)"{ 1 5 6 7 8 }" ) );
241   MockAcquireCred::reset();
242   MockAcquireCred::retVal = 0;
243   MockAcquireCred::minor_status = 0;
244   MockAcquireCred::output_cred_handle = GSS_C_NO_CREDENTIAL;
245   MockAcquireCred::actual_mechs = actualMechs.toGss();
246   MockAcquireCred::time_rec = 0;
247   
248   /* Main */
249   cmd.execute();
250   result = cmd.toJSON();
251   
252 //   std::cout << "\n" << result->dump() << "\n";
253   
254   CPPUNIT_ASSERT_EQUAL_MESSAGE(
255     "The command name is incorrect",
256     std::string("gss_acquire_cred"),
257     std::string( (*result)["command"].string() )
258   );
259   
260   
261   CPPUNIT_ASSERT_EQUAL_MESSAGE(
262     "The return value was reported incorrectly",
263     (int)MockAcquireCred::retVal,
264     (int)( (*result)["return_values"]["major_status"].integer() )
265   );
266   
267   CPPUNIT_ASSERT_EQUAL_MESSAGE(
268     "The minor_status value was reported incorrectly",
269     (int)MockAcquireCred::minor_status,
270     (int)( (*result)["return_values"]["minor_status"].integer() )
271   );
272   
273   CPPUNIT_ASSERT_EQUAL_MESSAGE(
274     "The gss_name was reported incorrectly",
275     std::string("{ 1 2 3 4 }"),
276     std::string( (*result)["return_values"]["actual_mechs"][(size_t)0].string() )
277   );
278   
279   CPPUNIT_ASSERT_EQUAL_MESSAGE(
280     "The gss_name was reported incorrectly",
281     std::string("{ 1 5 6 7 8 }"),
282     std::string( (*result)["return_values"]["actual_mechs"][(size_t)1].string() )
283   );
284   
285   CPPUNIT_ASSERT_EQUAL_MESSAGE(
286     "The minor_status value was reported incorrectly",
287     (int)MockAcquireCred::time_rec,
288     (int)( (*result)["return_values"]["time_rec"].integer() )
289   );
290   
291   
292   /* Cleanup */
293   /* Return */
294 }
295