2424import com .google .api .client .json .jackson2 .JacksonFactory ;
2525import com .google .api .client .testing .http .MockHttpTransport ;
2626import com .google .api .client .testing .http .MockLowLevelHttpRequest ;
27- import com .google .api .client .util .Joiner ;
2827
2928import junit .framework .TestCase ;
3029
3433import java .util .Arrays ;
3534import java .util .Collection ;
3635import java .util .HashMap ;
36+ import java .util .HashSet ;
3737import java .util .Map ;
38+ import java .util .Set ;
3839import java .util .concurrent .locks .Lock ;
3940import java .util .concurrent .locks .ReentrantLock ;
4041
@@ -225,6 +226,61 @@ public void testDefaultCredentialUser() throws IOException {
225226 if (userCredentialFile .exists ()) {
226227 userCredentialFile .delete ();
227228 }
229+
230+ TestDefaultCredentialProvider testProvider = new TestDefaultCredentialProvider ();
231+ // Point the default credential to the file
232+ testProvider .setEnv (DefaultCredentialProvider .CREDENTIAL_ENV_VAR ,
233+ userCredentialFile .getAbsolutePath ());
234+
235+ testDefaultCredentialUser (userCredentialFile , testProvider );
236+ }
237+
238+ public void testDefaultCredentialWellKnownFileNonWindows () throws IOException {
239+ // Simulate where the SDK puts the well-known file on non-Windows platforms
240+ File homeDir = getTempDirectory ();
241+ File configDir = new File (homeDir , ".config" );
242+ if (!configDir .exists ()) {
243+ configDir .mkdir ();
244+ }
245+ File cloudConfigDir = new File (configDir , DefaultCredentialProvider .CLOUDSDK_CONFIG_DIRECTORY );
246+ if (!cloudConfigDir .exists ()) {
247+ cloudConfigDir .mkdir ();
248+ }
249+ File wellKnownFile = new File (
250+ cloudConfigDir , DefaultCredentialProvider .WELL_KNOWN_CREDENTIALS_FILE );
251+ if (wellKnownFile .exists ()) {
252+ wellKnownFile .delete ();
253+ }
254+ TestDefaultCredentialProvider testProvider = new TestDefaultCredentialProvider ();
255+ testProvider .addFile (wellKnownFile .getAbsolutePath ());
256+ testProvider .setProperty ("os.name" , "linux" );
257+ testProvider .setProperty ("user.home" , homeDir .getAbsolutePath ());
258+
259+ testDefaultCredentialUser (wellKnownFile , testProvider );
260+ }
261+
262+ public void testDefaultCredentialWellKnownFileWindows () throws IOException {
263+ // Simulate where the SDK puts the well-known file on Windows
264+ File appDataDir = getTempDirectory ();
265+ File cloudConfigDir = new File (appDataDir , DefaultCredentialProvider .CLOUDSDK_CONFIG_DIRECTORY );
266+ if (!cloudConfigDir .exists ()) {
267+ cloudConfigDir .mkdir ();
268+ }
269+ File wellKnownFile = new File (
270+ cloudConfigDir , DefaultCredentialProvider .WELL_KNOWN_CREDENTIALS_FILE );
271+ if (wellKnownFile .exists ()) {
272+ wellKnownFile .delete ();
273+ }
274+ TestDefaultCredentialProvider testProvider = new TestDefaultCredentialProvider ();
275+ testProvider .addFile (wellKnownFile .getAbsolutePath ());
276+ testProvider .setProperty ("os.name" , "windows" );
277+ testProvider .setEnv ("APPDATA" , appDataDir .getAbsolutePath ());
278+
279+ testDefaultCredentialUser (wellKnownFile , testProvider );
280+ }
281+
282+ private void testDefaultCredentialUser (File userFile , TestDefaultCredentialProvider testProvider )
283+ throws IOException {
228284 final String ACCESS_TOKEN = "1/MkSJoj1xsli0AccessToken_NKPY2" ;
229285 final String CLIENT_SECRET = "jakuaL9YyieakhECKL2SwZcu" ;
230286 final String CLIENT_ID = "ya29.1.AADtN_UtlxH8cruGAxrN2XQnZTVRvDyVWnYq4I6dws" ;
@@ -235,26 +291,14 @@ public void testDefaultCredentialUser() throws IOException {
235291 transport .addClient (CLIENT_ID , CLIENT_SECRET );
236292 transport .addRefreshToken (REFRESH_TOKEN , ACCESS_TOKEN );
237293
238- TestDefaultCredentialProvider testProvider = new TestDefaultCredentialProvider ();
294+ String json = GoogleCredentialTest .createUserJson (CLIENT_ID , CLIENT_SECRET , REFRESH_TOKEN );
295+
239296 try {
240297 // Write out user file
241- GenericJson userCredentialContents = new GenericJson ();
242- userCredentialContents .setFactory (JSON_FACTORY );
243- userCredentialContents .put ("client_id" , CLIENT_ID );
244- userCredentialContents .put ("client_secret" , CLIENT_SECRET );
245- userCredentialContents .put ("refresh_token" , REFRESH_TOKEN );
246- String scopesAsString = Joiner .on (' ' ).join (SCOPES );
247- userCredentialContents .put ("scopes" , scopesAsString );
248- userCredentialContents .put ("type" , GoogleCredential .USER_FILE_TYPE );
249- PrintWriter writer = new PrintWriter (userCredentialFile );
250- String json = userCredentialContents .toPrettyString ();
298+ PrintWriter writer = new PrintWriter (userFile );
251299 writer .println (json );
252300 writer .close ();
253301
254- // Point the default credential to the file
255- testProvider .setEnv (DefaultCredentialProvider .CREDENTIAL_ENV_VAR ,
256- userCredentialFile .getAbsolutePath ());
257-
258302 Credential credential = testProvider .getDefaultCredential (transport , JSON_FACTORY );
259303
260304 assertNotNull (credential );
@@ -263,8 +307,8 @@ public void testDefaultCredentialUser() throws IOException {
263307 assertTrue (credential .refreshToken ());
264308 assertEquals (ACCESS_TOKEN , credential .getAccessToken ());
265309 } finally {
266- if (userCredentialFile .exists ()) {
267- userCredentialFile .delete ();
310+ if (userFile .exists ()) {
311+ userFile .delete ();
268312 }
269313 }
270314 }
@@ -321,11 +365,17 @@ private static class TestDefaultCredentialProvider extends DefaultCredentialProv
321365
322366 private Map <String , Class <?>> types = new HashMap <String , Class <?>>();
323367 private Map <String , String > variables = new HashMap <String , String >();
368+ private Map <String , String > properties = new HashMap <String , String >();
369+ private Set <String > files = new HashSet <String >();
324370 private int forNameCallCount = 0 ;
325371
326372 TestDefaultCredentialProvider () {
327373 }
328374
375+ void addFile (String file ) {
376+ files .add (file );
377+ }
378+
329379 void addType (String className , Class <?> type ) {
330380 types .put (className , type );
331381 }
@@ -339,6 +389,21 @@ void setEnv(String name, String value) {
339389 variables .put (name , value );
340390 }
341391
392+ @ Override
393+ String getProperty (String property , String def ) {
394+ String value = properties .get (property );
395+ return value == null ? def : value ;
396+ }
397+
398+ void setProperty (String property , String value ) {
399+ properties .put (property , value );
400+ }
401+
402+ @ Override
403+ boolean fileExists (File file ) {
404+ return files .contains (file .getAbsolutePath ());
405+ }
406+
342407 @ Override
343408 Class <?> forName (String className ) throws ClassNotFoundException {
344409 forNameCallCount ++;
0 commit comments