簡単な修正プログラムで修正されたハードバグ


私のPull requestをSSOサービスのベストプラクティスを追加しました.E 2 Eテストはパイプラインで失敗しました.
ciでは,試験例はcrでは失敗した.
FAIL browser: chromium src/api/sso/test/e2e/auth-flows.test.js (28.142 s)
  Authentication Flows
    ✕ Login flow preserves state param (25222 ms)
最初に、私のレビューの一部はMac M 1(ARMアーキテクチャ)を使用しているので、イメージをビルドするためにいくつかのビルドインパッケージが見つからなかったので、ノードアルパインバージョンから適切にイメージを構築することができませんでした.私はより大きいノードバージョンを使用しなければなりませんでした.
それらの変更を押した後、@humphdはデバッグするのを助けました、この問題は局所的に生産的であることができませんでした.
私は異なる環境で走り始めました.
Windows 11 Pro 21 H 2 -テストケースパス.( @ kevan - y )
WSP 2 Ubuntu - 20.04上のWindows 11 Pro 21 H 2 -テストケースパス
Amazon Linux 2 AMI ( HVM )-カーネル5.10 ( AMI - 0 C 02 FB 55956 C 7 D 316 ( 64ビットx 86 ))- T 2ラージテストケースパス
テストケース・パス
それはよく見えなかった.これは、CIでのみ起こっているのでデバッグを難しくします.
私はテストケースのタイムアウトを
it('Login flow preserves state param', async () => {
    const { state } = await login(page, 'user1', 'user1pass');
    // Expect the state to match what we sent originally (see index.html <a>)
    expect(state).toEqual('abc123');
  }, 30000);
増加タイムアウトにもかかわらず、それは失敗していました.
弾力性検索のような他のコンテナのための可能性は、そのコンテナは、メモリが十分に割り当てられていないいくつかの問題があったのでクラッシュしました.私はDocker構成ファイルのメモリを増やしました.
  elasticsearch:
    environment:
      # Limit the initial heap size. By default it will use 1/4 of available RAM
      - 'ES_JAVA_OPTS=-Xms512m -Xmx512m'
これらの変更を押した後、CIパイプラインはまだ失敗していました.
私はすべてのE 2 Eテストケースをスキップし、デバッグの目的でLogin flow preserves state paramsrc/api/sso/test/e2e/auth-flows.test.jsだけを実行し、LOG_LEVELからdebugにもオンすることにしました.
私はそれらの変更を押したが、それは助けていなかった.彼らは間違ったときにどの場所を識別するのに役立ちました0ログだった.それで、デバッグの基本的な方法に切り替えます.各行にコンソールsrc\api\sso\test\e2e\auth-flows.test.js
 it('Login flow preserves state param', async () => {
    console.log('Start test case by await login');
    const { state } = await login(page, 'user1', 'user1pass');
    console.log('Done await login', state);

    // Expect the state to match what we sent originally (see index.html <a>)
    expect(state).toEqual('abc123');
  }, 30000);
src\api\sso\test\e2e\browser-util.js
const login = async (page, username, password) => {
  console.log('Start login and wait for page');
  // Click login button and then wait for the login page to load
  await Promise.all([
    page.waitForNavigation({
      url: /simplesaml\/module\.php\/core\/loginuserpass\.php/,
      waitUtil: 'networkidle',
    }),
    page.click('#login'),
  ]);
  console.log('after click login');

  console.log('click input[name="username"]');
  // Fill the login form, star with username
  await page.click('input[name="username"]');
  console.log('after click input[name="username"]');

  console.log('fill input[name="username"]');
  await page.fill('input[name="username"]', username);
  console.log('after fill input[name="username"]');

  // Now enter the password
  console.log('click input[name="password"]');
  await page.click('input[name="password"]');
  console.log('after click input[name="password"]');

  console.log('fill input[name="password"]');
  await page.fill('input[name="password"]', password);
  console.log('after fill input[name="password"]');

  console.log('wait for the new page to load');
  // Click login button and then wait for the new page to load
  await Promise.all([
    page.waitForNavigation({
      url: /^http:\/\/localhost:\d+\/auth\.html\?access_token=[^&]+&state=/,
      waitUtil: 'load',
    }),
    page.click('text=/.*Login.*/'),
  ]);

  // The token and state will get returned on the query string
  return getTokenAndState(page);
};
この変更を押した後、やっとデバッグ結果が出ました.テストケースは2003年のタイムアウトだった
await Promise.all([
    page.waitForNavigation({
      url: /simplesaml\/module\.php\/core\/loginuserpass\.php/,
      waitUtil: 'networkidle',
    }),
    page.click('#login'),
  ]);
@Humphdによって言及された1つの可能な問題は、イベントが何らかの理由でそのページに座っていて、決して航行しないことでした.waitUtil: 'networkidle'の代わりに、waitUtil: 'load'に変更されます.see reference
それにもかかわらず、それは働かなかった.しかし、最終的な修正は潜在的にそれを修正するかもしれない1.19.21.20.2にバージョンplaywrightから更新しようとすることでした.
それは適切なソリューションは、依存関係の更新だけであり、すべてがうまく動作します.
これをデバッグしようとする2、3日を費やしてください、そして、修正はちょうど依存関係アップデートでした.それは最後に良い経験でした.時には、上流側が私たちのために修正するのを待つ必要があります.