2014-01-25 19:08:04 +01:00
#! /usr/bin/env ruby -S rspec
require 'spec_helper'
require 'rspec-puppet'
2010-12-16 16:22:24 +01:00
require 'mocha'
require 'fileutils'
2014-01-25 19:08:04 +01:00
describe 'ssh_keygen' do
2010-12-16 16:22:24 +01:00
2014-01-25 19:08:04 +01:00
let ( :scope ) { PuppetlabsSpec :: PuppetInternals . scope }
2010-12-16 16:22:24 +01:00
2014-01-25 19:08:04 +01:00
it 'should exist' do
2010-12-16 16:22:24 +01:00
Puppet :: Parser :: Functions . function ( " ssh_keygen " ) . should == " function_ssh_keygen "
end
2014-01-25 19:08:04 +01:00
it 'should raise a ParseError if no argument is passed' do
lambda {
scope . function_ssh_keygen ( [ ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
2014-01-25 19:08:04 +01:00
it 'should raise a ParseError if there is more than 1 arguments' do
lambda {
scope . function_ssh_keygen ( [ " foo " , " bar " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
2014-01-25 19:08:04 +01:00
it 'should raise a ParseError if the argument is not fully qualified' do
lambda {
scope . function_ssh_keygen ( [ " foo " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
it " should raise a ParseError if the private key path is a directory " do
File . stubs ( :directory? ) . with ( " /some_dir " ) . returns ( true )
2014-01-25 19:08:04 +01:00
lambda {
scope . function_ssh_keygen ( [ " /some_dir " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
it " should raise a ParseError if the public key path is a directory " do
File . stubs ( :directory? ) . with ( " /some_dir.pub " ) . returns ( true )
2014-01-25 19:08:04 +01:00
lambda {
scope . function_ssh_keygen ( [ " /some_dir.pub " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
2014-01-25 19:08:04 +01:00
describe 'when executing properly' do
2010-12-16 16:22:24 +01:00
before do
File . stubs ( :directory? ) . with ( '/tmp/a/b/c' ) . returns ( false )
File . stubs ( :directory? ) . with ( '/tmp/a/b/c.pub' ) . returns ( false )
File . stubs ( :read ) . with ( '/tmp/a/b/c' ) . returns ( 'privatekey' )
File . stubs ( :read ) . with ( '/tmp/a/b/c.pub' ) . returns ( 'publickey' )
end
2014-01-25 19:08:04 +01:00
it 'should fail if the public but not the private key exists' do
File . stubs ( :exists? ) . with ( '/tmp/a/b/c' ) . returns ( true )
File . stubs ( :exists? ) . with ( '/tmp/a/b/c.pub' ) . returns ( false )
lambda {
scope . function_ssh_keygen ( [ '/tmp/a/b/c' ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
it " should fail if the private but not the public key exists " do
File . stubs ( :exists? ) . with ( " /tmp/a/b/c " ) . returns ( false )
File . stubs ( :exists? ) . with ( " /tmp/a/b/c.pub " ) . returns ( true )
2014-01-25 19:08:04 +01:00
lambda {
scope . function_ssh_keygen ( [ " /tmp/a/b/c " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
it " should return an array of size 2 with the right conent if the keyfiles exists " do
File . stubs ( :exists? ) . with ( " /tmp/a/b/c " ) . returns ( true )
File . stubs ( :exists? ) . with ( " /tmp/a/b/c.pub " ) . returns ( true )
File . stubs ( :directory? ) . with ( '/tmp/a/b' ) . returns ( true )
Puppet :: Util . expects ( :execute ) . never
2014-01-25 19:08:04 +01:00
result = scope . function_ssh_keygen ( [ '/tmp/a/b/c' ] )
2010-12-16 16:22:24 +01:00
result . length . should == 2
result [ 0 ] . should == 'privatekey'
result [ 1 ] . should == 'publickey'
end
2014-01-26 15:25:48 +01:00
it " should create the directory path if it does not exist " do
2010-12-16 16:22:24 +01:00
File . stubs ( :exists? ) . with ( " /tmp/a/b/c " ) . returns ( false )
File . stubs ( :exists? ) . with ( " /tmp/a/b/c.pub " ) . returns ( false )
File . stubs ( :directory? ) . with ( " /tmp/a/b " ) . returns ( false )
2012-06-08 18:17:23 +02:00
FileUtils . expects ( :mkdir_p ) . with ( " /tmp/a/b " , :mode = > 0700 )
2014-01-26 15:25:48 +01:00
Puppet :: Util :: Execution . expects ( :execute ) . returns ( " " )
2014-01-25 19:08:04 +01:00
result = scope . function_ssh_keygen ( [ '/tmp/a/b/c' ] )
2010-12-16 16:22:24 +01:00
result . length . should == 2
result [ 0 ] . should == 'privatekey'
result [ 1 ] . should == 'publickey'
end
2014-01-26 15:25:48 +01:00
it " should generate the key if the keyfiles do not exist " do
2010-12-16 16:22:24 +01:00
File . stubs ( :exists? ) . with ( " /tmp/a/b/c " ) . returns ( false )
File . stubs ( :exists? ) . with ( " /tmp/a/b/c.pub " ) . returns ( false )
File . stubs ( :directory? ) . with ( " /tmp/a/b " ) . returns ( true )
2014-01-26 15:25:48 +01:00
Puppet :: Util :: Execution . expects ( :execute ) . with ( [ '/usr/bin/ssh-keygen' , '-t' , 'rsa' , '-b' , '4096' , '-f' , '/tmp/a/b/c' , '-P' , '' , '-q' ] ) . returns ( " " )
2014-01-25 19:08:04 +01:00
result = scope . function_ssh_keygen ( [ '/tmp/a/b/c' ] )
2010-12-16 16:22:24 +01:00
result . length . should == 2
result [ 0 ] . should == 'privatekey'
result [ 1 ] . should == 'publickey'
end
2014-01-26 15:25:48 +01:00
it " should fail if something goes wrong during generation " do
2010-12-16 16:22:24 +01:00
File . stubs ( :exists? ) . with ( " /tmp/a/b/c " ) . returns ( false )
File . stubs ( :exists? ) . with ( " /tmp/a/b/c.pub " ) . returns ( false )
File . stubs ( :directory? ) . with ( " /tmp/a/b " ) . returns ( true )
2014-01-26 15:25:48 +01:00
Puppet :: Util :: Execution . expects ( :execute ) . with ( [ '/usr/bin/ssh-keygen' , '-t' , 'rsa' , '-b' , '4096' , '-f' , '/tmp/a/b/c' , '-P' , '' , '-q' ] ) . returns ( " something is wrong " )
2014-01-25 19:08:04 +01:00
lambda {
scope . function_ssh_keygen ( [ " /tmp/a/b/c " ] )
} . should ( raise_error ( Puppet :: ParseError ) )
2010-12-16 16:22:24 +01:00
end
end
end