58 lines
4.3 KiB
TypeScript
58 lines
4.3 KiB
TypeScript
import { describe, expect, test } from 'bun:test';
|
|
import { mkdirSync, mkdtempSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { androidSdkEnv, androidSdkMissing, resolveAndroidSdk, sdkDirOf, toolPath, wellKnownToolDirs } from '../cli/lib/tools';
|
|
|
|
describe('tool folders outside PATH', () => {
|
|
test('finds the Android SDK Android Studio installs, after the own PATH', () => {
|
|
const home = mkdtempSync(join(tmpdir(), 'sb-home-'));
|
|
mkdirSync(join(home, 'Library/Android/sdk/platform-tools'), { recursive: true });
|
|
mkdirSync(join(home, 'Library/Android/sdk/emulator'), { recursive: true });
|
|
const env = { HOME: home, PATH: '/usr/bin:/bin' };
|
|
expect(wellKnownToolDirs(env, 'darwin')).toContain(join(home, 'Library/Android/sdk/platform-tools'));
|
|
const p = toolPath(env, 'darwin').split(':');
|
|
expect(p.slice(0, 2)).toEqual(['/usr/bin', '/bin']);
|
|
expect(p).toContain(join(home, 'Library/Android/sdk/emulator'));
|
|
});
|
|
|
|
test('Android SDK: env, then local.properties, then the Android Studio folder; only real SDK folders count', () => {
|
|
const fs = (dirs: string[], files: Record<string, string> = {}) => ({
|
|
exists: (p: string) => dirs.includes(p) || p in files || dirs.some(d => d.startsWith(p + '/')), readText: (p: string) => files[p] ?? null });
|
|
const home = '/x/home';
|
|
const studio = `${home}/Library/Android/sdk`;
|
|
// non-interactive shell on macOS: no ANDROID_HOME, local.properties gitignored -> Android Studio's folder
|
|
let r = resolveAndroidSdk({ env: {}, platform: 'darwin', home, gradleDirs: ['/p/android'], ...fs([`${studio}/platform-tools`]) });
|
|
expect(r).toMatchObject({ path: studio, source: 'default' });
|
|
expect(r.checked).toEqual(['ANDROID_HOME: not set', 'ANDROID_SDK_ROOT: not set', 'sdk.dir in /p/android/local.properties: not set', `Android Studio default folder: ${studio}`]);
|
|
// ANDROID_HOME pointing at an empty folder is skipped, ANDROID_SDK_ROOT is used
|
|
r = resolveAndroidSdk({ env: { ANDROID_HOME: '/empty', ANDROID_SDK_ROOT: '/sdk' }, platform: 'linux', home, ...fs(['/empty', '/sdk/platforms']) });
|
|
expect(r).toMatchObject({ path: '/sdk', source: 'ANDROID_SDK_ROOT' });
|
|
expect(r.checked[0]).toBe('ANDROID_HOME: /empty (no platforms/ or platform-tools/ in it)');
|
|
// sdk.dir with Java properties escapes
|
|
r = resolveAndroidSdk({ env: {}, platform: 'linux', home, gradleDirs: ['/p/android'], ...fs(['/opt/and:sdk/platforms'], { '/p/android/local.properties': '## comment\nsdk.dir=/opt/and\\:sdk\n' }) });
|
|
expect(r).toMatchObject({ path: '/opt/and:sdk', source: 'local.properties' });
|
|
expect(sdkDirOf('sdk.dir=C\\:\\\\Users\\\\dev\\\\AppData\\\\Local\\\\Android\\\\Sdk')).toBe('C:\\Users\\dev\\AppData\\Local\\Android\\Sdk');
|
|
// Linux and Windows defaults
|
|
expect(resolveAndroidSdk({ env: {}, platform: 'linux', home: '/x/linuxhome', ...fs(['/x/linuxhome/Android/Sdk/platforms']) }).path).toBe('/x/linuxhome/Android/Sdk');
|
|
expect(resolveAndroidSdk({ env: { LOCALAPPDATA: 'C:\\Users\\dev\\AppData\\Local' }, platform: 'win32', home: 'C:\\Users\\dev', exists: p => p === 'C:\\Users\\dev\\AppData\\Local\\Android\\Sdk\\platform-tools', readText: () => null }).path)
|
|
.toBe('C:\\Users\\dev\\AppData\\Local\\Android\\Sdk');
|
|
// nothing anywhere: every place checked is named in the error, and nothing goes to Gradle
|
|
r = resolveAndroidSdk({ env: {}, platform: 'darwin', home, gradleDirs: ['/p/android'], ...fs([]) });
|
|
expect(r.path).toBeNull();
|
|
expect(androidSdkEnv(r)).toEqual({});
|
|
const msg = androidSdkMissing(r);
|
|
for (const where of ['ANDROID_HOME', 'ANDROID_SDK_ROOT', '/p/android/local.properties', studio]) expect(msg).toContain(where);
|
|
expect(androidSdkEnv({ path: '/sdk', source: 'default', checked: [] })).toEqual({ ANDROID_HOME: '/sdk', ANDROID_SDK_ROOT: '/sdk' });
|
|
});
|
|
|
|
test('ANDROID_HOME wins, missing folders are skipped, app folders come first', () => {
|
|
const sdk = mkdtempSync(join(tmpdir(), 'sb-sdk-'));
|
|
mkdirSync(join(sdk, 'platform-tools'));
|
|
const env = { HOME: '/nonexistent', ANDROID_HOME: sdk, PATH: '/usr/bin', STOREBOUND_TOOL_PATH: '/app/tools' };
|
|
const p = toolPath(env, 'linux').split(':');
|
|
expect(p[0]).toBe('/app/tools');
|
|
expect(p).toContain(join(sdk, 'platform-tools'));
|
|
expect(p).not.toContain(join(sdk, 'emulator'));
|
|
});
|
|
});
|