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