1875b36fc4d0dc0586842fd98d71defd0a83283d
[gssweb.git] / json_gssapi / test / GSSGetMicTest.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 "GSSGetMicTest.h"
9 #include "command_mocks/MockGetMic.h"
10 #include "GSSGetMic.h"
11 #include <datamodel/GSSContext.h>
12 #include <cache/GSSContextCache.h>
13 #include <gssapi/gssapi.h>
14
15 CPPUNIT_TEST_SUITE_REGISTRATION( GSSGetMicTest );
16
17 /* 
18  * a mock of the gss_import_name call
19  * 
20  * Basically, just copy the arguments over to/from the
21  * MockGetMic global object
22  */
23
24 static OM_uint32 KRB5_CALLCONV
25 mock_get_mic(
26     OM_uint32    *minor_status,
27     gss_ctx_id_t  context_handle,
28     gss_qop_t     qop_req,
29     gss_buffer_t  message_buffer,
30     gss_buffer_t  message_token)
31 {
32   /* Error checking */
33   /* Variables */
34   std::string buffer;
35   
36   /* Setup */
37   buffer = MockGetMic::outputToken.toString();
38   
39   /* Main */
40   // Copy our input from the appropriate parameters to MockGetMic
41   MockGetMic::context_handle = context_handle;
42   MockGetMic::qop_req        = qop_req;
43   MockGetMic::inputMessage.setValue((char *)message_buffer->value, message_buffer->length);
44   
45   
46   // copy our output to the appropriate parameters
47   *minor_status = MockGetMic::minor_status;
48   message_token->length = buffer.length();
49   message_token->value  = (void *)buffer.c_str();
50   
51   /* Cleanup */
52   /* return */
53   return MockGetMic::retVal;
54 }
55
56 void GSSGetMicTest::setUp()
57 {
58   CppUnit::TestFixture::setUp();
59   MockGetMic::reset();
60 }
61
62 void GSSGetMicTest::testConstructor()
63 {
64   /* Variables */
65   GSSGetMic cmd = GSSGetMic();
66   
67   /* Error checking */
68   /* Setup */
69   /* Main */
70   CPPUNIT_ASSERT_EQUAL_MESSAGE(
71     "The GSSGetMic object has the wrong GSS function",
72     (void *)&gss_get_mic,
73     (void *)cmd.getGSSFunction()
74   );
75   
76   /* Cleanup */
77   /* Return */
78 }
79
80 void GSSGetMicTest::testEmptyCall()
81 {
82   /* Variables */
83   GSSGetMic cmd = GSSGetMic(&mock_get_mic);
84   GSSBuffer input((char *)"Input message");
85   std::string out("Output Message");
86   gss_qop_t desiredQop = rand();
87   gss_ctx_id_t desiredContext = (gss_ctx_id_t)rand();
88   
89   /* Error checking */
90   /* Setup */
91   cmd.setContextHandle(desiredContext);
92   cmd.setQopReq( desiredQop );
93   cmd.setInputMessage(&input);
94   
95   MockGetMic::minor_status = 0;
96   MockGetMic::retVal = 0;
97   MockGetMic::outputToken.setValue(out);
98   
99   
100   /* Main */
101   cmd.execute();
102   CPPUNIT_ASSERT_EQUAL_MESSAGE(
103     "The requested GSS context handle is not correct",
104     desiredContext,
105     MockGetMic::context_handle
106   );
107   
108   CPPUNIT_ASSERT_EQUAL_MESSAGE(
109     "The qop_req flag was incorrect.",
110     desiredQop,
111     MockGetMic::qop_req
112   );
113   
114   CPPUNIT_ASSERT_EQUAL_MESSAGE(
115     "The input message was incorrect.",
116     input.toString(),
117     MockGetMic::inputMessage.toString()
118   );
119   
120   
121   CPPUNIT_ASSERT_EQUAL_MESSAGE(
122     "The output message token was incorrect.",
123     out,
124     cmd.getOutputToken().toString()
125   );
126   
127   
128   /* Cleanup */
129   /* Return */
130 }
131
132 void GSSGetMicTest::testConstructorWithJSONObject()
133 {
134   /* Variables */
135   GSSContext context((gss_ctx_id_t)rand(), true);
136   std::string key = GSSContextCache::instance()->store(context);
137
138   std::string input = "{\"method\": \"gss_get_mic\", \
139     \"arguments\": \
140     { \
141          \"context_handle\": \"" + key + "\", \
142          \"qop_req\": \"GSS_C_QOP_DEFAULT\", \
143          \"input_message\": \"mary had a little lamb\" \
144     }\
145   }";
146   json_error_t jsonErr;
147   JSONObject json = JSONObject::load(input.c_str(), 0, &jsonErr);
148   
149   GSSGetMic cmd = GSSGetMic(&json, &mock_get_mic);
150   
151   /* Error checking */
152   /* Setup */
153   /* Main */
154   
155   CPPUNIT_ASSERT_EQUAL_MESSAGE(
156     "GSSGetMic did not parse the qop_req argument correctly",
157     (gss_qop_t)0,
158     cmd.getQopReq()
159   );
160   
161   CPPUNIT_ASSERT_EQUAL_MESSAGE(
162     "GSSGetMic did not parse the input message argument correctly",
163     std::string("mary had a little lamb"),
164     cmd.getInputMessage().toString()
165   );
166   
167   CPPUNIT_ASSERT_EQUAL_MESSAGE(
168     "GSSGetMic did not retrieve the context handle correctly",
169     context.getContext(),
170     cmd.getContextHandle()
171   );
172   
173   /* Cleanup */
174   /* Return */
175 }
176
177
178 /* Desired JSON output:
179  * 
180  * {
181  *  "command":       "gss_get_mic",
182  *  "return_values": 
183  *  {
184  *      "major_status": 0,
185  *      "minor_status": 0,
186  *      "output_token": "asdf"
187  *  }
188  * }
189  */
190
191 void GSSGetMicTest::testJSONMarshal()
192 {
193   /* Variables */
194   std::string output("dns@google.com");
195   GSSBuffer input( (char*)"abc" );
196   JSONObject *result;
197   GSSGetMic cmd = GSSGetMic(&mock_get_mic);
198   
199   /* Error checking */
200   /* Setup */
201   MockGetMic::minor_status = 0;
202   MockGetMic::retVal = 0;
203   MockGetMic::outputToken.setValue(output);
204   
205   cmd.setContextHandle(GSS_C_NO_CONTEXT);
206   cmd.setInputMessage( &input );
207   cmd.setQopReq(GSS_C_QOP_DEFAULT);
208   
209   /* Main */
210   cmd.execute();
211   result = cmd.toJSON();
212 //   std::cout << "\nGSSGetMic JSON: \n" << result->dump() << "\n";
213   
214   CPPUNIT_ASSERT_EQUAL_MESSAGE(
215     "The command name is incorrect",
216     std::string("gss_get_mic"),
217     std::string( (*result)["command"].string() )
218   );
219   
220   
221   CPPUNIT_ASSERT_EQUAL_MESSAGE(
222     "The return value was reported incorrectly",
223     (int)MockGetMic::retVal,
224     (int)( (*result)["return_values"]["major_status"].integer() )
225   );
226   
227   CPPUNIT_ASSERT_EQUAL_MESSAGE(
228     "The minor_status value was reported incorrectly",
229     (int)MockGetMic::minor_status,
230     (int)( (*result)["return_values"]["minor_status"].integer() )
231   );
232   
233   CPPUNIT_ASSERT_EQUAL_MESSAGE(
234     "The output message was reported incorrectly",
235     output,
236     std::string( (*result)["return_values"]["output_token"].string() )
237   );
238   
239   
240   /* Cleanup */
241   /* Return */
242 }