2 # Copyright (C) 2007, Thomas Leonard
3 # See the README file for details, or visit http://0install.net.
4 import sys
, os
, shutil
, tempfile
, subprocess
, imp
6 from zeroinstall
.injector
import model
, qdom
, writer
7 from zeroinstall
.injector
.config
import load_config
8 from zeroinstall
.support
import basedir
, ro_rmtree
10 sys
.path
.insert(0, '..')
11 os
.environ
['http_proxy'] = 'localhost:1111' # Prevent accidental network access
15 mydir
= os
.path
.realpath(os
.path
.dirname(__file__
))
16 release_feed
= mydir
+ '/../0release.xml'
17 test_repo
= mydir
+ '/test-repo.tgz'
18 test_repo_actions
= mydir
+ '/test-repo-actions.tgz'
19 test_repo_c
= mydir
+ '/c-prog.tgz'
20 test_gpg
= mydir
+ '/gpg.tgz'
25 auto_approve_keys = True
26 help_with_testing = True
30 def call_with_output_suppressed(cmd
, stdin
, expect_failure
= False, **kwargs
):
31 #cmd = [cmd[0], '-v'] + cmd[1:]
33 child
= subprocess
.Popen(cmd
, stdin
= subprocess
.PIPE
, stdout
= subprocess
.PIPE
, **kwargs
)
35 child
= subprocess
.Popen(cmd
, stdout
= subprocess
.PIPE
, **kwargs
)
36 stdout
, stderr
= child
.communicate(stdin
)
37 if (child
.returncode
!= 0) == expect_failure
:
40 raise Exception("Return code %d from %s\nstdout: %s\nstderr: %s" % (child
.returncode
, cmd
, stdout
, stderr
))
42 def make_releases_dir(src_feed
= '../hello/HelloWorld.xml', auto_upload
= False):
44 call_with_output_suppressed(['0release', src_feed
], None)
45 assert os
.path
.isfile('make-release')
47 lines
= file('make-release').readlines()
48 lines
[lines
.index('ARCHIVE_DIR_PUBLIC_URL=\n')] = 'ARCHIVE_DIR_PUBLIC_URL=http://TESTING/releases\n'
50 # Force us to test against this version of 0release
51 for i
, line
in enumerate(lines
):
52 if line
.startswith('exec 0launch http://0install.net/2007/interfaces/0release.xml --release'):
53 lines
[i
] = '0release --release ' + line
.split('--release ', 1)[1]
60 lines
[lines
.index('ARCHIVE_UPLOAD_COMMAND=\n')] = 'ARCHIVE_UPLOAD_COMMAND=\'cp "$@" ../archives/\'\n'
62 s
= file('make-release', 'w')
63 s
.write(''.join(lines
))
66 class TestRelease(unittest
.TestCase
):
68 self
.tmp
= tempfile
.mkdtemp(prefix
= '0release-')
70 support
.check_call(['tar', 'xzf', test_gpg
])
72 os
.environ
['GNUPGHOME'] = self
.tmp
+ '/gpg'
73 os
.chmod(os
.environ
['GNUPGHOME'], 0700)
75 config_dir
= os
.path
.join(self
.tmp
, 'config')
76 injector_config
= os
.path
.join(config_dir
, '0install.net', 'injector')
77 os
.makedirs(injector_config
)
78 s
= open(os
.path
.join(injector_config
, 'global'), 'w')
82 if 'ZEROINSTALL_PORTABLE_BASE' in os
.environ
:
83 del os
.environ
['ZEROINSTALL_PORTABLE_BASE']
84 os
.environ
['XDG_CONFIG_HOME'] = config_dir
86 assert basedir
.xdg_config_home
== config_dir
88 # Register the local 0release/0compile feeds so we can test against those
89 self
.config
= load_config()
91 iface
= self
.config
.iface_cache
.get_interface("http://0install.net/2007/interfaces/0release.xml")
92 iface
.extra_feeds
= [model
.Feed(release_feed
, arch
= None, user_override
= True)]
93 writer
.save_interface(iface
)
95 iface
= self
.config
.iface_cache
.get_interface("http://0install.net/2006/interfaces/0compile.xml")
96 iface
.extra_feeds
= [model
.Feed(os
.environ
["0COMPILE_FEED"], arch
= None, user_override
= True)]
97 writer
.save_interface(iface
)
103 def testSimple(self
):
104 support
.check_call(['tar', 'xzf', test_repo
])
107 call_with_output_suppressed(['./make-release', '-k', 'Testing'], '\nP\n\n')
109 call_with_output_suppressed(['./make-release', '-k', 'Testing'], '\nP\nY\n\n')
111 assert 'Prints "Hello World"' in file('0.1/changelog-0.1').read()
112 assert 'Prints "Hello World"' not in file('0.2/changelog-0.2').read()
114 def testUncommitted(self
):
115 support
.check_call(['tar', 'xzf', test_repo_actions
])
118 unused
, stderr
= call_with_output_suppressed(['./make-release', '-k', 'Testing'], None,
119 expect_failure
= True, stderr
= subprocess
.PIPE
)
120 assert "Uncommitted changes!" in stderr
122 def testActions(self
):
123 support
.check_call(['tar', 'xzf', test_repo_actions
])
125 support
.check_call(['git', 'commit', '-a', '-m', 'Added release instructions'], stdout
= subprocess
.PIPE
)
129 assert "version = '0.2'\n" not in file('../hello/hello.py').read()
131 child
= subprocess
.Popen(['./make-release', '-k', 'Testing'], stdin
= subprocess
.PIPE
, stdout
= subprocess
.PIPE
)
132 unused
, unused
= child
.communicate('\nP\n\n')
133 assert child
.returncode
== 0
135 assert "version = '0.2'\n" in file('../hello/hello.py').read()
137 def testBinaryRelease(self
):
138 support
.check_call(['tar', 'xzf', test_repo_c
])
139 make_releases_dir(src_feed
= '../c-prog/c-prog.xml', auto_upload
= True)
141 call_with_output_suppressed(['./make-release', '-k', 'Testing', '--builders=host'], '\nP\n\n')
143 feed
= model
.ZeroInstallFeed(qdom
.parse(file('HelloWorld-in-C.xml')))
145 assert len(feed
.implementations
) == 2
146 src_impl
, = [x
for x
in feed
.implementations
.values() if x
.arch
== '*-src']
147 host_impl
, = [x
for x
in feed
.implementations
.values() if x
.arch
!= '*-src']
149 assert src_impl
.main
== None
150 assert host_impl
.main
== 'hello'
152 archives
= os
.listdir('archives')
153 assert os
.path
.basename(src_impl
.download_sources
[0].url
) in archives
155 host_download
= host_impl
.download_sources
[0]
156 host_archive
= os
.path
.basename(host_download
.url
)
157 assert host_archive
in archives
158 support
.check_call(['tar', 'xjf', os
.path
.join('archives', host_archive
)])
159 c
= subprocess
.Popen(['0launch', os
.path
.join(host_download
.extract
, '0install', 'feed.xml')], stdout
= subprocess
.PIPE
)
160 output
, _
= c
.communicate()
162 self
.assertEquals("Hello from C! (version 1.1)\n", output
)
165 suite
= unittest
.makeSuite(TestRelease
)
166 if __name__
== '__main__':