간단한 수정으로 해결된 하드 버그

14646 단어 opensource
SSO 서비스에 대한 모범 사례 추가에 대한 내Pull request를 열었습니다. e2e 테스트는 파이프라인에서 실패했고 로컬 테스트를 경멸했습니다.
CI에서 테스트 사례는 Chromium에서만 실패했습니다.

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 M1(ARM 아키텍처)을 사용하고 있는데, 이미지를 빌드하기 위한 일부 빌드인 패키지가 누락되었기 때문에 node-alpine 버전 이후로 이미지를 제대로 빌드할 수 없었습니다. 더 큰 노드 버전을 사용해야 했습니다.
이러한 변경 사항을 푸시한 후@humphd 디버깅에 도움이 되었지만 이 문제는 로컬에서 생성할 수 없었습니다.

나는 다른 환경에서 실행하기 시작했고 이것은 다음과 같은 결과입니다.
Windows 11 pro 21H2 - 테스트 케이스 통과. (@Kevan-Y 작성)
WSL2 Ubuntu-20.04의 Windows 11 pro 21H2 - 테스트 사례 통과(@Kevan-Y 제공)
Amazon Linux 2 AMI(HVM) - 커널 5.10(ami-0c02fb55956c7d316(64비트 x86)) - t2.large - 테스트 케이스 통과(@Kevan-Y 제공)
MacOS M1 - 테스트 사례 통과(@humphd 제공)

좋지 않았습니다. 이것은 CI에서만 발생하기 때문에 디버깅을 어렵게 만듭니다.

테스트 케이스의 시간 제한을 30000ms로 늘리기 시작했습니다.

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-compose 파일의 메모리를 늘렸습니다.

  elasticsearch:
    environment:
      # Limit the initial heap size. By default it will use 1/4 of available RAM
      - 'ES_JAVA_OPTS=-Xms512m -Xmx512m'


이러한 변경 사항을 추진한 후에도 CI 파이프라인은 여전히 ​​실패했습니다.

나는 모든 e2e 테스트 사례를 건너뛰고 디버깅 목적으로 Login flow preserves state paramsrc/api/sso/test/e2e/auth-flows.test.js 만 실행하고 LOG_LEVEL 에서 debug 까지 켜기로 결정했습니다.
이러한 변경 사항을 추진했지만 도움이 되지 않았습니다. 잘못된 위치를 식별하는 데 도움이 되는 0개의 로그였습니다. 그래서 기본 디버깅 방법으로 전환합니다. "각 줄에 console.log 넣기"
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);
};


이 변경 사항을 추진한 후 마침내 좋은 디버그 결과를 얻었습니다. 테스트 케이스가 시간 초과되었습니다.

await Promise.all([
    page.waitForNavigation({
      url: /simplesaml\/module\.php\/core\/loginuserpass\.php/,
      waitUtil: 'networkidle',
    }),
    page.click('#login'),
  ]);


@Humphd에서 언급한 한 가지 가능한 문제는 이벤트가 어떤 이유로 해당 페이지에 있었고 탐색하지 않는 것입니다.waitUtil: 'networkidle' 대신 waitUtil: 'load' 로 변경합니다. see reference
그렇다고 해도 소용없었다. 그러나 궁극적인 해결책은 잠재적으로 문제를 해결할 수 있는 1.19.2의 버전1.20.2에서 playwright로 업데이트를 시도하는 것이었습니다.
그것은 올바른 솔루션이었고 종속성의 업데이트였으며 모든 것이 잘 작동합니다.

이것을 디버깅하기 위해 며칠을 보냈고 수정 사항은 종속성 업데이트였습니다. 결국 좋은 경험이었습니다. 때로는 업스트림이 우리를 위해 수정될 때까지 기다려야 합니다.

좋은 웹페이지 즐겨찾기