# Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with this # work for additional information regarding copyright ownership. The ASF # licenses this file to you 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 File.join(File.dirname(__FILE__), '../spec_helpers') describe Buildr4OSGi::FeatureWriter do before(:all) do class FeatureWriterTester end @f_w = FeatureWriterTester.new @f_w.extend Buildr4OSGi::FeatureWriter end it 'should write a valid feature.xml' do @f_w.feature_id = "myId" @f_w.version = "1.0.0.012" @f_w.branding_plugin = "myPlugin.id" @f_w.copyright = "Copyright (C) 1899-1908, Acme Inc." @f_w.update_sites = [{:url => "http://example.com/update1", :name => "Update site 1"}, {:url => "http://example.com/update2", :name => "Update site 2"}] @f_w.discovery_sites = [{:url => "http://example.com/discovery1", :name => "Discovery site 1"}, {:url => "http://example.com/discovery2", :name => "Discovery site 2"}, {:url => "http://example.com/discovery3", :name => "Discovery site 3"}] feature_xml = @f_w.writeFeatureXml( [{:id => "myPlugin.id", :version => "2.3.4", :"download-size" => "2", :"install-size" => "3", :unpack => false}, {:id => "myOtherPlugin.id", :version => "2.3.5", :"download-size" => "25", :"install-size" => "30", :unpack => false}, {:id => "myBigPlugin.id", :version => "1.2.3.4", :"download-size" => "2", :"install-size" => "300", :unpack => true}], true) feature_xml.should == <<-FEATURE %description Copyright (C) 1899-1908, Acme Inc. %license FEATURE end it 'should not complain nor write an invalid feature.xml if the plugin argument is nil' do @f_w.feature_id = "myId" @f_w.version = "1.0.0.012" @f_w.branding_plugin = nil @f_w.copyright = "Copyright (C) 1899-1908, Acme Inc." @f_w.update_sites = [{:url => "http://example.com/update1", :name => "Update site 1"}, {:url => "http://example.com/update2", :name => "Update site 2"}] @f_w.discovery_sites = [{:url => "http://example.com/discovery1", :name => "Discovery site 1"}, {:url => "http://example.com/discovery2", :name => "Discovery site 2"}, {:url => "http://example.com/discovery3", :name => "Discovery site 3"}] feature_xml = @f_w.writeFeatureXml( [{:id => "myPlugin.id", :version => "2.3.4", :"download-size" => "2", :"install-size" => "3", :unpack => false}, {:id => "myOtherPlugin.id", :version => "2.3.5", :"download-size" => "25", :"install-size" => "30", :unpack => false}, {:id => "myBigPlugin.id", :version => "1.2.3.4", :"download-size" => "2", :"install-size" => "300", :unpack => true}], true) feature_xml = nil lambda { feature_xml = @f_w.writeFeatureXml( [{:id => "myPlugin.id", :version => "2.3.4", :"download-size" => "2", :"install-size" => "3", :unpack => false}, {:id => "myOtherPlugin.id", :version => "2.3.5", :"download-size" => "25", :"install-size" => "30", :unpack => false}, {:id => "myBigPlugin.id", :version => "1.2.3.4", :"download-size" => "2", :"install-size" => "300", :unpack => true}]) }.should_not raise_error feature_xml.should_not match(/plugin="nil"/) feature_xml.should_not match(/plugin=""/) end it "should write a valid feature.properties" do @f_w.label = "my Feature" @f_w.provider = "Acme Inc." @f_w.changesURL = "http://example.com/changes" @f_w.description = "Best feature ever" @f_w.licenseURL = "http://www.example.com/license" @f_w.license = "This license is an example." @f_w.update_sites = [{:url => "http://example.com/update1", :name => "Update site 1"}, {:url => "http://example.com/update2", :name => "Update site 2"}] @f_w.discovery_sites = [{:url => "http://example.com/discovery1", :name => "Discovery site 1"}, {:url => "http://example.com/discovery2", :name => "Discovery site 2"}, {:url => "http://example.com/discovery3", :name => "Discovery site 3"}] feature_properties = @f_w.writeFeatureProperties() feature_properties.should == <<-PROPERTIES # Built by Buildr4OSGi feature.name=my Feature provider.name=Acme Inc. changesURL=http://example.com/changes description=Best feature ever licenseURL=http://www.example.com/license license=This license is an example. PROPERTIES end end describe Buildr4OSGi::FeatureTask, "configuration" do it "should accept the feature parameters" do Buildr::write "p2.inf", "" foo = define("foo", :version => "1.0.0") f = foo.package(:feature) lambda { f.plugins << "com.my:plugin:1.0:jar" f.label = "My feature" f.provider = "Acme Inc" f.copyright = "Copyright 1089-2345 Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] f.p2_inf = "p2.inf" }.should_not raise_error end it "should accept using an existing feature.xml without a feature.properties" do featurexml = <<-FEATURE FEATURE Buildr::write "feature.xml", featurexml foo = define("foo", :version => "1.0.0") foo.package(:feature).feature_xml = "feature.xml" foo.package(:feature).invoke feature_file = File.join(foo.base_dir, "target", "foo-1.0.0.zip") Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo_1.0.0/feature.xml").should_not be_nil zip.read("eclipse/features/foo_1.0.0/feature.xml").should == featurexml zip.find_entry("eclipse/features/foo_1.0.0/feature.properties").should be_nil end end it "should accept using an existing feature.xml, and an optional feature.properties" do featurexml = <<-FEATURE FEATURE featurep = <<-PROPS key=value PROPS Buildr::write "feature.xml", featurexml Buildr::write "feature.properties", featurep foo = define("foo", :version => "1.0.0") foo.package(:feature).feature_xml = "feature.xml" foo.package(:feature).feature_properties = "feature.properties" foo.package(:feature).invoke feature_file = File.join(foo.base_dir, "target", "foo-1.0.0.zip") Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo_1.0.0/feature.xml").should_not be_nil zip.read("eclipse/features/foo_1.0.0/feature.xml").should == featurexml zip.find_entry("eclipse/features/foo_1.0.0/feature.properties").should_not be_nil zip.read("eclipse/features/foo_1.0.0/feature.properties").should == featurep end end it "should generate feature.xml without externalizing strings when passed an existing feature.properties" do featurep = <<-PROPS provider.0=My own provider PROPS Buildr::write "feature.properties", featurep foo = define("foo", :version => "1.0.0") f = foo.package(:feature) f.feature_properties = "feature.properties" f.plugins << DEBUG_UI f.label = "My feature" f.provider = "%provider.0" f.copyright = "Copyright 1089-2345 Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" foo.package(:feature).invoke feature_file = File.join(foo.base_dir, "target", "foo-1.0.0.zip") Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo_1.0.0/feature.xml").should_not be_nil feature_xml = zip.read("eclipse/features/foo_1.0.0/feature.xml") feature_xml.should_not match(/%label/) feature_xml.should match(/%provider\.0/) zip.find_entry("eclipse/features/foo_1.0.0/feature.properties").should_not be_nil zip.read("eclipse/features/foo_1.0.0/feature.properties").should == featurep end end end describe Buildr4OSGi::FeatureTask, " when running" do before do Buildr::write "myp2.inf", "#p2 properties\n" @foo = define("foo", :version => "1.0.0") f = @foo.package(:feature) f.plugins << DEBUG_UI f.label = "My feature" f.provider = "Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] f.p2_inf = "myp2.inf" end it "should create a jar file with a eclipse/plugins and a eclipse/features structure" do @foo.package(:feature).invoke feature_file = File.join(@foo.base_dir, "target", "foo-1.0.0.zip") File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo_1.0.0/feature.xml").should_not be_nil zip.find_entry("eclipse/features/foo_1.0.0/feature.properties").should_not be_nil zip.find_entry("eclipse/features/foo_1.0.0/p2.inf").should_not be_nil zip.find_entry("eclipse/plugins/org.eclipse.debug.ui_3.4.1.v20080811_r341.jar").should_not be_nil end end it 'should complain if one of the dependencies is not a plugin' do @foo.package(:feature).plugins << LOG4J lambda { @foo.package(:feature).invoke}.should raise_error( /The dependency .* is not an Eclipse plugin: make sure the headers Bundle-SymbolicName and Bundle-Version are present in the manifest/) end it "should let the user tell which plugins should be unjarred" do f = @foo.package(:feature) f.plugins.clear @bar = define("bar", :version => "1.0.0") do package(:jar).with :manifest => {"Bundle-SymbolicName" => "bar", "Bundle-Version" => "1.0.0", "Eclipse-BundleShape" => "dir"} end f.plugins.<< DEBUG_UI, :unjarred => true f.plugins.<< @bar @foo.package(:feature).invoke feature_file = @foo.package(:feature).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/plugins/org.eclipse.debug.ui_3.4.1.v20080811_r341/META-INF/MANIFEST.MF").should_not be_nil zip.find_entry("eclipse/plugins/bar_1.0.0/META-INF/MANIFEST.MF").should_not be_nil end end it "should let the user tell which plugins should be unjarred from the plugin manifests" do Buildr::write "bar/META-INF/MANIFEST.MF", <<-MANIFEST Bundle-SymbolicName: bar Bundle-Version: 1.0.0 Eclipse-BundleShape: dir MANIFEST f = @foo.package(:feature) f.plugins.clear @bar = define("bar", :version => "1.0.0", :base_dir => "bar") do package(:bundle) end #f.plugins.<< DEBUG_UI, :unjarred => true f.plugins.<< @bar @foo.package(:feature).invoke feature_file = @foo.package(:feature).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| #zip.find_entry("eclipse/plugins/org.eclipse.debug.ui_3.4.1.v20080811_r341/META-INF/MANIFEST.MF").should_not be_nil zip.find_entry("eclipse/plugins/bar_1.0.0/META-INF/MANIFEST.MF").should_not be_nil end end end describe Buildr4OSGi::FeatureTask, " package subprojects" do before do Buildr::write "bar/src/main/java/Hello.java", "public class Hello {}" @container = define("container") do @bar = define("bar", :version => "1.0.0") do package(:bundle) package(:sources) end end @foo = define("foo", :version => "1.0.0") f = @foo.package(:feature) f.plugins << project("container:bar") f.label = "My feature" f.provider = "Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] end it "should create a jar file with the subproject packaged as a jar inside it" do @foo.package(:feature).invoke feature_file = @foo.package(:feature).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo_1.0.0/feature.xml").should_not be_nil zip.find_entry("eclipse/features/foo_1.0.0/feature.properties").should_not be_nil zip.find_entry("eclipse/plugins/bar_1.0.0.jar").should_not be_nil zip.find_entry("eclipse/plugins/bar_1.0.0.jar").directory?.should be_false end end end describe Buildr4OSGi::FeatureTask, "packaged as SDK" do it "should create a jar file with the subproject packaged as a folder inside it when unjarred option is set" do Buildr::write "bar/src/main/java/Hello.java", "public class Hello {}" @container = define("container") do project.group = "grp" @bar = define("bar", :version => "1.0.0") do package(:bundle) package(:sources) end end @foo = define("foo", :version => "1.0.0") do f = package(:feature) f.plugins.<< project("container:bar"), :unjarred => true f.label = "My feature" f.provider = "Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] package(:sources) end @foo.package(:sources).invoke feature_file = @foo.package(:sources).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.xml").should_not be_nil zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.properties").should_not be_nil zip.find_entry("eclipse/plugins/bar.sources_1.0.0.jar").should be_nil zip.find_entry("eclipse/plugins/bar.sources_1.0.0").directory?.should be_true zip.find_entry("eclipse/plugins/bar.sources_1.0.0/Hello.java").should_not be_nil end end it "should create a jar file with the subproject packaged as a folder inside it when the Eclipse-BundleShape entry is set to dir" do Buildr::write "bar/src/main/java/Hello.java", "public class Hello {}" @container = define("container") do project.group = "grp" @bar = define("bar", :version => "1.0.0") do package(:bundle).manifest.merge!({"Eclipse-BundleShape" => "dir"}) package(:sources) end end @foo = define("foo", :version => "1.0.0") do f = package(:feature) f.plugins.<< project("container:bar") f.label = "My feature" f.provider = "Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] package(:sources) end @foo.package(:sources).invoke feature_file = @foo.package(:sources).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.xml").should_not be_nil zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.properties").should_not be_nil zip.find_entry("eclipse/plugins/bar.sources_1.0.0.jar").should be_nil zip.find_entry("eclipse/plugins/bar.sources_1.0.0").directory?.should be_true zip.find_entry("eclipse/plugins/bar.sources_1.0.0/Hello.java").should_not be_nil end end end describe Buildr4OSGi::FeatureTask, "packaged as SDK, detecting the OSGi headers from the original build" do before do Buildr::write "bar/src/main/java/Hello.java", "public class Hello {}" @container = define("container") do project.group = "grp" @bar = define("bar", :version => "1.0.0") do package(:jar).with :manifest => {"Bundle-SymbolicName" => "myName", "Bundle-Version" => "3.2.1"} package(:sources) end end @foo = define("foo", :version => "1.0.0") do f = package(:feature) f.plugins.<< project("container:bar"), :unjarred => true f.label = "My feature" f.provider = "Acme Inc" f.description = "The best feature ever" f.changesURL = "http://example.com/changes" f.license = "The license is too long to explain" f.licenseURL = "http://example.com/license" f.branding_plugin = "com.musal.ui" f.update_sites << {:url => "http://example.com/update", :name => "My update site"} f.discovery_sites = [{:url => "http://example.com/update2", :name => "My update site2"}, {:url => "http://example.com/upup", :name => "My update site in case"}] package(:sources) end end it "should create a jar file with the subproject packaged as a jar inside it" do project("container:bar").package(:jar).invoke @foo.package(:sources).invoke feature_file = @foo.package(:sources).to_s File.exists?(feature_file).should be_true Zip::ZipFile.open(feature_file) do |zip| zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.xml").should_not be_nil zip.find_entry("eclipse/features/foo.sources_1.0.0/feature.properties").should_not be_nil zip.find_entry("eclipse/plugins/myName.sources_3.2.1.jar").should be_nil zip.find_entry("eclipse/plugins/myName.sources_3.2.1").directory?.should be_true zip.find_entry("eclipse/plugins/myName.sources_3.2.1/Hello.java").should_not be_nil zip.find_entry("eclipse/plugins/myName.sources_3.2.1/META-INF/MANIFEST.MF").should_not be_nil zip.read("eclipse/plugins/myName.sources_3.2.1/META-INF/MANIFEST.MF").should match(/Bundle-SymbolicName: myName\.sources/) end end end