blob: 72465a7b0c910daa28bc82d7153c74568b5a2865 [file] [log] [blame]
Josh Haberman738393b2016-02-18 20:10:23 -08001#!/bin/bash
Josh Haberman67c727c2016-03-04 14:21:18 -08002#
3# Build and runs tests for the protobuf project. The tests as written here are
4# used by both Jenkins and Travis, though some specialized logic is required to
5# handle the differences between them.
Thomas Van Lentenc4d36382015-06-09 13:35:41 -04006
Josh Haberman0f8c25d2016-02-19 09:11:38 -08007on_travis() {
8 if [ "$TRAVIS" == "true" ]; then
9 "$@"
10 fi
11}
12
Josh Haberman181c7f22015-07-15 11:05:10 -070013# For when some other test needs the C++ main build, including protoc and
14# libprotobuf.
15internal_build_cpp() {
Josh Haberman738393b2016-02-18 20:10:23 -080016 if [ -f src/protoc ]; then
17 # Already built.
18 return
19 fi
20
Josh Habermand33e93b2016-02-18 19:13:07 -080021 if [[ $(uname -s) == "Linux" && "$TRAVIS" == "true" ]]; then
Feng Xiao91258632015-12-21 03:34:28 -080022 # Install GCC 4.8 to replace the default GCC 4.6. We need 4.8 for more
23 # decent C++ 11 support in order to compile conformance tests.
24 sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
25 sudo apt-get update -qq
26 sudo apt-get install -qq g++-4.8
27 export CXX="g++-4.8" CC="gcc-4.8"
28 fi
Feng Xiao1e2fece2015-12-18 15:16:07 -080029
Chris Fallin20e94b22015-05-13 16:43:48 -070030 ./autogen.sh
31 ./configure
Josh Haberman67c727c2016-03-04 14:21:18 -080032 make -j2
Josh Haberman181c7f22015-07-15 11:05:10 -070033}
34
35build_cpp() {
36 internal_build_cpp
Josh Haberman67c727c2016-03-04 14:21:18 -080037 make check -j2
Chris Fallin20e94b22015-05-13 16:43:48 -070038 cd conformance && make test_cpp && cd ..
Josh Habermancb36bde2016-04-29 09:52:20 -070039
40 # Verify benchmarking code can build successfully.
Josh Haberman49a89182016-04-29 10:19:03 -070041 cd benchmarks && make && ./generate-datasets && cd ..
Chris Fallin20e94b22015-05-13 16:43:48 -070042}
43
44build_cpp_distcheck() {
45 ./autogen.sh
46 ./configure
Josh Haberman67c727c2016-03-04 14:21:18 -080047 make distcheck -j2
Chris Fallin20e94b22015-05-13 16:43:48 -070048}
49
Jan Tattermuschddb36ef2015-05-18 17:34:02 -070050build_csharp() {
Jon Skeetb6defa72015-08-04 10:01:40 +010051 # Just for the conformance tests. We don't currently
52 # need to really build protoc, but it's simplest to keep with the
53 # conventions of the other builds.
54 internal_build_cpp
Josh Habermanffc81182016-02-22 15:39:29 -080055 NUGET=/usr/local/bin/nuget.exe
Jon Skeetb6defa72015-08-04 10:01:40 +010056
Josh Habermanffc81182016-02-22 15:39:29 -080057 if [ "$TRAVIS" == "true" ]; then
58 # Install latest version of Mono
59 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
60 echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list
61 echo "deb http://download.mono-project.com/repo/debian wheezy-libtiff-compat main" | sudo tee -a /etc/apt/sources.list.d/mono-xamarin.list
62 sudo apt-get update -qq
63 sudo apt-get install -qq mono-devel referenceassemblies-pcl nunit
64 wget www.nuget.org/NuGet.exe -O nuget.exe
65 NUGET=../../nuget.exe
66 fi
Jan Tattermuschddb36ef2015-05-18 17:34:02 -070067
Josh Habermanffc81182016-02-22 15:39:29 -080068 (cd csharp/src; mono $NUGET restore)
Jan Tattermuschddb36ef2015-05-18 17:34:02 -070069 csharp/buildall.sh
Josh Habermane891c292015-12-30 16:03:49 -080070 cd conformance && make test_csharp && cd ..
Jan Tattermuschddb36ef2015-05-18 17:34:02 -070071}
72
Tim Swast7e31c4d2015-11-20 15:32:53 -080073build_golang() {
74 # Go build needs `protoc`.
75 internal_build_cpp
76 # Add protoc to the path so that the examples build finds it.
77 export PATH="`pwd`/src:$PATH"
78
79 # Install Go and the Go protobuf compiler plugin.
80 sudo apt-get update -qq
81 sudo apt-get install -qq golang
82 export GOPATH="$HOME/gocode"
83 mkdir -p "$GOPATH/src/github.com/google"
84 ln -s "`pwd`" "$GOPATH/src/github.com/google/protobuf"
85 export PATH="$GOPATH/bin:$PATH"
86 go get github.com/golang/protobuf/protoc-gen-go
87
88 cd examples && make gotest && cd ..
89}
90
Chris Fallin20e94b22015-05-13 16:43:48 -070091use_java() {
Chris Fallin20e94b22015-05-13 16:43:48 -070092 version=$1
93 case "$version" in
94 jdk6)
Josh Haberman0f8c25d2016-02-19 09:11:38 -080095 on_travis sudo apt-get install openjdk-6-jdk
Chris Fallin20e94b22015-05-13 16:43:48 -070096 export PATH=/usr/lib/jvm/java-6-openjdk-amd64/bin:$PATH
97 ;;
98 jdk7)
Josh Haberman0f8c25d2016-02-19 09:11:38 -080099 on_travis sudo apt-get install openjdk-7-jdk
Chris Fallin20e94b22015-05-13 16:43:48 -0700100 export PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
101 ;;
102 oracle7)
Josh Habermanffc81182016-02-22 15:39:29 -0800103 if [ "$TRAVIS" == "true" ]; then
104 sudo apt-get install python-software-properties # for apt-add-repository
105 echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 select true" | \
106 sudo debconf-set-selections
107 yes | sudo apt-add-repository ppa:webupd8team/java
108 yes | sudo apt-get install oracle-java7-installer
109 fi;
Chris Fallin20e94b22015-05-13 16:43:48 -0700110 export PATH=/usr/lib/jvm/java-7-oracle/bin:$PATH
111 ;;
112 esac
113
Josh Haberman1ee0fda2016-03-03 16:02:55 -0800114 if [ "$TRAVIS" != "true" ]; then
115 MAVEN_LOCAL_REPOSITORY=/var/maven_local_repository
116 MVN="$MVN -e -X --offline -Dmaven.repo.local=$MAVEN_LOCAL_REPOSITORY"
117 fi;
118
Chris Fallin20e94b22015-05-13 16:43:48 -0700119 which java
120 java -version
121}
122
Josh Habermand08c39c2016-02-20 12:03:39 -0800123# --batch-mode supresses download progress output that spams the logs.
Josh Habermanb28b3f62016-02-20 12:17:10 -0800124MVN="mvn --batch-mode"
Josh Habermand08c39c2016-02-20 12:03:39 -0800125
Chris Fallin20e94b22015-05-13 16:43:48 -0700126build_java() {
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800127 version=$1
128 dir=java_$version
Chris Fallin20e94b22015-05-13 16:43:48 -0700129 # Java build needs `protoc`.
Josh Haberman181c7f22015-07-15 11:05:10 -0700130 internal_build_cpp
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800131 cp -r java $dir
132 cd $dir && $MVN clean && $MVN test
Feng Xiao9e5fb552015-12-21 11:08:18 -0800133 cd ../..
134}
135
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800136# The conformance tests are hard-coded to work with the $ROOT/java directory.
137# So this can't run in parallel with two different sets of tests.
Feng Xiao9e5fb552015-12-21 11:08:18 -0800138build_java_with_conformance_tests() {
139 # Java build needs `protoc`.
140 internal_build_cpp
Josh Habermand08c39c2016-02-20 12:03:39 -0800141 cd java && $MVN test && $MVN install
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800142 cd util && $MVN package assembly:single
Feng Xiaoaf81dcf2015-12-21 03:25:59 -0800143 cd ../..
Chris Fallin20e94b22015-05-13 16:43:48 -0700144 cd conformance && make test_java && cd ..
145}
146
147build_javanano() {
148 # Java build needs `protoc`.
Josh Haberman181c7f22015-07-15 11:05:10 -0700149 internal_build_cpp
Josh Habermanb28b3f62016-02-20 12:17:10 -0800150 cd javanano && $MVN test && cd ..
Chris Fallin20e94b22015-05-13 16:43:48 -0700151}
152
153build_java_jdk6() {
154 use_java jdk6
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800155 build_java jdk6
Chris Fallin20e94b22015-05-13 16:43:48 -0700156}
157build_java_jdk7() {
158 use_java jdk7
Feng Xiao9e5fb552015-12-21 11:08:18 -0800159 build_java_with_conformance_tests
Chris Fallin20e94b22015-05-13 16:43:48 -0700160}
161build_java_oracle7() {
162 use_java oracle7
Josh Haberman2f3f1de2016-03-01 15:37:17 -0800163 build_java oracle7
Chris Fallin20e94b22015-05-13 16:43:48 -0700164}
165
166build_javanano_jdk6() {
167 use_java jdk6
168 build_javanano
169}
170build_javanano_jdk7() {
171 use_java jdk7
172 build_javanano
173}
174build_javanano_oracle7() {
175 use_java oracle7
176 build_javanano
177}
178
Dan O'Reilly5de2a812015-08-20 18:19:56 -0400179internal_install_python_deps() {
Josh Haberman483533d2016-02-19 12:48:33 -0800180 if [ "$TRAVIS" != "true" ]; then
181 return;
182 fi
Thomas Van Lenten9642b822015-06-10 17:21:23 -0400183 # Install tox (OS X doesn't have pip).
184 if [ $(uname -s) == "Darwin" ]; then
185 sudo easy_install tox
186 else
187 sudo pip install tox
188 fi
Dan O'Reillyd9598ca2015-08-26 20:30:41 -0400189 # Only install Python2.6/3.x on Linux.
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400190 if [ $(uname -s) == "Linux" ]; then
191 sudo apt-get install -y python-software-properties # for apt-add-repository
192 sudo apt-add-repository -y ppa:fkrull/deadsnakes
193 sudo apt-get update -qq
194 sudo apt-get install -y python2.6 python2.6-dev
Dan O'Reillyd9598ca2015-08-26 20:30:41 -0400195 sudo apt-get install -y python3.3 python3.3-dev
196 sudo apt-get install -y python3.4 python3.4-dev
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400197 fi
Dan O'Reilly5de2a812015-08-20 18:19:56 -0400198}
199
Thomas Van Lenten9642b822015-06-10 17:21:23 -0400200build_objectivec_ios() {
Thomas Van Lenten368a2f42016-05-24 11:27:33 -0400201 # Reused the build script that takes care of configuring and ensuring things
202 # are up to date. The OS X test runs the objc conformance test, so skip it
203 # here.
204 # Note: travis has xctool installed, and we've looked at using it in the past
205 # but it has ended up proving unreliable (bugs), an they are removing build
206 # support in favor of xcbuild (or just xcodebuild).
207 objectivec/DevTools/full_mac_build.sh \
208 --core-only --skip-xcode-osx --skip-objc-conformance "$@"
209}
210
211build_objectivec_ios_debug() {
212 build_objectivec_ios --skip-xcode-release
213}
214
215build_objectivec_ios_release() {
216 build_objectivec_ios --skip-xcode-debug
Thomas Van Lenten9642b822015-06-10 17:21:23 -0400217}
218
219build_objectivec_osx() {
Thomas Van Lenten368a2f42016-05-24 11:27:33 -0400220 # Reused the build script that takes care of configuring and ensuring things
221 # are up to date.
222 objectivec/DevTools/full_mac_build.sh \
223 --core-only --skip-xcode-ios
Thomas Van Lenten9642b822015-06-10 17:21:23 -0400224}
Dan O'Reilly5de2a812015-08-20 18:19:56 -0400225
Sergio Campamáf0c14922016-06-14 11:26:01 -0700226build_objectivec_cocoapods_integration() {
227 # First, load the RVM environment in bash, needed to update ruby.
228 source ~/.rvm/scripts/rvm
229 # Update ruby to 2.2.3 as the default one crashes with segmentation faults
230 # when using pod.
231 rvm use 2.2.3 --install --binary --fuzzy
232 # Update pod to the latest version.
233 gem install cocoapods --no-ri --no-rdoc
234 objectivec/Tests/CocoaPods/run_tests.sh
235}
236
Chris Fallin20e94b22015-05-13 16:43:48 -0700237build_python() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700238 internal_build_cpp
Dan O'Reilly5de2a812015-08-20 18:19:56 -0400239 internal_install_python_deps
Chris Fallin20e94b22015-05-13 16:43:48 -0700240 cd python
Dan O'Reillyd9598ca2015-08-26 20:30:41 -0400241 # Only test Python 2.6/3.x on Linux
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400242 if [ $(uname -s) == "Linux" ]; then
Jie Luo2850a982015-10-09 17:07:03 -0700243 envlist=py\{26,27,33,34\}-python
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400244 else
245 envlist=py27-python
246 fi
247 tox -e $envlist
Chris Fallin20e94b22015-05-13 16:43:48 -0700248 cd ..
249}
250
251build_python_cpp() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700252 internal_build_cpp
Dan O'Reilly5de2a812015-08-20 18:19:56 -0400253 internal_install_python_deps
254 export LD_LIBRARY_PATH=../src/.libs # for Linux
Tamir Dubersteinc91d9ab2015-05-14 21:32:39 -0400255 export DYLD_LIBRARY_PATH=../src/.libs # for OS X
Chris Fallin20e94b22015-05-13 16:43:48 -0700256 cd python
Dan O'Reillyd9598ca2015-08-26 20:30:41 -0400257 # Only test Python 2.6/3.x on Linux
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400258 if [ $(uname -s) == "Linux" ]; then
Jisi Liu72bd9c92015-10-06 10:48:57 -0700259 # py26 is currently disabled due to json_format
260 envlist=py\{27,33,34\}-cpp
Dan O'Reilly76f8a3f2015-08-21 18:51:47 -0400261 else
262 envlist=py27-cpp
263 fi
264 tox -e $envlist
Chris Fallin20e94b22015-05-13 16:43:48 -0700265 cd ..
266}
267
268build_ruby19() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700269 internal_build_cpp # For conformance tests.
Chris Fallin20e94b22015-05-13 16:43:48 -0700270 cd ruby && bash travis-test.sh ruby-1.9 && cd ..
271}
272build_ruby20() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700273 internal_build_cpp # For conformance tests.
Chris Fallin20e94b22015-05-13 16:43:48 -0700274 cd ruby && bash travis-test.sh ruby-2.0 && cd ..
275}
276build_ruby21() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700277 internal_build_cpp # For conformance tests.
Chris Fallin20e94b22015-05-13 16:43:48 -0700278 cd ruby && bash travis-test.sh ruby-2.1 && cd ..
279}
280build_ruby22() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700281 internal_build_cpp # For conformance tests.
Chris Fallin20e94b22015-05-13 16:43:48 -0700282 cd ruby && bash travis-test.sh ruby-2.2 && cd ..
283}
284build_jruby() {
Josh Haberman181c7f22015-07-15 11:05:10 -0700285 internal_build_cpp # For conformance tests.
Chris Fallin20e94b22015-05-13 16:43:48 -0700286 cd ruby && bash travis-test.sh jruby && cd ..
287}
288
Josh Habermane9cf31e2015-12-21 15:18:17 -0800289build_javascript() {
290 internal_build_cpp
Josh Haberman0d2d8bc2015-12-28 06:43:42 -0800291 cd js && npm install && npm test && cd ..
Josh Habermane9cf31e2015-12-21 15:18:17 -0800292}
293
Josh Haberman738393b2016-02-18 20:10:23 -0800294# Note: travis currently does not support testing more than one language so the
295# .travis.yml cheats and claims to only be cpp. If they add multiple language
296# support, this should probably get updated to install steps and/or
297# rvm/gemfile/jdk/etc. entries rather than manually doing the work.
298
299# .travis.yml uses matrix.exclude to block the cases where app-get can't be
300# use to install things.
301
302# -------- main --------
303
Josh Haberman738393b2016-02-18 20:10:23 -0800304if [ "$#" -ne 1 ]; then
305 echo "
306Usage: $0 { cpp |
307 csharp |
308 java_jdk6 |
309 java_jdk7 |
310 java_oracle7 |
311 javanano_jdk6 |
312 javanano_jdk7 |
313 javanano_oracle7 |
314 objectivec_ios |
Thomas Van Lenten368a2f42016-05-24 11:27:33 -0400315 objectivec_ios_debug |
316 objectivec_ios_release |
Josh Haberman738393b2016-02-18 20:10:23 -0800317 objectivec_osx |
Sergio Campamáf0c14922016-06-14 11:26:01 -0700318 objectivec_cocoapods_integration |
Josh Haberman738393b2016-02-18 20:10:23 -0800319 python |
320 python_cpp |
Josh Habermanffc81182016-02-22 15:39:29 -0800321 ruby19 |
322 ruby20 |
323 ruby21 |
324 ruby22 |
Josh Haberman738393b2016-02-18 20:10:23 -0800325 jruby }
326"
327 exit 1
328fi
329
330set -e # exit immediately on error
331set -x # display all commands
332eval "build_$1"