Skip to content

Commit

Permalink
refactor _handleError, avoid use of await for errors
Browse files Browse the repository at this point in the history
Signed-off-by: Trae Yelovich <trae.yelovich@broadcom.com>
  • Loading branch information
traeok committed Oct 18, 2024
1 parent f23f3f4 commit 3e9fe87
Show file tree
Hide file tree
Showing 9 changed files with 315 additions and 156 deletions.
30 changes: 21 additions & 9 deletions packages/zowe-explorer-api/src/fs/BaseProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,13 @@ import * as path from "path";
import { FsAbstractUtils } from "./utils";
import { Gui } from "../globals/Gui";
import { ZosEncoding } from "../tree";
import { ErrorCorrelator, HandledErrorInfo, ZoweExplorerApiType } from "../utils/ErrorCorrelator";
import { ErrorCorrelator, ZoweExplorerApiType } from "../utils/ErrorCorrelator";

export interface HandleErrorOpts {
allowRetry?: boolean;
retry?: {
fn: (...args: any[]) => any | PromiseLike<any>;
args?: any[];
};
profileType?: string;
apiType?: ZoweExplorerApiType;
templateArgs?: Record<string, string>;
Expand Down Expand Up @@ -426,13 +429,22 @@ export class BaseProvider {
return entry;
}

protected async _handleError(err: Error, opts?: HandleErrorOpts): Promise<HandledErrorInfo> {
return ErrorCorrelator.getInstance().displayError(opts?.apiType ?? ZoweExplorerApiType.All, err, {
additionalContext: opts?.additionalContext,
allowRetry: opts?.allowRetry ?? false,
profileType: opts?.profileType ?? "any",
templateArgs: opts?.templateArgs,
});
protected _handleError(err: Error, opts?: HandleErrorOpts): void {
ErrorCorrelator.getInstance()
.displayError(opts?.apiType ?? ZoweExplorerApiType.All, err, {
additionalContext: opts?.additionalContext,
allowRetry: opts?.retry?.fn != null,
profileType: opts?.profileType ?? "any",
templateArgs: opts?.templateArgs,
})
.then(async ({ userResponse }) => {
if (userResponse === "Retry" && opts?.retry?.fn != null) {
await opts.retry.fn(...(opts?.retry.args ?? []));
}
})
.catch(() => {
throw err;
});
}

protected _lookupAsDirectory(uri: vscode.Uri, silent: boolean): DirEntry {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -673,12 +673,11 @@ describe("stat", () => {
} as any);
const handleErrorSpy = jest.spyOn(DatasetFSProvider.instance as any, "_handleError");
await expect(DatasetFSProvider.instance.stat(testUris.ps)).rejects.toThrow();
expect(handleErrorSpy).toHaveBeenCalledWith(exampleError, {
expect(handleErrorSpy).toHaveBeenCalledWith(exampleError, expect.objectContaining({
additionalContext: `Failed to get stats for data set ${testUris.ps.path}`,
allowRetry: true,
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
});
}));
mvsApiMock.mockRestore();
getInfoForUriMock.mockRestore();
lookupMock.mockRestore();
Expand All @@ -705,12 +704,14 @@ describe("stat", () => {
.spyOn(DatasetFSProvider.instance as any, "_handleError")
.mockResolvedValue({ correlation: { asError: jest.fn() } as any, userResponse: "Retry" });
await DatasetFSProvider.instance.stat(testUris.ps);
expect(handleErrorSpy).toHaveBeenCalledWith(exampleError, {
additionalContext: `Failed to get stats for data set ${testUris.ps.path}`,
allowRetry: true,
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
});
expect(handleErrorSpy).toHaveBeenCalledWith(
exampleError,
expect.objectContaining({
additionalContext: `Failed to get stats for data set ${testUris.ps.path}`,
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
})
);
expect(statSpy).toHaveBeenCalledTimes(2);
expect(statSpy).toHaveBeenCalledWith(testUris.ps);
mvsApiMock.mockRestore();
Expand Down Expand Up @@ -905,12 +906,14 @@ describe("delete", () => {
expect(mockMvsApi.deleteDataSet).toHaveBeenCalledWith(fakePs.name, { responseTimeout: undefined });
expect(_lookupMock).toHaveBeenCalledWith(testUris.ps, false);
expect(_fireSoonMock).toHaveBeenCalled();
expect(handleErrorMock).toHaveBeenCalledWith(sampleError, {
additionalContext: "Failed to delete /USER.DATA.PS",
allowRetry: true,
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
});
expect(handleErrorMock).toHaveBeenCalledWith(
sampleError,
expect.objectContaining({
additionalContext: "Failed to delete /USER.DATA.PS",
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
})
);
expect(fakeSession.entries.has(fakePs.name)).toBe(true);
mvsApiMock.mockRestore();
});
Expand Down Expand Up @@ -994,12 +997,14 @@ describe("rename", () => {
DatasetFSProvider.instance.rename(testUris.pds, testUris.pds.with({ path: "/USER.DATA.PDS2" }), { overwrite: true })
).rejects.toThrow();
expect(mockMvsApi.renameDataSet).toHaveBeenCalledWith("USER.DATA.PDS", "USER.DATA.PDS2");
expect(handleErrorMock).toHaveBeenCalledWith(sampleError, {
additionalContext: "Failed to rename USER.DATA.PDS",
allowRetry: true,
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
});
expect(handleErrorMock).toHaveBeenCalledWith(
sampleError,
expect.objectContaining({
additionalContext: "Failed to rename USER.DATA.PDS",
apiType: ZoweExplorerApiType.Mvs,
profileType: "zosmf",
})
);
_lookupMock.mockRestore();
mvsApiMock.mockRestore();
_lookupParentDirectoryMock.mockRestore();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -912,12 +912,14 @@ describe("delete", () => {
await expect(UssFSProvider.instance.delete(testUris.file, { recursive: false })).rejects.toThrow();
expect(getDelInfoMock).toHaveBeenCalledWith(testUris.file);
expect(deleteMock).toHaveBeenCalledWith(testEntries.file.metadata.path, false);
expect(handleErrorMock).toHaveBeenCalledWith(exampleError, {
additionalContext: "Failed to delete /aFile.txt",
allowRetry: true,
apiType: ZoweExplorerApiType.Uss,
profileType: testEntries.file.metadata.profile.type,
});
expect(handleErrorMock).toHaveBeenCalledWith(
exampleError,
expect.objectContaining({
additionalContext: "Failed to delete /aFile.txt",
apiType: ZoweExplorerApiType.Uss,
profileType: testEntries.file.metadata.profile.type,
})
);
expect(sesEntry.entries.has("aFile.txt")).toBe(true);
expect(sesEntry.size).toBe(1);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -443,10 +443,9 @@ describe("ZoweUSSNode Unit Tests - Function node.rename()", () => {

const newFullPath = "/u/user/newName";
const errMessageMock = jest.spyOn(Gui, "errorMessage").mockImplementation();
const renameMock = jest.spyOn(UssFSProvider.instance, "rename").mockRejectedValueOnce(new Error("Rename error: file is busy"));
const renameMock = jest.spyOn(vscode.workspace.fs, "rename").mockRejectedValueOnce(new Error("Rename error: file is busy"));
await blockMocks.ussDir.rename(newFullPath);

expect(errMessageMock).toHaveBeenCalledWith("Rename error: file is busy");
errMessageMock.mockRestore();
renameMock.mockRestore();
});
Expand Down
140 changes: 140 additions & 0 deletions packages/zowe-explorer/package.nlsowo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
{
"displayName": "Zowe Explorer",
"description": "Extensão VS Code, com tecnologia Zowe CLI, que simplifica a interação com conjuntos de dados de mainframe, arquivos USS e trabalhos",
"viewsContainers.activitybar": "Zowe Explorer",
"viewsContainers.panel.tableView": "Recursos Zowe",
"zowe.zosconsole": "Console do Zowe Explorer z/OS",
"zowe.resources.name": "Recursos Zowe",
"zosconsole": "Console do z/OS",
"zowe.placeholderCommand": "Sinalizador",
"zowe.promptCredentials": "Atualizar credenciais",
"zowe.profileManagement": "Gerenciar perfil",
"zowe.extRefresh": "Atualizar o Zowe Explorer",
"zowe.editHistory": "Editar histórico",
"zowe.ds.explorer": "Conjuntos de Dados",
"zowe.uss.explorer": "Serviços de sistema Unix (USS)",
"zowe.jobs.explorer": "Tarefas",
"uss.createFile": "Criar arquivo",
"uss.createFolder": "Criar diretório",
"uss.deleteNode": "Excluir",
"uss.renameNode": "Renomear",
"diff.overwrite": "Sobrescrever",
"diff.useRemote": "Usar o controle remoto",
"addFavorite": "Incluir em Favoritos",
"removeFavProfile": "Remover perfil dos Favoritos",
"addSession": "Adicionar perfil à visualização de conjuntos de dados",
"createDataset": "Criar novo conjunto de dados",
"createMember": "Criar novo membro",
"showAttributes": "Mostra atributos",
"editAttributes": "Editar Atributos",
"deleteDataset": "Excluir",
"deleteMember": "Excluir",
"allocateLike": "Allocate Like (Novo conjunto de dados com os mesmos atributos)",
"editDataSet": "Editar conjunto de dados",
"editMember": "Editar membro",
"issueMvsCmd": "Emitir comando MVS",
"uploadDialog": "Carregar membro...",
"pattern": "Pesquisar conjuntos de dados",
"startPolling": "Iniciar sondagem",
"stopPolling": "Parar a pesquisa de opinião",
"refreshNode": "Extrair do mainframe",
"refreshDataset": "Atualizar conjunto de dados",
"refreshAll": "Atualizar a visualização dos conjuntos de dados",
"removeFavorite": "Remover favoritos",
"saveSearch": "Incluir em Favoritos",
"submitJcl": "Enviar como JCL",
"submitMember": "Enviar tarefa",
"uss.addSession": "Adicionar perfil ao USS View",
"uss.copyPath": "Copiar caminho",
"uss.copyRelativePath": "Copiar caminho relativo",
"uss.createDirectory": "Criar novo diretório",
"uss.editFile": "Editar arquivo",
"uss.fullPath": "Pesquisar serviços de sistema Unix (USS)",
"uss.refreshAll": "Atualizar a visualização do USS",
"uss.refreshUSS": "Extrair do mainframe",
"uss.refreshDirectory": "Atualizar diretório",
"uss.uploadDialog": "Carregar arquivos...",
"uss.uploadDialogBinary": "Carregar arquivos (binários)...",
"uss.text": "Alternar texto",
"jobs.search": "Procurar Vagas",
"deleteJob": "Excluir tarefa",
"runModifyCommand": "Emitir o comando Modify",
"runStopCommand": "Emitir o comando Stop",
"refreshJobsServer": "Atualizar",
"refreshAllJobs": "Atualizar a visualização de empregos",
"addJobsSession": "Adicionar perfil à visualização de empregos",
"downloadSpool": "Fazer Download de todos",
"downloadSpoolBinary": "Baixar tudo (binário)",
"cancelJobs": "Cancelar Job",
"getJobJcl": "Obter JCL",
"configuration.title": "Zowe Explorer",
"zowe.ds.default.binary": "Valores padrão da criação do conjunto de dados binários",
"zowe.ds.default.c": "Valores padrão da criação do conjunto de dados C",
"zowe.ds.default.classic": "Valores padrão da criação do conjunto de dados Classic",
"zowe.ds.default.pds": "Valores padrão da criação do conjunto de dados particionados",
"zowe.ds.default.extended": "Valores padrão da criação estendida do conjunto de dados particionado",
"zowe.ds.default.ps": "Valores padrão da criação de conjuntos de dados sequenciais",
"zowe.ds.history": "Alternar se os arquivos favoritos persistem localmente",
"zowe.ds.templates": "Modelos de conjuntos de dados salvos do Zowe Explorer",
"zowe.files.logsFolder.path": "Caminho para a pasta de registros do Zowe Explorer",
"zowe.uss.history": "Alternar se os arquivos favoritos do USS persistem localmente",
"zowe.jobs.history": "Alternar se os arquivos favoritos do Jobs persistem localmente",
"zowe.jobs.confirmSubmission": "Exigir confirmação do usuário antes de enviar um trabalho",
"zowe.jobs.confirmSubmission.yourJobs": "Seus trabalhos",
"zowe.jobs.confirmSubmission.otherUserJobs": "Outros empregos de usuário",
"zowe.jobs.confirmSubmission.allJobs": "Todos os empregos",
"zowe.jobs.confirmSubmission.disabled": "Desativado",
"zowe.jobs.confirmSubmission.disabled.desc": "Nenhuma caixa de diálogo de confirmação será exibida ao enviar um trabalho.",
"zowe.jobs.confirmSubmission.yourJobs.desc": "Mostra uma caixa de diálogo de confirmação ao enviar seus trabalhos.",
"zowe.jobs.confirmSubmission.otherUserJobs.desc": "Mostra uma caixa de diálogo de confirmação ao enviar trabalhos de outro usuário.",
"zowe.jobs.confirmSubmission.allJobs.desc": "Mostra uma caixa de diálogo de confirmação ao enviar qualquer trabalho.",
"zowe.settings.oldSettingsMigrated": "Mostra se as configurações do v1 Zowe foram migradas com êxito para as configurações do v2 Zowe",
"zowe.settings.localStorageMigrated": "Mostra se as configurações persistentes foram migradas com êxito para o armazenamento local",
"zowe.logger": "Selecione o nível de registro para o Zowe Explorer. O padrão é INFO.",
"zowe.logger.trace": "RASTREAMENTO",
"zowe.logger.debug": "DEPURAÇÃO",
"zowe.logger.info": "INFORMAÇÃO",
"zowe.logger.warn": "AVISO",
"zowe.logger.error": "ERRO",
"zowe.logger.fatal": "FATAL",
"zowe.logger.trace.description": "Mensagens sobre detalhes minuciosos do comportamento do aplicativo.",
"zowe.logger.debug.description": "Mensagens sobre informações de diagnóstico para solução de problemas.",
"zowe.logger.info.description": "Mensagens sobre operações de rotina do aplicativo.",
"zowe.logger.warn.description": "Mensagens sobre ocorrências potencialmente prejudiciais.",
"zowe.logger.error.description": "Mensagens sobre ocorrências de problemas graves.",
"zowe.logger.fatal.description": "Mensagens sobre eventos de erro catastróficos.",
"zowe.cliLoggerSetting.presented": "Foi solicitado ao usuário que sincronizasse a configuração de registro do Zowe Explorer com a variável de ambiente do Zowe CL.",
"zowe.commands.history": "Alternar se os comandos persistem localmente",
"zowe.automaticProfileValidation": "Permitir a validação automática de perfis.",
"zowe.pollInterval.info": "Intervalo padrão (em milissegundos) ao sondar arquivos de spool.",
"zowe.security.checkForCustomCredentialManagers": "Verifique se há extensões do VS Code instaladas para lidar com credenciais ao ativar o Zowe Explorer",
"zowe.security.secureCredentialsEnabled": "Permitir que as credenciais sejam armazenadas de forma segura. Se estiver desativado e autoStore estiver definido como true, as credenciais do z/OS serão armazenadas como texto simples em zowe.config.json.",
"issueTsoCmd": "Emitir comando TSO",
"deleteProfile": "Excluir um perfil permanentemente...",
"renameDataSet": "Renomear conjunto de dados",
"renameMember": "Renomear membro",
"paste": "Colar",
"hMigrateDataSet": "Migrar Conjunto de Dados",
"hRecallDataSet": "Conjunto de dados de recall",
"showFileErrorDetails": "Mostrar detalhes do erro",
"jobs.refreshJob": "Atualizar trabalho",
"jobs.refreshSpool": "Extrair do mainframe",
"jobsTableView": "Mostrar como tabela",
"manualPoll": "Conteúdo da enquete no Active Editor",
"downloadSingleSpool": "Baixe aqui",
"downloadSingleSpoolBinary": "Download (Binário)",
"all.configInit": "Inicialização do arquivo de configuração da equipe",
"copyFile": "Copiar",
"pasteFile": "Colar",
"jobs.sortBy": "Classificar empregos...",
"jobs.filterBy": "Filtrar trabalhos...",
"ds.filterBy": "Filtrar membros do PDS...",
"ds.sortBy": "Classifique os membros do PDS...",
"issueUnixCmd": "Emitir comando Unix",
"selectForCompare": "Selecionar para comparar",
"copyName": "Nome da cópia",
"compareWithSelected": "Compare com os selecionados",
"compareWithSelectedReadOnly": "Comparar com selecionado (somente leitura)",
"openWithEncoding": "Abrir com codificação",
"zowe.history.deprecationMsg": "As alterações feitas aqui não serão refletidas no Zowe Explorer; use a opção Edit History (Editar histórico) com o botão direito do mouse para acessar as informações do armazenamento local."
}
Loading

0 comments on commit 3e9fe87

Please sign in to comment.