2 * Copyright (c) 2014 <copyright holder> <email>
4 * For license details, see the LICENSE file in the root of this project.
8 #include "GSSAcquireCredTest.h"
9 #include "GSSAcquireCred.h"
10 #include "command_mocks/MockAcquireCred.h"
11 #include <datamodel/GSSName.h>
12 #include <cache/GSSNameCache.h>
16 CPPUNIT_TEST_SUITE_REGISTRATION( GSSAcquireCredTest );
18 OM_uint32 KRB5_CALLCONV
20 OM_uint32 *minor_status,
21 gss_name_t desired_name,
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,
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;
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;
41 *minor_status = MockAcquireCred::minor_status;
42 return(MockAcquireCred::retVal);
45 void GSSAcquireCredTest::setUp()
50 void GSSAcquireCredTest::tearDown()
55 void GSSAcquireCredTest::testConstructor()
58 GSSAcquireCred cmd = GSSAcquireCred();
63 CPPUNIT_ASSERT_EQUAL_MESSAGE(
64 "The GSSImportName object has the wrong GSS function",
73 void GSSAcquireCredTest::testConstructorWithJSONObject()
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";
83 OM_uint32 major, minor;
87 major = gss_import_name(&minor, GSSBuffer(desired_name).toGss(), GSS_C_NT_HOSTBASED_SERVICE, &des);
90 OM_uint32 min, context;
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;
97 CPPUNIT_ASSERT_MESSAGE(
98 "Could not generate a name to test GSSCreateSecContext JSON parsing.",
101 desired.setValue(des);
102 std::string key = GSSNameCache::instance()->store(desired);
106 "{\"desired_name\" : \"" << key << "\", \
107 \"time_req\" : " << time_req << ", \
108 \"cred_usage\" : " << cred_usage << ", \
109 \"desired_mechs\": [\"" << mech.toString() << "\"] \
113 json_error_t jsonErr;
114 JSONObject json = JSONObject::load(input.str().c_str(), 0, &jsonErr);
116 GSSOIDSet desiredMechs;
119 GSSAcquireCred cmd = GSSAcquireCred(&json, &mock_acquire_cred);
124 CPPUNIT_ASSERT_EQUAL_MESSAGE(
125 "GSSAcquireCred's time_req was not loaded correctly",
130 CPPUNIT_ASSERT_EQUAL_MESSAGE(
131 "GSSAcquireCred's cred_usage was not loaded correctly",
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",
141 (int)cmd.getCredUsage()
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
152 desiredMechs = cmd.getDesiredMechs();
153 CPPUNIT_ASSERT_MESSAGE(
154 "The desired mechanisms were not set properly.",
155 desiredMechs.includes(mech)
162 void GSSAcquireCredTest::testEmptyCall()
165 GSSAcquireCred cmd = GSSAcquireCred(&mock_acquire_cred);
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}");
172 cmd.setDesiredName(steve);
174 cmd.addDesiredMech( moonshotOID );
175 cmd.setCredUsage(GSS_C_INITIATE);
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();
187 CPPUNIT_ASSERT_EQUAL_MESSAGE(
188 "The desired name was not passed in correctly",
190 MockAcquireCred::desired_name
193 CPPUNIT_ASSERT_EQUAL_MESSAGE(
194 "The time_req was not passed in correctly",
196 MockAcquireCred::time_req
199 CPPUNIT_ASSERT_EQUAL_MESSAGE(
200 "The desired mechs were not passed in correctly",
201 cmd.getDesiredMechs(),
202 MockAcquireCred::desired_mechs
205 CPPUNIT_ASSERT_EQUAL_MESSAGE(
206 "The cred_usage was not passed in correctly",
208 MockAcquireCred::cred_usage
211 CPPUNIT_ASSERT_EQUAL_MESSAGE(
212 "The output credential handle was not passed in correctly",
213 MockAcquireCred::output_cred_handle,
214 cmd.getOutputCredHandle()
217 CPPUNIT_ASSERT_EQUAL_MESSAGE(
218 "The actual mechanisms value was not passed in correctly",
219 MockAcquireCred::actual_mechs->count,
220 cmd.getActualMechs()->count
223 CPPUNIT_ASSERT_EQUAL_MESSAGE(
224 "The time_rec value was not passed in correctly",
225 MockAcquireCred::time_rec,
234 /* Desired JSON output:
237 * "command": "gss_acquire_cred",
241 * "cred_handle": "###########",
250 void GSSAcquireCredTest::testJSONMarshal()
253 GSSOIDSet actualMechs;
255 GSSAcquireCred cmd = GSSAcquireCred(&mock_acquire_cred);
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;
270 result = cmd.toJSON();
272 // std::cout << "\n" << result->dump() << "\n";
275 CPPUNIT_ASSERT_EQUAL_MESSAGE(
276 "The return value was reported incorrectly",
277 (int)MockAcquireCred::retVal,
278 (int)( (*result)["major_status"].integer() )
281 CPPUNIT_ASSERT_EQUAL_MESSAGE(
282 "The minor_status value was reported incorrectly",
283 (int)MockAcquireCred::minor_status,
284 (int)( (*result)["minor_status"].integer() )
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() )
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() )
299 CPPUNIT_ASSERT_EQUAL_MESSAGE(
300 "The minor_status value was reported incorrectly",
301 (int)MockAcquireCred::time_rec,
302 (int)( (*result)["time_rec"].integer() )