diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2018-01-25 12:52:13 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2018-01-25 12:58:19 -0800 |
commit | 1446e9f8202f87cf646053760ce41fc0aa938e21 (patch) | |
tree | 1bbbdaeca7a30cc560c88f55d2ce35d67f7820fa /spec/unit | |
parent | 4997ad7707714cbfd35acef398f17fa133bed053 (diff) | |
download | chef-1446e9f8202f87cf646053760ce41fc0aa938e21.tar.gz |
fix node assignment of ImmutableArrays to VividMashes/AttrArrays
node.default['foo'] = node['bar'] need to have node['bar'] have its
cache vivified otherwise we potentially get an empty hash or array.
in the case of hashes, the assignment must have been walking though
the values with #each or something which poked the cache on the target
hash which caused it to vivify, so this bug only affected Arrays
where the AttrArray initializer likely did a quick-n-dirty copy of
the internal structure of the ImmutableArray which was empty.
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
Diffstat (limited to 'spec/unit')
-rw-r--r-- | spec/unit/node/attribute_spec.rb | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/spec/unit/node/attribute_spec.rb b/spec/unit/node/attribute_spec.rb index 90b3f1fe51..a9dab144ab 100644 --- a/spec/unit/node/attribute_spec.rb +++ b/spec/unit/node/attribute_spec.rb @@ -1304,4 +1304,19 @@ describe Chef::Node::Attribute do expect { @attributes["foo"]["bar"][0] << "buzz" }.to raise_error(RuntimeError, "can't modify frozen String") end end + + describe "assigning lazy ungenerated caches to other attributes" do + it "works with arrays" do + @attributes.default["foo"]["baz"] = %w{one two} + @attributes.default["bar"]["baz"] = @attributes["foo"]["baz"] + expect(@attributes.default["bar"]["baz"]).to eql(%w{one two}) + end + + it "works with hashes" do + @attributes.default["foo"]["baz"] = { "one" => "two" } + @attributes.default["bar"]["baz"] = @attributes["foo"]["baz"] + expect(@attributes.default["bar"]["baz"]).to eql({ "one" => "two" }) + end + end + end |