1/*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at http://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22#include "curlcheck.h" 23 24#include "urldata.h" 25#include "url.h" /* for Curl_safefree */ 26#include "curl_base64.h" 27#include "memdebug.h" /* LAST include file */ 28 29static struct SessionHandle *data; 30 31static CURLcode unit_setup( void ) 32{ 33 data = curl_easy_init(); 34 if (!data) 35 return CURLE_OUT_OF_MEMORY; 36 return CURLE_OK; 37} 38 39static void unit_stop( void ) 40{ 41 curl_easy_cleanup(data); 42} 43 44UNITTEST_START 45 46char *output; 47unsigned char *decoded; 48size_t size = 0; 49unsigned char anychar = 'x'; 50CURLcode rc; 51 52rc = Curl_base64_encode(data, "i", 1, &output, &size); 53fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 54fail_unless(size == 4, "size should be 4"); 55verify_memory( output, "aQ==", 4); 56Curl_safefree(output); 57 58rc = Curl_base64_encode(data, "ii", 2, &output, &size); 59fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 60fail_unless(size == 4, "size should be 4"); 61verify_memory( output, "aWk=", 4); 62Curl_safefree(output); 63 64rc = Curl_base64_encode(data, "iii", 3, &output, &size); 65fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 66fail_unless(size == 4, "size should be 4"); 67verify_memory( output, "aWlp", 4); 68Curl_safefree(output); 69 70rc = Curl_base64_encode(data, "iiii", 4, &output, &size); 71fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 72fail_unless(size == 8, "size should be 8"); 73verify_memory( output, "aWlpaQ==", 8); 74Curl_safefree(output); 75 76/* 0 length makes it do strlen() */ 77rc = Curl_base64_encode(data, "iiii", 0, &output, &size); 78fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 79fail_unless(size == 8, "size should be 8"); 80verify_memory( output, "aWlpaQ==", 8); 81Curl_safefree(output); 82 83rc = Curl_base64_decode("aWlpaQ==", &decoded, &size); 84fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 85fail_unless(size == 4, "size should be 4"); 86verify_memory(decoded, "iiii", 4); 87Curl_safefree(decoded); 88 89rc = Curl_base64_decode("aWlp", &decoded, &size); 90fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 91fail_unless(size == 3, "size should be 3"); 92verify_memory(decoded, "iii", 3); 93Curl_safefree(decoded); 94 95rc = Curl_base64_decode("aWk=", &decoded, &size); 96fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 97fail_unless(size == 2, "size should be 2"); 98verify_memory(decoded, "ii", 2); 99Curl_safefree(decoded); 100 101rc = Curl_base64_decode("aQ==", &decoded, &size); 102fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 103fail_unless(size == 1, "size should be 1"); 104verify_memory(decoded, "i", 2); 105Curl_safefree(decoded); 106 107/* this is an illegal input */ 108size = 1; /* not zero */ 109decoded = &anychar; /* not NULL */ 110rc = Curl_base64_decode("aQ", &decoded, &size); 111/* return code indiferent, but output shall be as follows */ 112fail_unless(size == 0, "size should be 0"); 113fail_if(decoded, "returned pointer should be NULL"); 114 115/* this is garbage input that libcurl decodes as far as possible */ 116size = 0; 117decoded = NULL; 118rc = Curl_base64_decode("a\x1f==", &decoded, &size); 119fail_unless(rc == CURLE_OK, "return code should be CURLE_OK"); 120fail_unless(size == 1, "size should be 1"); 121fail_if(!decoded, "returned pointer should not be NULL"); 122Curl_safefree(decoded); 123 124UNITTEST_STOP 125