2015-04-29 07:56:45 -04:00
package main
import (
2016-02-04 07:47:15 -05:00
"fmt"
2015-04-29 07:56:45 -04:00
"net/http"
2015-08-31 17:45:27 -04:00
"net/http/httptest"
2015-05-19 12:28:50 -04:00
"net/http/httputil"
2015-08-31 17:45:27 -04:00
"os/exec"
2015-06-17 17:57:32 -04:00
"strconv"
"strings"
2015-05-19 12:28:50 -04:00
"time"
2015-04-29 07:56:45 -04:00
2015-06-17 17:57:32 -04:00
"github.com/docker/docker/api"
2015-10-13 08:01:58 -04:00
"github.com/docker/docker/pkg/integration/checker"
2015-04-29 07:56:45 -04:00
"github.com/go-check/check"
)
func ( s * DockerSuite ) TestApiOptionsRoute ( c * check . C ) {
status , _ , err := sockRequest ( "OPTIONS" , "/" , nil )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( status , checker . Equals , http . StatusOK )
2015-04-29 07:56:45 -04:00
}
func ( s * DockerSuite ) TestApiGetEnabledCors ( c * check . C ) {
res , body , err := sockRequestRaw ( "GET" , "/version" , nil , "" )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( res . StatusCode , checker . Equals , http . StatusOK )
2015-07-23 07:24:14 -04:00
body . Close ( )
2015-04-29 07:56:45 -04:00
// TODO: @runcom incomplete tests, why old integration tests had this headers
// and here none of the headers below are in the response?
//c.Log(res.Header)
//c.Assert(res.Header.Get("Access-Control-Allow-Origin"), check.Equals, "*")
//c.Assert(res.Header.Get("Access-Control-Allow-Headers"), check.Equals, "Origin, X-Requested-With, Content-Type, Accept, X-Registry-Auth")
}
2015-05-19 12:28:50 -04:00
2015-06-17 17:57:32 -04:00
func ( s * DockerSuite ) TestApiVersionStatusCode ( c * check . C ) {
2016-06-13 22:54:20 -04:00
conn , err := sockConn ( time . Duration ( 10 * time . Second ) , "" )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
2015-05-19 12:28:50 -04:00
client := httputil . NewClientConn ( conn , nil )
defer client . Close ( )
req , err := http . NewRequest ( "GET" , "/v999.0/version" , nil )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
2015-06-04 13:29:57 -04:00
req . Header . Set ( "User-Agent" , "Docker-Client/999.0 (os)" )
2015-05-19 12:28:50 -04:00
res , err := client . Do ( req )
2015-10-13 08:01:58 -04:00
c . Assert ( res . StatusCode , checker . Equals , http . StatusBadRequest )
2015-05-19 12:28:50 -04:00
}
2015-06-17 17:57:32 -04:00
func ( s * DockerSuite ) TestApiClientVersionNewerThanServer ( c * check . C ) {
2016-04-19 10:56:54 -04:00
v := strings . Split ( api . DefaultVersion , "." )
2015-06-17 17:57:32 -04:00
vMinInt , err := strconv . Atoi ( v [ 1 ] )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
2015-06-17 17:57:32 -04:00
vMinInt ++
v [ 1 ] = strconv . Itoa ( vMinInt )
version := strings . Join ( v , "." )
status , body , err := sockRequest ( "GET" , "/v" + version + "/version" , nil )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( status , checker . Equals , http . StatusBadRequest )
2016-02-04 07:47:15 -05:00
expected := fmt . Sprintf ( "client is newer than server (client API version: %s, server API version: %s)" , version , api . DefaultVersion )
2016-05-21 07:56:04 -04:00
c . Assert ( getErrorMessage ( c , body ) , checker . Equals , expected )
2015-06-17 17:57:32 -04:00
}
func ( s * DockerSuite ) TestApiClientVersionOldNotSupported ( c * check . C ) {
2016-04-19 10:56:54 -04:00
v := strings . Split ( api . MinVersion , "." )
2015-06-17 17:57:32 -04:00
vMinInt , err := strconv . Atoi ( v [ 1 ] )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
2015-06-17 17:57:32 -04:00
vMinInt --
v [ 1 ] = strconv . Itoa ( vMinInt )
version := strings . Join ( v , "." )
status , body , err := sockRequest ( "GET" , "/v" + version + "/version" , nil )
2015-10-13 08:01:58 -04:00
c . Assert ( err , checker . IsNil )
c . Assert ( status , checker . Equals , http . StatusBadRequest )
2016-02-04 07:47:15 -05:00
expected := fmt . Sprintf ( "client version %s is too old. Minimum supported API version is %s, please upgrade your client to a newer version" , version , api . MinVersion )
c . Assert ( strings . TrimSpace ( string ( body ) ) , checker . Equals , expected )
2015-06-17 17:57:32 -04:00
}
2015-08-31 17:45:27 -04:00
func ( s * DockerSuite ) TestApiDockerApiVersion ( c * check . C ) {
var svrVersion string
server := httptest . NewServer ( http . HandlerFunc (
func ( w http . ResponseWriter , r * http . Request ) {
url := r . URL . Path
svrVersion = url
} ) )
defer server . Close ( )
// Test using the env var first
cmd := exec . Command ( dockerBinary , "-H=" + server . URL [ 7 : ] , "version" )
2016-02-24 17:59:11 -05:00
cmd . Env = appendBaseEnv ( false , "DOCKER_API_VERSION=xxx" )
2015-08-31 17:45:27 -04:00
out , _ , _ := runCommandWithOutput ( cmd )
c . Assert ( svrVersion , check . Equals , "/vxxx/version" )
if ! strings . Contains ( out , "API version: xxx" ) {
c . Fatalf ( "Out didn't have 'xxx' for the API version, had:\n%s" , out )
}
}
2016-05-21 07:56:04 -04:00
func ( s * DockerSuite ) TestApiErrorJSON ( c * check . C ) {
httpResp , body , err := sockRequestRaw ( "POST" , "/containers/create" , strings . NewReader ( ` { } ` ) , "application/json" )
c . Assert ( err , checker . IsNil )
c . Assert ( httpResp . StatusCode , checker . Equals , http . StatusInternalServerError )
c . Assert ( httpResp . Header . Get ( "Content-Type" ) , checker . Equals , "application/json" )
b , err := readBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( getErrorMessage ( c , b ) , checker . Equals , "Config cannot be empty in order to create a container" )
}
func ( s * DockerSuite ) TestApiErrorPlainText ( c * check . C ) {
httpResp , body , err := sockRequestRaw ( "POST" , "/v1.23/containers/create" , strings . NewReader ( ` { } ` ) , "application/json" )
c . Assert ( err , checker . IsNil )
c . Assert ( httpResp . StatusCode , checker . Equals , http . StatusInternalServerError )
c . Assert ( httpResp . Header . Get ( "Content-Type" ) , checker . Contains , "text/plain" )
b , err := readBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( strings . TrimSpace ( string ( b ) ) , checker . Equals , "Config cannot be empty in order to create a container" )
}
func ( s * DockerSuite ) TestApiErrorNotFoundJSON ( c * check . C ) {
// 404 is a different code path to normal errors, so test separately
httpResp , body , err := sockRequestRaw ( "GET" , "/notfound" , nil , "application/json" )
c . Assert ( err , checker . IsNil )
c . Assert ( httpResp . StatusCode , checker . Equals , http . StatusNotFound )
c . Assert ( httpResp . Header . Get ( "Content-Type" ) , checker . Equals , "application/json" )
b , err := readBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( getErrorMessage ( c , b ) , checker . Equals , "page not found" )
}
func ( s * DockerSuite ) TestApiErrorNotFoundPlainText ( c * check . C ) {
httpResp , body , err := sockRequestRaw ( "GET" , "/v1.23/notfound" , nil , "application/json" )
c . Assert ( err , checker . IsNil )
c . Assert ( httpResp . StatusCode , checker . Equals , http . StatusNotFound )
c . Assert ( httpResp . Header . Get ( "Content-Type" ) , checker . Contains , "text/plain" )
b , err := readBody ( body )
c . Assert ( err , checker . IsNil )
c . Assert ( strings . TrimSpace ( string ( b ) ) , checker . Equals , "page not found" )
}