ohloh_scm / branches / master / test / unit / cvs_validation_test.rb
history
require File.dirname(__FILE__) + '/../test_helper'
module Scm::Adapters
class CvsValidationTest < Scm::Test
def test_rejected_urls
[ nil, "", "foo", "http:/", "http:://", "http://", "http://a",
":pserver", # that's not enough
":pserver:anonymous", #still not enough
":pserver:anonymous:@ipodder.cvs.sourceforge.net", # missing the path
":pserver:anonymous:::@ipodder.cvs.sourceforge.net:/cvsroot/ipodder", # too many colons
":pserver@ipodder.cvs.sourceforge.net:/cvsroot/ipodder", # not enough colons
":pserver:anonymous:@ipodder.cvs.sourceforge.net/cvsroot/ipodder", # hostname and path not separated by colon
":pserver:anonymous:@ipodder.cvs.source/forge.net:/cvsroot/ipodder", # slash in hostname
":pserver:anonymous:ipodder.cvs.sourceforge.net:/cvsroot/ipodder", # missing @
":pserver:anonymous:@ipodder.cvs.sourceforge.net:cvsroot/ipodder", # path does not begin at root
":pserver:anonymous:@ipodder.cvs.sourceforge.net:/cvsr%23oot/ipodder", # no encoded chars allowed
":pserver:anonymous:@ipodder.cvs.sourceforge.net:/cvsroot/ipodder;asdf", # no ; in url
":pserver:anonymous:@ipodder.cvs.sourceforge.net:/cvsroot/ipodder malicious code", # spaces not allowed
"sourceforge.net/svn/project/trunk", # missing a protocol prefix
"file:///home/robin/cvs", # file protocol is not allowed
"http://svn.sourceforge.net", # http protocol is not allowed
"git://kernel.org/whatever/linux.git" # git protocol is not allowed
].each do |url|
# Rejected for both internal and public use
[true, false].each do |p|
cvs = CvsAdapter.new(:url => url, :public_urls_only => p)
assert cvs.validate_url
end
end
end
def test_accepted_urls
[ ":pserver:anonymous:@ipodder.cvs.sourceforge.net:/cvsroot/ipodder",
":pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot",
":pserver:anonymous:@cvs-mirror.mozilla.org:/cvsroot",
":pserver:guest:@cvs.dev.java.net:/shared/data/ccvs/repository",
":pserver:anoncvs:password@anoncvs.postgresql.org:/projects/cvsroot",
":pserver:anonymous:@rubyeclipse.cvs.sourceforge.net:/cvsroot/rubyeclipse",
":pserver:cvs:cvs@cvs.winehq.org:/home/wine",
":pserver:tcpdump:anoncvs@cvs.tcpdump.org:/tcpdump/master",
":pserver:anonymous:@user-mode-linux.cvs.sourceforge.net:/cvsroot/user-mode-linux",
":pserver:anonymous:@sc2.cvs.sourceforge.net:/cvsroot/sc2",
":pserver:cool-dev:@sc2.cvs.sourceforge.net:/cvsroot/sc2", # Hyphen should be OK in username
":pserver:cvs_anon:@cvs.scms.waikato.ac.nz:/usr/local/global-cvs/ml_cvs", # Underscores should be ok in path
":pserver:anonymous:freefem++@idared.ann.jussieu.fr:/Users/pubcvs/cvs" # Pluses should be OK
].each do |url|
# Valid for both internal and public use
[true, false].each do |p|
cvs = CvsAdapter.new(:url => url, :public_urls_only => p)
assert !cvs.validate_url
end
end
end
# Local files not accepted for public URLs
def test_local_file_url
cvs = CvsAdapter.new(:url => "/root")
assert !cvs.validate_url
cvs = CvsAdapter.new(:url => "/root", :public_urls_only => true)
assert cvs.validate_url
end
def test_rejected_module_names
[nil,"","%",";","&","\n","\t"].each do |x|
cvs = CvsAdapter.new(:url => ":pserver:cvs:cvs@cvs.test.org:/test", :module_name => x)
assert !cvs.valid?
assert cvs.errors.first[0] = :module_name
end
end
def test_accepted_module_names
["myproject","my/project","my/project/2.0","my_project","0","My .Net Module", "my-module", "my-module++"].each do |x|
cvs = CvsAdapter.new(:url => ":pserver:cvs:cvs@cvs.test.org:/test", :module_name => x)
assert cvs.valid?
end
end
def test_symlink_fixup
cvs = CvsAdapter.new(:url => ":pserver:anoncvs:@cvs.netbeans.org:/cvs")
assert_equal ":pserver:anoncvs:@cvs.netbeans.org:/shared/data/ccvs/repository", cvs.normalize.url
cvs = CvsAdapter.new(:url => ":pserver:anoncvs:@cvs.netbeans.org:/cvs/")
assert_equal ":pserver:anoncvs:@cvs.netbeans.org:/shared/data/ccvs/repository", cvs.normalize.url
cvs = CvsAdapter.new(:url => ":pserver:anoncvs:@cvs.dev.java.net:/cvs")
assert_equal ":pserver:anoncvs:@cvs.dev.java.net:/shared/data/ccvs/repository", cvs.normalize.url
cvs = CvsAdapter.new(:url => ":PSERVER:ANONCVS:@CVS.DEV.JAVA.NET:/cvs")
assert_equal ":PSERVER:ANONCVS:@CVS.DEV.JAVA.NET:/shared/data/ccvs/repository", cvs.normalize.url
cvs = CvsAdapter.new(:url => ":pserver:anonymous:@cvs.gna.org:/cvs/eagleusb")
assert_equal ":pserver:anonymous:@cvs.gna.org:/var/cvs/eagleusb", cvs.normalize.url
end
def test_sync_pserver_username_password
# Pull username only from url
cvs = CvsAdapter.new(:url => ":pserver:guest:@ohloh.net:/test")
cvs.normalize
assert_equal ':pserver:guest:@ohloh.net:/test', cvs.url
assert_equal 'guest', cvs.username
assert_equal '', cvs.password
# Pull username and password from url
cvs = CvsAdapter.new(:url => ":pserver:guest:secret@ohloh.net:/test")
cvs.normalize
assert_equal ':pserver:guest:secret@ohloh.net:/test', cvs.url
assert_equal 'guest', cvs.username
assert_equal 'secret', cvs.password
# Apply username and password to url
cvs = CvsAdapter.new(:url => ":pserver::@ohloh.net:/test", :username => "guest", :password => "secret")
cvs.normalize
assert_equal ':pserver:guest:secret@ohloh.net:/test', cvs.url
assert_equal 'guest', cvs.username
assert_equal 'secret', cvs.password
# Passwords disagree, use :password attribute
cvs = CvsAdapter.new(:url => ":pserver:guest:old@ohloh.net:/test", :username => "guest", :password => "new")
cvs.normalize
assert_equal ':pserver:guest:new@ohloh.net:/test', cvs.url
assert_equal 'guest', cvs.username
assert_equal 'new', cvs.password
end
def test_guess_forge
cvs = CvsAdapter.new(:url => nil)
assert_equal nil, cvs.guess_forge
cvs = CvsAdapter.new(:url => "garbage_in_garbage_out")
assert_equal nil, cvs.guess_forge
cvs = CvsAdapter.new(:url => ':pserver:anonymous:@boost.cvs.sourceforge.net:/cvsroot/boost')
assert_equal 'sourceforge.net', cvs.guess_forge
cvs = CvsAdapter.new(:url => ':pserver:guest:@cvs.dev.java.net:/cvs')
assert_equal 'java.net', cvs.guess_forge
cvs = CvsAdapter.new(:url => ":PSERVER:ANONCVS:@CVS.DEV.JAVA.NET:/cvs")
assert_equal 'java.net', cvs.guess_forge
cvs = CvsAdapter.new(:url => ":pserver:guest:@colorchooser.dev.java.net:/cvs")
assert_equal 'java.net', cvs.guess_forge
end
end
end
