2023-08-21 10:49:27 +02:00
// This file is part of the uutils coreutils package.
//
// For the full copyright and license information, please view the LICENSE
// file that was distributed with this source code.
2025-11-09 02:41:15 +09:00
// spell-checker:ignore unpadded, QUJD
2025-08-08 21:12:54 +02:00
#[cfg(target_os = "linux" )]
use uutests ::at_and_ucmd ;
2025-03-28 09:51:51 +01:00
use uutests ::new_ucmd ;
2015-11-16 00:25:01 -05:00
2026-03-18 08:36:30 +09:00
#[test]
fn test_version () {
new_ucmd! ()
. arg ( "--version" )
. succeeds ()
. no_stderr ()
. stdout_is ( format! ( "base64 {} \n " , uucore ::crate_version! ()));
}
2025-08-08 21:12:54 +02:00
#[test]
#[cfg(target_os = "linux" )]
2026-04-12 15:19:04 +02:00
#[cfg_attr(wasi_runner, ignore = "WASI: argv/filenames must be valid UTF-8" )]
2025-08-08 21:12:54 +02:00
fn test_base64_non_utf8_paths () {
use std ::os ::unix ::ffi ::OsStringExt ;
let ( at , mut ucmd ) = at_and_ucmd! ();
let filename = std ::ffi ::OsString ::from_vec ( vec! [ 0xFF , 0xFE ]);
std ::fs ::write ( at . plus ( & filename ), b "hello world" ). unwrap ();
ucmd . arg ( & filename )
. succeeds ()
. stdout_is ( "aGVsbG8gd29ybGQ= \n " );
}
2015-11-16 00:25:01 -05:00
#[test]
fn test_encode () {
let input = "hello, world!" ;
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-07-29 17:26:32 -04:00
. pipe_in ( input )
2016-07-17 12:56:11 -04:00
. succeeds ()
2021-05-30 00:10:54 -05:00
. stdout_only ( "aGVsbG8sIHdvcmxkIQ== \n " ); // spell-checker:disable-line
2021-04-28 00:36:27 -07:00
// Using '-' as our file
new_ucmd! ()
. arg ( "-" )
. pipe_in ( input )
. succeeds ()
2021-05-30 00:10:54 -05:00
. stdout_only ( "aGVsbG8sIHdvcmxkIQ== \n " ); // spell-checker:disable-line
2021-04-28 00:36:27 -07:00
}
2024-02-24 20:42:51 +01:00
#[test]
fn test_encode_repeat_flags_later_wrap_10 () {
let input = "hello, world!" ;
new_ucmd! ()
. args ( & [ "-ii" , "-w15" , "-w10" ])
. pipe_in ( input )
. succeeds ()
. stdout_only ( "aGVsbG8sIH \n dvcmxkIQ== \n " ); // spell-checker:disable-line
}
#[test]
fn test_encode_repeat_flags_later_wrap_15 () {
let input = "hello, world!" ;
new_ucmd! ()
. args ( & [ "-ii" , "-w10" , "-w15" ])
. pipe_in ( input )
. succeeds ()
. stdout_only ( "aGVsbG8sIHdvcmx \n kIQ== \n " ); // spell-checker:disable-line
}
2024-12-04 22:02:57 +01:00
#[test]
fn test_decode_short () {
let input = "aQ" ;
new_ucmd! ()
. args ( & [ "--decode" ])
. pipe_in ( input )
. succeeds ()
. stdout_only ( "i" );
}
#[test]
fn test_multi_lines () {
let input = [ "aQ \n\n\n " , "a \n Q== \n\n\n " ];
for i in input {
new_ucmd! ()
. args ( & [ "--decode" ])
. pipe_in ( i )
. succeeds ()
. stdout_only ( "i" );
}
}
2021-04-28 00:36:27 -07:00
#[test]
fn test_base64_encode_file () {
new_ucmd! ()
. arg ( "input-simple.txt" )
. succeeds ()
2021-05-30 00:10:54 -05:00
. stdout_only ( "SGVsbG8sIFdvcmxkIQo= \n " ); // spell-checker:disable-line
2015-11-16 00:25:01 -05:00
}
#[test]
fn test_decode () {
2025-03-18 21:39:53 +08:00
for decode_param in [ "-d" , "--decode" , "--dec" , "-D" ] {
2021-05-30 00:10:54 -05:00
let input = "aGVsbG8sIHdvcmxkIQ==" ; // spell-checker:disable-line
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-07-29 17:26:32 -04:00
. arg ( decode_param )
2016-07-17 12:56:11 -04:00
. pipe_in ( input )
. succeeds ()
2016-07-17 02:44:16 -04:00
. stdout_only ( "hello, world!" );
2016-02-15 19:06:30 -05:00
}
2015-11-16 00:25:01 -05:00
}
2024-02-24 20:42:51 +01:00
#[test]
fn test_decode_repeat_flags () {
let input = "aGVsbG8sIHdvcmxkIQ== \n " ; // spell-checker:disable-line
new_ucmd! ()
. args ( & [ "-didiw80" , "--wrap=17" , "--wrap" , "8" ]) // spell-checker:disable-line
. pipe_in ( input )
. succeeds ()
. stdout_only ( "hello, world!" );
}
2025-11-09 02:41:15 +09:00
#[test]
fn test_decode_padded_block_followed_by_unpadded_tail () {
new_ucmd! ()
. arg ( "--decode" )
. pipe_in ( "MTIzNA==MTIzNA" )
. succeeds ()
. stdout_only ( "12341234" );
}
#[test]
fn test_decode_padded_block_followed_by_aligned_tail () {
new_ucmd! ()
. arg ( "--decode" )
. pipe_in ( "MTIzNA==QUJD" )
. succeeds ()
. stdout_only ( "1234ABC" );
}
#[test]
fn test_decode_unpadded_stream_without_equals () {
new_ucmd! ()
. arg ( "--decode" )
. pipe_in ( "MTIzNA" )
. succeeds ()
. stdout_only ( "1234" );
}
2015-11-16 00:25:01 -05:00
#[test]
fn test_garbage () {
2021-05-30 22:55:28 -05:00
let input = "aGVsbG8sIHdvcmxkIQ== \0 " ; // spell-checker:disable-line
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-07-29 17:26:32 -04:00
. arg ( "-d" )
2016-07-17 12:56:11 -04:00
. pipe_in ( input )
. fails ()
2016-08-06 11:47:09 +08:00
. stderr_only ( "base64: error: invalid input \n " );
2015-11-16 00:25:01 -05:00
}
#[test]
fn test_ignore_garbage () {
2022-04-02 10:47:37 +02:00
for ignore_garbage_param in [ "-i" , "--ignore-garbage" , "--ig" ] {
2021-05-30 22:55:28 -05:00
let input = "aGVsbG8sIHdvcmxkIQ== \0 " ; // spell-checker:disable-line
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-07-29 17:26:32 -04:00
. arg ( "-d" )
. arg ( ignore_garbage_param )
2016-07-17 12:56:11 -04:00
. pipe_in ( input )
. succeeds ()
2016-07-17 02:44:16 -04:00
. stdout_only ( "hello, world!" );
2016-02-15 19:06:30 -05:00
}
2015-11-16 00:25:01 -05:00
}
#[test]
fn test_wrap () {
2022-04-02 10:47:37 +02:00
for wrap_param in [ "-w" , "--wrap" , "--wr" ] {
2016-02-15 19:06:30 -05:00
let input = "The quick brown fox jumps over the lazy dog." ;
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-07-29 17:26:32 -04:00
. arg ( wrap_param )
. arg ( "20" )
2016-07-17 12:56:11 -04:00
. pipe_in ( input )
. succeeds ()
2021-05-30 00:10:54 -05:00
// spell-checker:disable-next-line
2016-07-17 02:44:16 -04:00
. stdout_only ( "VGhlIHF1aWNrIGJyb3du \n IGZveCBqdW1wcyBvdmVy \n IHRoZSBsYXp5IGRvZy4= \n " );
2016-02-15 19:06:30 -05:00
}
2024-12-04 22:02:57 +01:00
let input = "hello, world" ;
new_ucmd! ()
. args ( & [ "--wrap" , "0" ])
. pipe_in ( input )
. succeeds ()
. stdout_only ( "aGVsbG8sIHdvcmxk" ); // spell-checker:disable-line
new_ucmd! ()
. args ( & [ "--wrap" , "30" ])
. pipe_in ( input )
. succeeds ()
. stdout_only ( "aGVsbG8sIHdvcmxk \n " ); // spell-checker:disable-line
2015-11-16 00:25:01 -05:00
}
2016-02-15 20:38:03 -05:00
#[test]
fn test_wrap_no_arg () {
2022-04-02 10:47:37 +02:00
for wrap_param in [ "-w" , "--wrap" ] {
2022-10-12 22:04:21 +02:00
new_ucmd! ()
. arg ( wrap_param )
. fails ()
2025-08-11 23:26:13 +02:00
. stderr_contains ( "error: a value is required for '--wrap <COLS>' but none was supplied" )
. stderr_contains ( "For more information, try '--help'." )
2022-09-29 15:21:29 +02:00
. no_stdout ();
2016-02-15 20:38:03 -05:00
}
}
#[test]
fn test_wrap_bad_arg () {
2022-04-02 10:47:37 +02:00
for wrap_param in [ "-w" , "--wrap" ] {
2016-08-23 07:52:43 -04:00
new_ucmd! ()
2016-08-06 11:47:09 +08:00
. arg ( wrap_param )
. arg ( "b" )
2016-07-17 12:56:11 -04:00
. fails ()
2021-08-03 23:37:49 +02:00
. stderr_only ( "base64: invalid wrap size: 'b' \n " );
2016-02-15 20:38:03 -05:00
}
}
2021-04-28 00:36:27 -07:00
#[test]
fn test_base64_extra_operand () {
// Expect a failure when multiple files are specified.
2021-11-09 17:23:41 -03:00
new_ucmd! ()
2021-04-28 00:36:27 -07:00
. arg ( "a.txt" )
2021-08-03 23:37:20 +02:00
. arg ( "b.txt" )
2021-04-28 00:36:27 -07:00
. fails ()
2021-11-09 17:23:41 -03:00
. usage_error ( "extra operand 'b.txt'" );
2021-04-28 00:36:27 -07:00
}
#[test]
fn test_base64_file_not_found () {
new_ucmd! ()
. arg ( "a.txt" )
. fails ()
2023-01-05 21:09:15 +01:00
. stderr_only ( "base64: a.txt: No such file or directory \n " );
2021-04-28 00:36:27 -07:00
}
2024-09-20 14:34:18 -05:00
#[test]
fn test_no_repeated_trailing_newline () {
new_ucmd! ()
. args ( & [ "--wrap" , "10" , "--" , "-" ])
. pipe_in ( "The quick brown fox jumps over the lazy dog." )
. succeeds ()
. stdout_only (
2024-09-20 16:23:13 -05:00
// cSpell:disable
2024-09-20 14:34:18 -05:00
" \
VGhlIHF1aW
NrIGJyb3du
IGZveCBqdW
1wcyBvdmVy
IHRoZSBsYX
p5IGRvZy4=
" ,
2024-09-20 16:23:13 -05:00
// cSpell:enable
2024-09-20 14:34:18 -05:00
);
}
#[test]
fn test_wrap_default () {
2024-09-20 16:23:13 -05:00
const PIPE_IN : & str = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog." ;
2024-09-20 14:34:18 -05:00
new_ucmd! ()
. args ( & [ "--" , "-" ])
2024-09-20 16:23:13 -05:00
. pipe_in ( PIPE_IN )
2024-09-20 14:34:18 -05:00
. succeeds ()
. stdout_only (
2024-09-20 16:23:13 -05:00
// cSpell:disable
2024-09-20 14:34:18 -05:00
" \
VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4gVGhlIHF1aWNrIGJy
b3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4gVGhlIHF1aWNrIGJyb3duIGZveCBqdW1w
cyBvdmVyIHRoZSBsYXp5IGRvZy4=
" ,
2024-09-20 16:23:13 -05:00
// cSpell:enable
2024-09-20 14:34:18 -05:00
);
}
2026-01-27 20:15:48 +02:00
#[test]
#[cfg(all(target_os = "linux" , not(target_env = "musl" )))]
2026-04-12 15:19:04 +02:00
#[cfg_attr(wasi_runner, ignore = "WASI sandbox: host paths not visible" )]
2026-01-27 20:15:48 +02:00
fn test_read_error () {
new_ucmd! ()
. arg ( "/proc/self/mem" )
. fails ()
. stderr_is ( "base64: read error: Input/output error \n " );
}