7

Używam SFHFKeychainUtils do używania usług Keychain w mojej aplikacji. Napisałem kilka testów OCUnit, które sprawdzają funkcjonalność tego kodu. Wszystko działa poprawnie, gdy uruchamiam testy jednostkowe z Xcode na symulatorze iOS lub moim urządzeniu. Jednak teraz próbuję skonfigurować serwer CI i test kończy się niepowodzeniem, gdy jest uruchamiany za pomocą wiersza polecenia z kodem błędu -25291. Przejrzenie tego w dokumentacji Apple mówi mi: Brak dostępnych wyników zaufania (errSecNotAvailable). Połączyłem Security.framework z moim projektem testów jednostkowych, wydaje mi się, że z tego, co przeczytałem w Internecie, to wszystko, co powinienem zrobić, żeby to działało. Oto komenda jestem powołując się w konsoli:Testy OCUnit kończą się niepowodzeniem z wiersza poleceń, ale działają w Xcode podczas korzystania z usług pęku kluczy

/usr/bin/xcodebuild -target [Test_Target] -sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/ -configuration Debug

Czy ktoś ma jakieś doświadczenia lub sugestie dotyczące uzyskiwania testów jednostkowych i breloki Usługi grać ładnie razem z wiersza poleceń?

+0

Czy działa serwer CI w trybie bez głowy, czy masz aktywną sesję użytkownika? –

+0

Mam aktywną sesję użytkownika. –

+0

Bardzo dziwne, czy możesz potwierdzić, że masz dostęp do pęku kluczy, tzn. Czy nie jest on chroniony hasłem? –

Odpowiedz

8

Wpadłem na ten sam problem, a rozwiązaniem dla mnie było upewnienie się, że symulator był uruchomiony przed rozpoczęciem jakiegokolwiek testu. Zrobiłem to za pomocą AppleScript w fazie budowania Run Script w Xcode i zasadniczo to samo na serwerze CI. Oto skrypt, który otworzy symulatora:

exec osascript <<EOF

tell application "iOS Simulator"

activate

end tell

Kwestia bezpieczeństwa/usługi Breloki że powoduje to widocznie to znany problem, chociaż nie mam jeszcze radaru, który go śledził. Jeśli używasz Jenkins, umieść powyższy skrypt w fazie Execute Shell przed fazą kompilacji Xcode. Jeśli kontrolujesz to przez sam Xcode, umieść go w fazie kompilacji Run Script przed fazą budowania RunUnitTests Run Script. Mam nadzieję, że rozwiążesz problem!

+0

dziękuję. Minęła godzina mojego czasu przed zagospodarowaniem tego problemu. Skrypt działał dokładnie tak, jak sugerowałeś. – makdad

+0

Quellish - może chcesz zrealizować projekt WaxSim. To pozwala uruchomić symulator z linii poleceń. https://github.com/square/WaxSim/ - Możesz także użyć poniższych komend, aby zabić aktywne PS/Aux | grep -e 'iPhone Simulator.app' | grep -v grep | awk "{print 2 $}" xargs kill -9' –

+1

@stuart ... zamiast skomplikowanej grep i roztworem aux ... powinien mieć możliwość korzystania z «killall -9«iPhone Simulator»» –

1

Nie mogłem ustalić, dlaczego dostęp do pęku kluczy kończy się niepowodzeniem, gdy testy OCUnit uruchamiane są z wiersza poleceń.

W celu kontynuowania moich testów dodałem hacktastic kategorię do mojej jednostce cel testu:

// 
// SFHFKeychainUtils+UnitTestHacks.m 
// CB30 
// 
// GRRR!!! http://stackoverflow.com/questions/9996578/ocunit-tests-fail-from-the-command-line-but-work-in-xcode-when-using-keychain-se 
// 
// Created by Joshua Vickery on 5/14/12. 
// 

#import "SFHFKeychainUtils+UnitTestHacks.h" 

static NSMutableDictionary *fakeKeyChainHolder; 

@implementation SFHFKeychainUtils (UnitTestHacks) 

+ (NSMutableDictionary *)fakeKeyChainForServiceName:(NSString *)serviceName { 
    if (nil == fakeKeyChainHolder) { 
     fakeKeyChainHolder = [NSMutableDictionary dictionary]; 
    } 

    NSMutableDictionary *fakeKeyChain = [fakeKeyChainHolder objectForKey:serviceName]; 
    if (nil == fakeKeyChain) { 
     fakeKeyChain = [NSMutableDictionary dictionary]; 
     [fakeKeyChainHolder setObject:fakeKeyChain forKey:serviceName]; 
    } 
    return fakeKeyChain; 
} 

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation" 

+ (BOOL) deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{ 
    [[self fakeKeyChainForServiceName:serviceName] removeObjectForKey:username]; 
    return YES; 
} 


+ (BOOL) storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting: (BOOL) updateExisting error: (NSError **) error 
{ 
    [[self fakeKeyChainForServiceName:serviceName] setObject:password forKey:username]; 
    return YES; 
} 

+ (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error 
{ 
    return [[self fakeKeyChainForServiceName:serviceName] objectForKey:username]; 
} 

#pragma clang diagnostic pop 

@end 

Należy pamiętać, że nie jest to dobre rozwiązanie, ale obejście dostać testy jednostkowe pracy aż do znaleziono lepsze rozwiązanie.

+1

Nadal uważam, że w ten sposób * to * dobre rozwiązanie, ponieważ jesteś skutecznie szyderczy ramy, nigdy nic złego w badanej jednostki .. – makdad

0

Mam podobny problem. Z moich badań wynika to z wersji symulatora, która działa podczas testów. Testowanie łańcucha kluczy z symulatorem iPhone'a 6.0 w górę zawsze sprawi, że moje testy się nie powiedzie, jeśli uruchomię je z wiersza poleceń. Zmień go na dowolną inną wersję (4.3, 5.0, 5.1) i przechodzą. Zawsze dobrze z XCode z dowolną wersją.

Może to problem narzędzi wiersza poleceń, który nie konfiguruje niektórych niezbędnych flag przed uruchomieniem testów.

I otworzyły się nowe pytanie tutaj z małą przypadku testowego: Keychain Services API fails with errSecNotAvailable in iphonesimulator 6.0

Powiązane problemy