PY-18473: Find Python using win registry and pep-514

* Using DI to remove WinPythonSdkFlavor dependency on registry tools and make it testable
* Check all registry branches according to pep514
This commit is contained in:
Ilya.Kazakevich
2016-11-14 22:58:36 +03:00
parent 979ac11689
commit fc5589b1f5
5 changed files with 193 additions and 33 deletions
@@ -0,0 +1,90 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jetbrains.python.sdk.flavors;
import com.intellij.openapi.util.io.FileUtil;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.easymock.MockType;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author Ilya.Kazakevich
*/
public final class WinPythonSdkFlavorTest {
private IMocksControl myControl;
private WinRegistryService myMock;
@Before
public void setUp() throws Exception {
myControl = EasyMock.createControl(MockType.NICE);
myMock = myControl.createMock(WinRegistryService.class);
}
/**
* Check PyCharm can find python using registry and pep-514
*/
@Test
public void testFindPythonUsingRegistry() throws Exception {
EasyMock.expect(myMock.listBranches(caseInsensitive("HKEY_CURRENT_USER\\Software\\Python")))
.andReturn(Arrays.asList("PythonCore", "CompanyFoo")).anyTimes();
EasyMock.expect(myMock.listBranches(caseInsensitive("HKEY_CURRENT_USER\\Software\\Python\\PythonCore")))
.andReturn(Collections.singletonList("3.5")).anyTimes();
final String tempDir = File.createTempFile("foo", "bar").getParent();
final File pythonFile = new File(tempDir, "python.exe");
FileUtil.appendToFile(pythonFile, "");
assert pythonFile.exists() : "Failed to create file";
EasyMock.expect(myMock.getDefaultKey(caseInsensitive("HKEY_CURRENT_USER\\Software\\Python\\PythonCore\\3.5\\InstallPath")))
.andReturn(tempDir).anyTimes();
EasyMock.expect(myMock.listBranches(EasyMock.anyString())).andReturn(Collections.emptyList()).anyTimes();
myControl.replay();
final WinPythonSdkFlavor systemUnderTest = new WinPythonSdkFlavor(myMock);
final List<String> result = new ArrayList<>();
systemUnderTest.findInRegistry(result);
Assert.assertThat("Python should be found by registry, but failed to do so", result,
Matchers.containsInAnyOrder(pythonFile.getAbsolutePath()));
}
/**
* @return case insensitive matcher for string
*/
private String caseInsensitive(@NotNull final String source) {
// Never returns null: lame EasyMock api
//noinspection ConstantConditions
return EasyMock.matches(String.format("(?i)%s", source.replace("\\", "\\\\")));
}
}