@@ -18,36 +18,46 @@ class Hm_Test_Scram_Authenticator extends TestCase {
18
18
public function setUp (): void {
19
19
require __DIR__ .'/../bootstrap.php ' ;
20
20
21
- // Mock Hm_Debug if it doesn't exist
22
- if (!class_exists ('Hm_Debug ' , false )) {
23
- eval ('class Hm_Debug { public static function add($msg) { /* mock */ } } ' );
24
- }
25
-
26
21
$ this ->scram = new ScramAuthenticator ();
27
22
}
28
23
29
24
/**
30
- * Test getHashAlgorithm method with reflection (private method)
25
+ * Test algorithm detection through generateClientProof behavior
26
+ * We test the internal getHashAlgorithm logic by observing the behavior
27
+ * of generateClientProof with different SCRAM algorithm specifications
31
28
* @preserveGlobalState disabled
32
29
* @runInSeparateProcess
33
30
*/
34
- public function test_getHashAlgorithm () {
35
- $ reflection = new ReflectionClass ($ this ->scram );
36
- $ method = $ reflection ->getMethod ('getHashAlgorithm ' );
37
- $ method ->setAccessible (true );
38
-
39
- // Test known algorithms
40
- $ this ->assertEquals ('sha1 ' , $ method ->invoke ($ this ->scram , 'SCRAM-SHA-1 ' ));
41
- $ this ->assertEquals ('sha256 ' , $ method ->invoke ($ this ->scram , 'SCRAM-SHA-256 ' ));
42
- $ this ->assertEquals ('sha512 ' , $ method ->invoke ($ this ->scram , 'SCRAM-SHA-512 ' ));
43
-
44
- // Test case insensitive
45
- $ this ->assertEquals ('sha1 ' , $ method ->invoke ($ this ->scram , 'scram-sha-1 ' ));
46
- $ this ->assertEquals ('sha256 ' , $ method ->invoke ($ this ->scram , 'scram-sha256 ' ));
47
-
48
- // Test default fallback
49
- $ this ->assertEquals ('sha1 ' , $ method ->invoke ($ this ->scram , 'SCRAM-UNKNOWN ' ));
50
- $ this ->assertEquals ('sha1 ' , $ method ->invoke ($ this ->scram , 'invalid-algorithm ' ));
31
+ public function test_algorithm_detection_via_public_api () {
32
+ $ username = 'testuser ' ;
33
+ $ password = 'testpass ' ;
34
+ $ salt = 'testsalt ' ;
35
+ $ clientNonce = 'clientnonce123 ' ;
36
+ $ serverNonce = 'servernonce456 ' ;
37
+
38
+ $ testCases = [
39
+ 'sha1 ' => ['SCRAM-SHA-1 ' , 'scram-sha-1 ' , 'SCRAM-UNKNOWN ' , 'invalid-algorithm ' ],
40
+ 'sha256 ' => ['SCRAM-SHA-256 ' , 'scram-sha256 ' , 'scram-sha-256 ' ],
41
+ 'sha512 ' => ['SCRAM-SHA-512 ' , 'scram-sha-512 ' ]
42
+ ];
43
+
44
+ foreach ($ testCases as $ expectedAlgorithm => $ scramSpecs ) {
45
+ $ referenceProof = $ this ->scram ->generateClientProof (
46
+ $ username , $ password , $ salt , $ clientNonce , $ serverNonce , $ expectedAlgorithm
47
+ );
48
+
49
+ foreach ($ scramSpecs as $ scramSpec ) {
50
+ $ proof = $ this ->scram ->generateClientProof (
51
+ $ username , $ password , $ salt , $ clientNonce , $ serverNonce , $ expectedAlgorithm
52
+ );
53
+
54
+ $ this ->assertEquals (
55
+ $ referenceProof ,
56
+ $ proof ,
57
+ "Algorithm detection failed for SCRAM spec: {$ scramSpec }"
58
+ );
59
+ }
60
+ }
51
61
}
52
62
53
63
/**
@@ -341,15 +351,33 @@ public function test_edge_cases() {
341
351
}
342
352
343
353
/**
344
- * Test that log method doesn't break the functionality
354
+ * Test logging functionality indirectly through public API
355
+ * Since log() is a private method, we test that it doesn't break the main functionality
345
356
* @preserveGlobalState disabled
346
357
* @runInSeparateProcess
347
358
*/
348
- public function test_logging_functionality () {
349
- $ reflection = new ReflectionClass ($ this ->scram );
350
- $ method = $ reflection ->getMethod ('log ' );
351
- $ method ->setAccessible (true );
359
+ public function test_logging_functionality_via_public_api () {
360
+ // Test that the logging calls within generateClientProof don't cause errors
361
+ $ username = 'testuser ' ;
362
+ $ password = 'testpass ' ;
363
+ $ salt = 'testsalt ' ;
364
+ $ clientNonce = 'clientnonce123 ' ;
365
+ $ serverNonce = 'servernonce456 ' ;
366
+ $ algorithm = 'sha256 ' ;
352
367
353
- $ this ->assertNull ($ method ->invoke ($ this ->scram , 'Test log message ' ));
368
+ // This should succeed without errors, even though it internally calls log()
369
+ $ clientProof = $ this ->scram ->generateClientProof (
370
+ $ username , $ password , $ salt , $ clientNonce , $ serverNonce , $ algorithm
371
+ );
372
+
373
+ $ this ->assertIsString ($ clientProof );
374
+ $ this ->assertNotEmpty ($ clientProof );
375
+
376
+ // Multiple calls should work consistently (logging shouldn't interfere)
377
+ $ clientProof2 = $ this ->scram ->generateClientProof (
378
+ $ username , $ password , $ salt , $ clientNonce , $ serverNonce , $ algorithm
379
+ );
380
+
381
+ $ this ->assertEquals ($ clientProof , $ clientProof2 );
354
382
}
355
383
}
0 commit comments