summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authortpowell-progress <104777878+tpowell-progress@users.noreply.github.com>2022-10-14 15:44:57 -0400
committerGitHub <noreply@github.com>2022-10-14 15:44:57 -0400
commitc7b2dadfc3609ba84b949803f350c8542a3916eb (patch)
treea84b5d6128ae7f617d9d27c495160b7247dd6a8a /spec
parent3200461b241474138f194b4cc7e8479f6dd12af8 (diff)
parentf4fab1f6ccef9acc59ada9b12adad156ab727fe6 (diff)
downloadchef-c7b2dadfc3609ba84b949803f350c8542a3916eb.tar.gz
Merge pull request #13223 from fretb/bug/linux-user-compare
Fixes bug in compare_user on Linux systems
Diffstat (limited to 'spec')
-rw-r--r--spec/functional/resource/user/linux_user_spec.rb120
-rw-r--r--spec/unit/provider/user/linux_spec.rb45
2 files changed, 165 insertions, 0 deletions
diff --git a/spec/functional/resource/user/linux_user_spec.rb b/spec/functional/resource/user/linux_user_spec.rb
new file mode 100644
index 0000000000..a2d99bbb03
--- /dev/null
+++ b/spec/functional/resource/user/linux_user_spec.rb
@@ -0,0 +1,120 @@
+#
+# Copyright:: Copyright (c) Chef Software Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+require "spec_helper"
+require "chef/mixin/shell_out"
+
+metadata = {
+ requires_root: true,
+}
+
+describe "Chef::Resource::User with Chef::Provider::User::LinuxUser provider", metadata do
+ include Chef::Mixin::ShellOut
+
+ def clean_user
+ shell_out!("/usr/sbin/userdel #{username}")
+ rescue Mixlib::ShellOut::ShellCommandFailed
+ # Raised when the user is already cleaned
+ end
+
+ def ensure_file_cache_path_exists
+ path = Chef::Config["file_cache_path"]
+ FileUtils.mkdir_p(path) unless File.directory?(path)
+ end
+
+ def user_should_exist
+ expect(shell_out("grep -q #{username} /etc/passwd").error?).to be(false)
+ end
+
+ def check_password(pass, user)
+ expect(shell_out("grep ^#{user}: /etc/shadow | cut -d: -f2 | grep ^#{pass}$").exitstatus).to eq(0)
+ end
+
+ let(:node) do
+ n = Chef::Node.new
+ n.consume_external_attrs(OHAI_SYSTEM.data.dup, {})
+ n
+ end
+
+ let(:events) do
+ Chef::EventDispatch::Dispatcher.new
+ end
+
+ let(:run_context) do
+ Chef::RunContext.new(node, {}, events)
+ end
+
+ let(:username) do
+ "greatchef"
+ end
+
+ let(:uid) { nil }
+ let(:gid) { 20 }
+ let(:home) { nil }
+ let(:manage_home) { false }
+ let(:password) { "XXXYYYZZZ" }
+ let(:comment) { "Great Chef" }
+ let(:shell) { "/bin/bash" }
+ let(:salt) { nil }
+
+ let(:user_resource) do
+ r = Chef::Resource::User::LinuxUser.new("TEST USER RESOURCE", run_context)
+ r.username(username)
+ r.uid(uid)
+ r.gid(gid)
+ r.home(home)
+ r.shell(shell)
+ r.comment(comment)
+ r.manage_home(manage_home)
+ r.password(password)
+ r.salt(salt)
+ r
+ end
+
+ before do
+ clean_user
+ ensure_file_cache_path_exists
+ end
+
+ after(:each) do
+ clean_user
+ end
+
+ describe "action :create" do
+ it "should create the user" do
+ user_resource.run_action(:create)
+ user_should_exist
+ check_password(password, username)
+ end
+ end
+
+ describe "when user exists" do
+ before do
+ existing_resource = user_resource.dup
+ existing_resource.run_action(:create)
+ user_should_exist
+ end
+
+ describe "when password is updated" do
+ it "should update the password of the user" do
+ user_resource.password("mykitchen")
+ user_resource.run_action(:create)
+ check_password("mykitchen", username)
+ end
+ end
+ end
+end
diff --git a/spec/unit/provider/user/linux_spec.rb b/spec/unit/provider/user/linux_spec.rb
index 1fc8e3c6a1..3b56d13d04 100644
--- a/spec/unit/provider/user/linux_spec.rb
+++ b/spec/unit/provider/user/linux_spec.rb
@@ -120,4 +120,49 @@ describe Chef::Provider::User::Linux do
expect( provider.universal_options ).to eql(["-f", 90])
end
end
+
+ describe "compare_user_linux" do
+ before(:each) do
+ @new_resource = Chef::Resource::User::LinuxUser.new("notarealuser")
+ @current_resource = Chef::Resource::User::LinuxUser.new("notarealuser")
+ end
+
+ let(:mapping) do
+ {
+ "username" => %w{notarealuser notarealuser},
+ "comment" => ["Nota Realuser", "Not a Realuser"],
+ "uid" => [1000, 1001],
+ "gid" => [1000, 1001],
+ "home" => ["/home/notarealuser", "/Users/notarealuser"],
+ "shell" => ["/usr/bin/zsh", "/bin/bash"],
+ "password" => %w{abcd 12345},
+ }
+ end
+
+ %w{uid gid comment home shell password}.each do |property|
+ it "should return true if #{property} doesn't match" do
+ @new_resource.send(property, mapping[property][0])
+ @current_resource.send(property, mapping[property][1])
+ expect(provider.compare_user).to eql(true)
+ end
+ end
+
+ %w{uid gid}.each do |property|
+ it "should return false if string #{property} matches fixnum" do
+ @new_resource.send(property, "100")
+ @current_resource.send(property, 100)
+ expect(provider.compare_user).to eql(false)
+ end
+ end
+
+ it "should return false if the objects are identical" do
+ expect(provider.compare_user).to eql(false)
+ end
+
+ it "should ignore differences in trailing slash in home paths" do
+ @new_resource.home "/home/notarealuser"
+ @current_resource.home "/home/notarealuser/"
+ expect(provider.compare_user).to eql(false)
+ end
+ end
end